xref: /aosp_15_r20/external/gemmlowp/meta/streams_arm_32.h (revision 5f39d1b313f0528e11bae88b3029b54b9e1033e7)
1*5f39d1b3SJooyung Han // Copyright 2016 The Gemmlowp Authors. All Rights Reserved.
2*5f39d1b3SJooyung Han //
3*5f39d1b3SJooyung Han // Licensed under the Apache License, Version 2.0 (the "License");
4*5f39d1b3SJooyung Han // you may not use this file except in compliance with the License.
5*5f39d1b3SJooyung Han // You may obtain a copy of the License at
6*5f39d1b3SJooyung Han //
7*5f39d1b3SJooyung Han //     http://www.apache.org/licenses/LICENSE-2.0
8*5f39d1b3SJooyung Han //
9*5f39d1b3SJooyung Han // Unless required by applicable law or agreed to in writing, software
10*5f39d1b3SJooyung Han // distributed under the License is distributed on an "AS IS" BASIS,
11*5f39d1b3SJooyung Han // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*5f39d1b3SJooyung Han // See the License for the specific language governing permissions and
13*5f39d1b3SJooyung Han // limitations under the License.
14*5f39d1b3SJooyung Han 
15*5f39d1b3SJooyung Han #ifndef GEMMLOWP_META_STREAMS_ARM_32_H_
16*5f39d1b3SJooyung Han #define GEMMLOWP_META_STREAMS_ARM_32_H_
17*5f39d1b3SJooyung Han 
18*5f39d1b3SJooyung Han #ifdef GEMMLOWP_NEON_32
19*5f39d1b3SJooyung Han 
20*5f39d1b3SJooyung Han #include <cassert>
21*5f39d1b3SJooyung Han #include <cstdint>
22*5f39d1b3SJooyung Han 
23*5f39d1b3SJooyung Han namespace gemmlowp {
24*5f39d1b3SJooyung Han namespace meta {
25*5f39d1b3SJooyung Han 
26*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)27*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 0, RowMajorWithSum>::Pack(
28*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
29*5f39d1b3SJooyung Han #ifdef DEBUG
30*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
31*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
32*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 1, 8, 0, RowMajorWithSum>::Pack()"
33*5f39d1b3SJooyung Han             << std::endl
34*5f39d1b3SJooyung Han             << std::flush;
35*5f39d1b3SJooyung Han #endif
36*5f39d1b3SJooyung Han #endif
37*5f39d1b3SJooyung Han   int params_count_copy = params.count;
38*5f39d1b3SJooyung Han   asm volatile(
39*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
40*5f39d1b3SJooyung Han 
41*5f39d1b3SJooyung Han       "1:"
42*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
43*5f39d1b3SJooyung Han 
44*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x8.
45*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
46*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
47*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
48*5f39d1b3SJooyung Han 
49*5f39d1b3SJooyung Han       "bne 1b\n"
50*5f39d1b3SJooyung Han 
51*5f39d1b3SJooyung Han       // Aggregator Reduction.
52*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
53*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
54*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
55*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
56*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
57*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
58*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
59*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
60*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
61*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
62*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
63*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
64*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
65*5f39d1b3SJooyung Han }
66*5f39d1b3SJooyung Han 
67*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)68*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 1, RowMajorWithSum>::Pack(
69*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
70*5f39d1b3SJooyung Han #ifdef DEBUG
71*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
72*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
73*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 1, 8, 1, RowMajorWithSum>::Pack()"
74*5f39d1b3SJooyung Han             << std::endl
75*5f39d1b3SJooyung Han             << std::flush;
76*5f39d1b3SJooyung Han #endif
77*5f39d1b3SJooyung Han #endif
78*5f39d1b3SJooyung Han   int params_count_copy = params.count;
79*5f39d1b3SJooyung Han   asm volatile(
80*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
81*5f39d1b3SJooyung Han 
82*5f39d1b3SJooyung Han       // Reduce count by leftovers.
83*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
84*5f39d1b3SJooyung Han       "beq 2f\n"
85*5f39d1b3SJooyung Han 
86*5f39d1b3SJooyung Han       "1:"
87*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
88*5f39d1b3SJooyung Han 
89*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x8.
90*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
91*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
92*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
93*5f39d1b3SJooyung Han 
94*5f39d1b3SJooyung Han       "bne 1b\n"
95*5f39d1b3SJooyung Han 
96*5f39d1b3SJooyung Han       "2:"
97*5f39d1b3SJooyung Han 
98*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x1.
99*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
100*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]]!\n"
101*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
102*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
103*5f39d1b3SJooyung Han 
104*5f39d1b3SJooyung Han       // Aggregator Reduction.
105*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
106*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
107*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
108*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
109*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
110*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
111*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
112*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
113*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
114*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
115*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
116*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
117*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
118*5f39d1b3SJooyung Han }
119*5f39d1b3SJooyung Han 
120*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)121*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 2, RowMajorWithSum>::Pack(
122*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
123*5f39d1b3SJooyung Han #ifdef DEBUG
124*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
125*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
126*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 1, 8, 2, RowMajorWithSum>::Pack()"
127*5f39d1b3SJooyung Han             << std::endl
128*5f39d1b3SJooyung Han             << std::flush;
129*5f39d1b3SJooyung Han #endif
130*5f39d1b3SJooyung Han #endif
131*5f39d1b3SJooyung Han   int params_count_copy = params.count;
132*5f39d1b3SJooyung Han   asm volatile(
133*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
134*5f39d1b3SJooyung Han 
135*5f39d1b3SJooyung Han       // Reduce count by leftovers.
136*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
137*5f39d1b3SJooyung Han       "beq 2f\n"
138*5f39d1b3SJooyung Han 
139*5f39d1b3SJooyung Han       "1:"
140*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
141*5f39d1b3SJooyung Han 
142*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x8.
143*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
144*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
145*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
146*5f39d1b3SJooyung Han 
147*5f39d1b3SJooyung Han       "bne 1b\n"
148*5f39d1b3SJooyung Han 
149*5f39d1b3SJooyung Han       "2:"
150*5f39d1b3SJooyung Han 
151*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x2.
152*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
153*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
154*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
155*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
156*5f39d1b3SJooyung Han 
157*5f39d1b3SJooyung Han       // Aggregator Reduction.
158*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
159*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
160*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
161*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
162*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
163*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
164*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
165*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
166*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
167*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
168*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
169*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
170*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
171*5f39d1b3SJooyung Han }
172*5f39d1b3SJooyung Han 
173*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)174*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 3, RowMajorWithSum>::Pack(
175*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
176*5f39d1b3SJooyung Han #ifdef DEBUG
177*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
178*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
179*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 1, 8, 3, RowMajorWithSum>::Pack()"
180*5f39d1b3SJooyung Han             << std::endl
181*5f39d1b3SJooyung Han             << std::flush;
182*5f39d1b3SJooyung Han #endif
183*5f39d1b3SJooyung Han #endif
184*5f39d1b3SJooyung Han   int params_count_copy = params.count;
185*5f39d1b3SJooyung Han   asm volatile(
186*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
187*5f39d1b3SJooyung Han 
188*5f39d1b3SJooyung Han       // Reduce count by leftovers.
189*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
190*5f39d1b3SJooyung Han       "beq 2f\n"
191*5f39d1b3SJooyung Han 
192*5f39d1b3SJooyung Han       "1:"
193*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
194*5f39d1b3SJooyung Han 
195*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x8.
196*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
197*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
198*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
199*5f39d1b3SJooyung Han 
200*5f39d1b3SJooyung Han       "bne 1b\n"
201*5f39d1b3SJooyung Han 
202*5f39d1b3SJooyung Han       "2:"
203*5f39d1b3SJooyung Han 
204*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x3.
205*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
206*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
207*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]]!\n"
208*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
209*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
210*5f39d1b3SJooyung Han 
211*5f39d1b3SJooyung Han       // Aggregator Reduction.
212*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
213*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
214*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
215*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
216*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
217*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
218*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
219*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
220*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
221*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
222*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
223*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
224*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
225*5f39d1b3SJooyung Han }
226*5f39d1b3SJooyung Han 
227*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)228*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 4, RowMajorWithSum>::Pack(
229*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
230*5f39d1b3SJooyung Han #ifdef DEBUG
231*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
232*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
233*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 1, 8, 4, RowMajorWithSum>::Pack()"
234*5f39d1b3SJooyung Han             << std::endl
235*5f39d1b3SJooyung Han             << std::flush;
236*5f39d1b3SJooyung Han #endif
237*5f39d1b3SJooyung Han #endif
238*5f39d1b3SJooyung Han   int params_count_copy = params.count;
239*5f39d1b3SJooyung Han   asm volatile(
240*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
241*5f39d1b3SJooyung Han 
242*5f39d1b3SJooyung Han       // Reduce count by leftovers.
243*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
244*5f39d1b3SJooyung Han       "beq 2f\n"
245*5f39d1b3SJooyung Han 
246*5f39d1b3SJooyung Han       "1:"
247*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
248*5f39d1b3SJooyung Han 
249*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x8.
250*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
251*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
252*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
253*5f39d1b3SJooyung Han 
254*5f39d1b3SJooyung Han       "bne 1b\n"
255*5f39d1b3SJooyung Han 
256*5f39d1b3SJooyung Han       "2:"
257*5f39d1b3SJooyung Han 
258*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x4.
259*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
260*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
261*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
262*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
263*5f39d1b3SJooyung Han 
264*5f39d1b3SJooyung Han       // Aggregator Reduction.
265*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
266*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
267*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
268*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
269*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
270*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
271*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
272*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
273*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
274*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
275*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
276*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
277*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
278*5f39d1b3SJooyung Han }
279*5f39d1b3SJooyung Han 
280*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)281*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 5, RowMajorWithSum>::Pack(
282*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
283*5f39d1b3SJooyung Han #ifdef DEBUG
284*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
285*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
286*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 1, 8, 5, RowMajorWithSum>::Pack()"
287*5f39d1b3SJooyung Han             << std::endl
288*5f39d1b3SJooyung Han             << std::flush;
289*5f39d1b3SJooyung Han #endif
290*5f39d1b3SJooyung Han #endif
291*5f39d1b3SJooyung Han   int params_count_copy = params.count;
292*5f39d1b3SJooyung Han   asm volatile(
293*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
294*5f39d1b3SJooyung Han 
295*5f39d1b3SJooyung Han       // Reduce count by leftovers.
296*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
297*5f39d1b3SJooyung Han       "beq 2f\n"
298*5f39d1b3SJooyung Han 
299*5f39d1b3SJooyung Han       "1:"
300*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
301*5f39d1b3SJooyung Han 
302*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x8.
303*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
304*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
305*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
306*5f39d1b3SJooyung Han 
307*5f39d1b3SJooyung Han       "bne 1b\n"
308*5f39d1b3SJooyung Han 
309*5f39d1b3SJooyung Han       "2:"
310*5f39d1b3SJooyung Han 
311*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x5.
312*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
313*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
314*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]]!\n"
315*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
316*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
317*5f39d1b3SJooyung Han 
318*5f39d1b3SJooyung Han       // Aggregator Reduction.
319*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
320*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
321*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
322*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
323*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
324*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
325*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
326*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
327*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
328*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
329*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
330*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
331*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
332*5f39d1b3SJooyung Han }
333*5f39d1b3SJooyung Han 
334*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)335*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 6, RowMajorWithSum>::Pack(
336*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
337*5f39d1b3SJooyung Han #ifdef DEBUG
338*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
339*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
340*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 1, 8, 6, RowMajorWithSum>::Pack()"
341*5f39d1b3SJooyung Han             << std::endl
342*5f39d1b3SJooyung Han             << std::flush;
343*5f39d1b3SJooyung Han #endif
344*5f39d1b3SJooyung Han #endif
345*5f39d1b3SJooyung Han   int params_count_copy = params.count;
346*5f39d1b3SJooyung Han   asm volatile(
347*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
348*5f39d1b3SJooyung Han 
349*5f39d1b3SJooyung Han       // Reduce count by leftovers.
350*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
351*5f39d1b3SJooyung Han       "beq 2f\n"
352*5f39d1b3SJooyung Han 
353*5f39d1b3SJooyung Han       "1:"
354*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
355*5f39d1b3SJooyung Han 
356*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x8.
357*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
358*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
359*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
360*5f39d1b3SJooyung Han 
361*5f39d1b3SJooyung Han       "bne 1b\n"
362*5f39d1b3SJooyung Han 
363*5f39d1b3SJooyung Han       "2:"
364*5f39d1b3SJooyung Han 
365*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x6.
366*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
367*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
368*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
369*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
370*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
371*5f39d1b3SJooyung Han 
372*5f39d1b3SJooyung Han       // Aggregator Reduction.
373*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
374*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
375*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
376*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
377*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
378*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
379*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
380*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
381*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
382*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
383*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
384*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
385*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
386*5f39d1b3SJooyung Han }
387*5f39d1b3SJooyung Han 
388*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)389*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 7, RowMajorWithSum>::Pack(
390*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
391*5f39d1b3SJooyung Han #ifdef DEBUG
392*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
393*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
394*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 1, 8, 7, RowMajorWithSum>::Pack()"
395*5f39d1b3SJooyung Han             << std::endl
396*5f39d1b3SJooyung Han             << std::flush;
397*5f39d1b3SJooyung Han #endif
398*5f39d1b3SJooyung Han #endif
399*5f39d1b3SJooyung Han   int params_count_copy = params.count;
400*5f39d1b3SJooyung Han   asm volatile(
401*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
402*5f39d1b3SJooyung Han 
403*5f39d1b3SJooyung Han       // Reduce count by leftovers.
404*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
405*5f39d1b3SJooyung Han       "beq 2f\n"
406*5f39d1b3SJooyung Han 
407*5f39d1b3SJooyung Han       "1:"
408*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
409*5f39d1b3SJooyung Han 
410*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x8.
411*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
412*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
413*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
414*5f39d1b3SJooyung Han 
415*5f39d1b3SJooyung Han       "bne 1b\n"
416*5f39d1b3SJooyung Han 
417*5f39d1b3SJooyung Han       "2:"
418*5f39d1b3SJooyung Han 
419*5f39d1b3SJooyung Han       // Load Aggregate Store: 1x7.
420*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
421*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
422*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
423*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]]!\n"
424*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
425*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
426*5f39d1b3SJooyung Han 
427*5f39d1b3SJooyung Han       // Aggregator Reduction.
428*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
429*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
430*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
431*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
432*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
433*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
434*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
435*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
436*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
437*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
438*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
439*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
440*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
441*5f39d1b3SJooyung Han }
442*5f39d1b3SJooyung Han 
443*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)444*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 0, RowMajorWithSum>::Pack(
445*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
446*5f39d1b3SJooyung Han #ifdef DEBUG
447*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
448*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
449*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 2, 8, 0, RowMajorWithSum>::Pack()"
450*5f39d1b3SJooyung Han             << std::endl
451*5f39d1b3SJooyung Han             << std::flush;
452*5f39d1b3SJooyung Han #endif
453*5f39d1b3SJooyung Han #endif
454*5f39d1b3SJooyung Han   int params_count_copy = params.count;
455*5f39d1b3SJooyung Han   asm volatile(
456*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
457*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
458*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
459*5f39d1b3SJooyung Han 
460*5f39d1b3SJooyung Han       "1:"
461*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
462*5f39d1b3SJooyung Han 
463*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x8.
464*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
465*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
466*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
467*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
468*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
469*5f39d1b3SJooyung Han 
470*5f39d1b3SJooyung Han       "bne 1b\n"
471*5f39d1b3SJooyung Han 
472*5f39d1b3SJooyung Han       // Aggregator Reduction.
473*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
474*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
475*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
476*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
477*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
478*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
479*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
480*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
481*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
482*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
483*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
484*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
485*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
486*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
487*5f39d1b3SJooyung Han       : "r0", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc",
488*5f39d1b3SJooyung Han         "memory");
489*5f39d1b3SJooyung Han }
490*5f39d1b3SJooyung Han 
491*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)492*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 1, RowMajorWithSum>::Pack(
493*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
494*5f39d1b3SJooyung Han #ifdef DEBUG
495*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
496*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
497*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 2, 8, 1, RowMajorWithSum>::Pack()"
498*5f39d1b3SJooyung Han             << std::endl
499*5f39d1b3SJooyung Han             << std::flush;
500*5f39d1b3SJooyung Han #endif
501*5f39d1b3SJooyung Han #endif
502*5f39d1b3SJooyung Han   int params_count_copy = params.count;
503*5f39d1b3SJooyung Han   asm volatile(
504*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
505*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
506*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
507*5f39d1b3SJooyung Han 
508*5f39d1b3SJooyung Han       // Reduce count by leftovers.
509*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
510*5f39d1b3SJooyung Han       "beq 2f\n"
511*5f39d1b3SJooyung Han 
512*5f39d1b3SJooyung Han       "1:"
513*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
514*5f39d1b3SJooyung Han 
515*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x8.
516*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
517*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
518*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
519*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
520*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
521*5f39d1b3SJooyung Han 
522*5f39d1b3SJooyung Han       "bne 1b\n"
523*5f39d1b3SJooyung Han 
524*5f39d1b3SJooyung Han       "2:"
525*5f39d1b3SJooyung Han 
526*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x1.
527*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
528*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
529*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]]!\n"
530*5f39d1b3SJooyung Han       "vld1.8 {d1[0]}, [r0]!\n"
531*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
532*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
533*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
534*5f39d1b3SJooyung Han 
535*5f39d1b3SJooyung Han       // Aggregator Reduction.
536*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
537*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
538*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
539*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
540*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
541*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
542*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
543*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
544*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
545*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
546*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
547*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
548*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
549*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
550*5f39d1b3SJooyung Han       : "r0", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc",
551*5f39d1b3SJooyung Han         "memory");
552*5f39d1b3SJooyung Han }
553*5f39d1b3SJooyung Han 
554*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)555*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 2, RowMajorWithSum>::Pack(
556*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
557*5f39d1b3SJooyung Han #ifdef DEBUG
558*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
559*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
560*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 2, 8, 2, RowMajorWithSum>::Pack()"
561*5f39d1b3SJooyung Han             << std::endl
562*5f39d1b3SJooyung Han             << std::flush;
563*5f39d1b3SJooyung Han #endif
564*5f39d1b3SJooyung Han #endif
565*5f39d1b3SJooyung Han   int params_count_copy = params.count;
566*5f39d1b3SJooyung Han   asm volatile(
567*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
568*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
569*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
570*5f39d1b3SJooyung Han 
571*5f39d1b3SJooyung Han       // Reduce count by leftovers.
572*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
573*5f39d1b3SJooyung Han       "beq 2f\n"
574*5f39d1b3SJooyung Han 
575*5f39d1b3SJooyung Han       "1:"
576*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
577*5f39d1b3SJooyung Han 
578*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x8.
579*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
580*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
581*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
582*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
583*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
584*5f39d1b3SJooyung Han 
585*5f39d1b3SJooyung Han       "bne 1b\n"
586*5f39d1b3SJooyung Han 
587*5f39d1b3SJooyung Han       "2:"
588*5f39d1b3SJooyung Han 
589*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x2.
590*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
591*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
592*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
593*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
594*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
595*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
596*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
597*5f39d1b3SJooyung Han 
598*5f39d1b3SJooyung Han       // Aggregator Reduction.
599*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
600*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
601*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
602*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
603*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
604*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
605*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
606*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
607*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
608*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
609*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
610*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
611*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
612*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
613*5f39d1b3SJooyung Han       : "r0", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc",
614*5f39d1b3SJooyung Han         "memory");
615*5f39d1b3SJooyung Han }
616*5f39d1b3SJooyung Han 
617*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)618*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 3, RowMajorWithSum>::Pack(
619*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
620*5f39d1b3SJooyung Han #ifdef DEBUG
621*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
622*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
623*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 2, 8, 3, RowMajorWithSum>::Pack()"
624*5f39d1b3SJooyung Han             << std::endl
625*5f39d1b3SJooyung Han             << std::flush;
626*5f39d1b3SJooyung Han #endif
627*5f39d1b3SJooyung Han #endif
628*5f39d1b3SJooyung Han   int params_count_copy = params.count;
629*5f39d1b3SJooyung Han   asm volatile(
630*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
631*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
632*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
633*5f39d1b3SJooyung Han 
634*5f39d1b3SJooyung Han       // Reduce count by leftovers.
635*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
636*5f39d1b3SJooyung Han       "beq 2f\n"
637*5f39d1b3SJooyung Han 
638*5f39d1b3SJooyung Han       "1:"
639*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
640*5f39d1b3SJooyung Han 
641*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x8.
642*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
643*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
644*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
645*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
646*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
647*5f39d1b3SJooyung Han 
648*5f39d1b3SJooyung Han       "bne 1b\n"
649*5f39d1b3SJooyung Han 
650*5f39d1b3SJooyung Han       "2:"
651*5f39d1b3SJooyung Han 
652*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x3.
653*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
654*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
655*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
656*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]]!\n"
657*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
658*5f39d1b3SJooyung Han       "vld1.8 {d1[2]}, [r0]!\n"
659*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
660*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
661*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
662*5f39d1b3SJooyung Han 
663*5f39d1b3SJooyung Han       // Aggregator Reduction.
664*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
665*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
666*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
667*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
668*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
669*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
670*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
671*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
672*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
673*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
674*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
675*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
676*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
677*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
678*5f39d1b3SJooyung Han       : "r0", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc",
679*5f39d1b3SJooyung Han         "memory");
680*5f39d1b3SJooyung Han }
681*5f39d1b3SJooyung Han 
682*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)683*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 4, RowMajorWithSum>::Pack(
684*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
685*5f39d1b3SJooyung Han #ifdef DEBUG
686*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
687*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
688*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 2, 8, 4, RowMajorWithSum>::Pack()"
689*5f39d1b3SJooyung Han             << std::endl
690*5f39d1b3SJooyung Han             << std::flush;
691*5f39d1b3SJooyung Han #endif
692*5f39d1b3SJooyung Han #endif
693*5f39d1b3SJooyung Han   int params_count_copy = params.count;
694*5f39d1b3SJooyung Han   asm volatile(
695*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
696*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
697*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
698*5f39d1b3SJooyung Han 
699*5f39d1b3SJooyung Han       // Reduce count by leftovers.
700*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
701*5f39d1b3SJooyung Han       "beq 2f\n"
702*5f39d1b3SJooyung Han 
703*5f39d1b3SJooyung Han       "1:"
704*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
705*5f39d1b3SJooyung Han 
706*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x8.
707*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
708*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
709*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
710*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
711*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
712*5f39d1b3SJooyung Han 
713*5f39d1b3SJooyung Han       "bne 1b\n"
714*5f39d1b3SJooyung Han 
715*5f39d1b3SJooyung Han       "2:"
716*5f39d1b3SJooyung Han 
717*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x4.
718*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
719*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
720*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
721*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
722*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
723*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
724*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
725*5f39d1b3SJooyung Han 
726*5f39d1b3SJooyung Han       // Aggregator Reduction.
727*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
728*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
729*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
730*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
731*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
732*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
733*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
734*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
735*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
736*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
737*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
738*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
739*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
740*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
741*5f39d1b3SJooyung Han       : "r0", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc",
742*5f39d1b3SJooyung Han         "memory");
743*5f39d1b3SJooyung Han }
744*5f39d1b3SJooyung Han 
745*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)746*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 5, RowMajorWithSum>::Pack(
747*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
748*5f39d1b3SJooyung Han #ifdef DEBUG
749*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
750*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
751*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 2, 8, 5, RowMajorWithSum>::Pack()"
752*5f39d1b3SJooyung Han             << std::endl
753*5f39d1b3SJooyung Han             << std::flush;
754*5f39d1b3SJooyung Han #endif
755*5f39d1b3SJooyung Han #endif
756*5f39d1b3SJooyung Han   int params_count_copy = params.count;
757*5f39d1b3SJooyung Han   asm volatile(
758*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
759*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
760*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
761*5f39d1b3SJooyung Han 
762*5f39d1b3SJooyung Han       // Reduce count by leftovers.
763*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
764*5f39d1b3SJooyung Han       "beq 2f\n"
765*5f39d1b3SJooyung Han 
766*5f39d1b3SJooyung Han       "1:"
767*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
768*5f39d1b3SJooyung Han 
769*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x8.
770*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
771*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
772*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
773*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
774*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
775*5f39d1b3SJooyung Han 
776*5f39d1b3SJooyung Han       "bne 1b\n"
777*5f39d1b3SJooyung Han 
778*5f39d1b3SJooyung Han       "2:"
779*5f39d1b3SJooyung Han 
780*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x5.
781*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
782*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
783*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
784*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]]!\n"
785*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
786*5f39d1b3SJooyung Han       "vld1.8 {d1[4]}, [r0]!\n"
787*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
788*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
789*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
790*5f39d1b3SJooyung Han 
791*5f39d1b3SJooyung Han       // Aggregator Reduction.
792*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
793*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
794*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
795*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
796*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
797*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
798*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
799*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
800*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
801*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
802*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
803*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
804*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
805*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
806*5f39d1b3SJooyung Han       : "r0", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc",
807*5f39d1b3SJooyung Han         "memory");
808*5f39d1b3SJooyung Han }
809*5f39d1b3SJooyung Han 
810*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)811*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 6, RowMajorWithSum>::Pack(
812*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
813*5f39d1b3SJooyung Han #ifdef DEBUG
814*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
815*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
816*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 2, 8, 6, RowMajorWithSum>::Pack()"
817*5f39d1b3SJooyung Han             << std::endl
818*5f39d1b3SJooyung Han             << std::flush;
819*5f39d1b3SJooyung Han #endif
820*5f39d1b3SJooyung Han #endif
821*5f39d1b3SJooyung Han   int params_count_copy = params.count;
822*5f39d1b3SJooyung Han   asm volatile(
823*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
824*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
825*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
826*5f39d1b3SJooyung Han 
827*5f39d1b3SJooyung Han       // Reduce count by leftovers.
828*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
829*5f39d1b3SJooyung Han       "beq 2f\n"
830*5f39d1b3SJooyung Han 
831*5f39d1b3SJooyung Han       "1:"
832*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
833*5f39d1b3SJooyung Han 
834*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x8.
835*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
836*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
837*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
838*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
839*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
840*5f39d1b3SJooyung Han 
841*5f39d1b3SJooyung Han       "bne 1b\n"
842*5f39d1b3SJooyung Han 
843*5f39d1b3SJooyung Han       "2:"
844*5f39d1b3SJooyung Han 
845*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x6.
846*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
847*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
848*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
849*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
850*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
851*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
852*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
853*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
854*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
855*5f39d1b3SJooyung Han 
856*5f39d1b3SJooyung Han       // Aggregator Reduction.
857*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
858*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
859*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
860*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
861*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
862*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
863*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
864*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
865*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
866*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
867*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
868*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
869*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
870*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
871*5f39d1b3SJooyung Han       : "r0", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc",
872*5f39d1b3SJooyung Han         "memory");
873*5f39d1b3SJooyung Han }
874*5f39d1b3SJooyung Han 
875*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)876*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 7, RowMajorWithSum>::Pack(
877*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
878*5f39d1b3SJooyung Han #ifdef DEBUG
879*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
880*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
881*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 2, 8, 7, RowMajorWithSum>::Pack()"
882*5f39d1b3SJooyung Han             << std::endl
883*5f39d1b3SJooyung Han             << std::flush;
884*5f39d1b3SJooyung Han #endif
885*5f39d1b3SJooyung Han #endif
886*5f39d1b3SJooyung Han   int params_count_copy = params.count;
887*5f39d1b3SJooyung Han   asm volatile(
888*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
889*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
890*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
891*5f39d1b3SJooyung Han 
892*5f39d1b3SJooyung Han       // Reduce count by leftovers.
893*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
894*5f39d1b3SJooyung Han       "beq 2f\n"
895*5f39d1b3SJooyung Han 
896*5f39d1b3SJooyung Han       "1:"
897*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
898*5f39d1b3SJooyung Han 
899*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x8.
900*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
901*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
902*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
903*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
904*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
905*5f39d1b3SJooyung Han 
906*5f39d1b3SJooyung Han       "bne 1b\n"
907*5f39d1b3SJooyung Han 
908*5f39d1b3SJooyung Han       "2:"
909*5f39d1b3SJooyung Han 
910*5f39d1b3SJooyung Han       // Load Aggregate Store: 2x7.
911*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
912*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
913*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
914*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
915*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]]!\n"
916*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
917*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
918*5f39d1b3SJooyung Han       "vld1.8 {d1[6]}, [r0]!\n"
919*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
920*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
921*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
922*5f39d1b3SJooyung Han 
923*5f39d1b3SJooyung Han       // Aggregator Reduction.
924*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
925*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
926*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
927*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
928*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
929*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
930*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
931*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
932*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
933*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
934*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
935*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
936*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
937*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
938*5f39d1b3SJooyung Han       : "r0", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc",
939*5f39d1b3SJooyung Han         "memory");
940*5f39d1b3SJooyung Han }
941*5f39d1b3SJooyung Han 
942*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)943*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 0, RowMajorWithSum>::Pack(
944*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
945*5f39d1b3SJooyung Han #ifdef DEBUG
946*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
947*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
948*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 3, 8, 0, RowMajorWithSum>::Pack()"
949*5f39d1b3SJooyung Han             << std::endl
950*5f39d1b3SJooyung Han             << std::flush;
951*5f39d1b3SJooyung Han #endif
952*5f39d1b3SJooyung Han #endif
953*5f39d1b3SJooyung Han   int params_count_copy = params.count;
954*5f39d1b3SJooyung Han   asm volatile(
955*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
956*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
957*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
958*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
959*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
960*5f39d1b3SJooyung Han 
961*5f39d1b3SJooyung Han       "1:"
962*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
963*5f39d1b3SJooyung Han 
964*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x8.
965*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
966*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
967*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
968*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
969*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
970*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
971*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
972*5f39d1b3SJooyung Han 
973*5f39d1b3SJooyung Han       "bne 1b\n"
974*5f39d1b3SJooyung Han 
975*5f39d1b3SJooyung Han       // Aggregator Reduction.
976*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
977*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
978*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
979*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
980*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
981*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
982*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
983*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
984*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
985*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
986*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
987*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
988*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
989*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
990*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
991*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
992*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
993*5f39d1b3SJooyung Han       : "r0", "r1", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20",
994*5f39d1b3SJooyung Han         "d21", "cc", "memory");
995*5f39d1b3SJooyung Han }
996*5f39d1b3SJooyung Han 
997*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)998*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 1, RowMajorWithSum>::Pack(
999*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1000*5f39d1b3SJooyung Han #ifdef DEBUG
1001*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1002*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1003*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 3, 8, 1, RowMajorWithSum>::Pack()"
1004*5f39d1b3SJooyung Han             << std::endl
1005*5f39d1b3SJooyung Han             << std::flush;
1006*5f39d1b3SJooyung Han #endif
1007*5f39d1b3SJooyung Han #endif
1008*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1009*5f39d1b3SJooyung Han   asm volatile(
1010*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1011*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1012*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1013*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1014*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1015*5f39d1b3SJooyung Han 
1016*5f39d1b3SJooyung Han       // Reduce count by leftovers.
1017*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
1018*5f39d1b3SJooyung Han       "beq 2f\n"
1019*5f39d1b3SJooyung Han 
1020*5f39d1b3SJooyung Han       "1:"
1021*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1022*5f39d1b3SJooyung Han 
1023*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x8.
1024*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1025*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1026*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1027*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1028*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1029*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1030*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1031*5f39d1b3SJooyung Han 
1032*5f39d1b3SJooyung Han       "bne 1b\n"
1033*5f39d1b3SJooyung Han 
1034*5f39d1b3SJooyung Han       "2:"
1035*5f39d1b3SJooyung Han 
1036*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x1.
1037*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
1038*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
1039*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
1040*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]]!\n"
1041*5f39d1b3SJooyung Han       "vld1.8 {d1[0]}, [r0]!\n"
1042*5f39d1b3SJooyung Han       "vld1.8 {d2[0]}, [r1]!\n"
1043*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1044*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1045*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1046*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1047*5f39d1b3SJooyung Han 
1048*5f39d1b3SJooyung Han       // Aggregator Reduction.
1049*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1050*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1051*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1052*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1053*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1054*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1055*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1056*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1057*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1058*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
1059*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1060*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1061*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
1062*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1063*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1064*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1065*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1066*5f39d1b3SJooyung Han       : "r0", "r1", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20",
1067*5f39d1b3SJooyung Han         "d21", "cc", "memory");
1068*5f39d1b3SJooyung Han }
1069*5f39d1b3SJooyung Han 
1070*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)1071*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 2, RowMajorWithSum>::Pack(
1072*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1073*5f39d1b3SJooyung Han #ifdef DEBUG
1074*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1075*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1076*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 3, 8, 2, RowMajorWithSum>::Pack()"
1077*5f39d1b3SJooyung Han             << std::endl
1078*5f39d1b3SJooyung Han             << std::flush;
1079*5f39d1b3SJooyung Han #endif
1080*5f39d1b3SJooyung Han #endif
1081*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1082*5f39d1b3SJooyung Han   asm volatile(
1083*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1084*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1085*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1086*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1087*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1088*5f39d1b3SJooyung Han 
1089*5f39d1b3SJooyung Han       // Reduce count by leftovers.
1090*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
1091*5f39d1b3SJooyung Han       "beq 2f\n"
1092*5f39d1b3SJooyung Han 
1093*5f39d1b3SJooyung Han       "1:"
1094*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1095*5f39d1b3SJooyung Han 
1096*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x8.
1097*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1098*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1099*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1100*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1101*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1102*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1103*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1104*5f39d1b3SJooyung Han 
1105*5f39d1b3SJooyung Han       "bne 1b\n"
1106*5f39d1b3SJooyung Han 
1107*5f39d1b3SJooyung Han       "2:"
1108*5f39d1b3SJooyung Han 
1109*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x2.
1110*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
1111*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
1112*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
1113*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
1114*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
1115*5f39d1b3SJooyung Han       "vld1.16 {d2[0]}, [r1]!\n"
1116*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1117*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1118*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1119*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1120*5f39d1b3SJooyung Han 
1121*5f39d1b3SJooyung Han       // Aggregator Reduction.
1122*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1123*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1124*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1125*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1126*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1127*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1128*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1129*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1130*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1131*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
1132*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1133*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1134*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
1135*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1136*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1137*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1138*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1139*5f39d1b3SJooyung Han       : "r0", "r1", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20",
1140*5f39d1b3SJooyung Han         "d21", "cc", "memory");
1141*5f39d1b3SJooyung Han }
1142*5f39d1b3SJooyung Han 
1143*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)1144*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 3, RowMajorWithSum>::Pack(
1145*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1146*5f39d1b3SJooyung Han #ifdef DEBUG
1147*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1148*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1149*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 3, 8, 3, RowMajorWithSum>::Pack()"
1150*5f39d1b3SJooyung Han             << std::endl
1151*5f39d1b3SJooyung Han             << std::flush;
1152*5f39d1b3SJooyung Han #endif
1153*5f39d1b3SJooyung Han #endif
1154*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1155*5f39d1b3SJooyung Han   asm volatile(
1156*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1157*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1158*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1159*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1160*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1161*5f39d1b3SJooyung Han 
1162*5f39d1b3SJooyung Han       // Reduce count by leftovers.
1163*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
1164*5f39d1b3SJooyung Han       "beq 2f\n"
1165*5f39d1b3SJooyung Han 
1166*5f39d1b3SJooyung Han       "1:"
1167*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1168*5f39d1b3SJooyung Han 
1169*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x8.
1170*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1171*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1172*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1173*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1174*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1175*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1176*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1177*5f39d1b3SJooyung Han 
1178*5f39d1b3SJooyung Han       "bne 1b\n"
1179*5f39d1b3SJooyung Han 
1180*5f39d1b3SJooyung Han       "2:"
1181*5f39d1b3SJooyung Han 
1182*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x3.
1183*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
1184*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
1185*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
1186*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
1187*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]]!\n"
1188*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
1189*5f39d1b3SJooyung Han       "vld1.8 {d1[2]}, [r0]!\n"
1190*5f39d1b3SJooyung Han       "vld1.16 {d2[0]}, [r1]!\n"
1191*5f39d1b3SJooyung Han       "vld1.8 {d2[2]}, [r1]!\n"
1192*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1193*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1194*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1195*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1196*5f39d1b3SJooyung Han 
1197*5f39d1b3SJooyung Han       // Aggregator Reduction.
1198*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1199*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1200*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1201*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1202*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1203*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1204*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1205*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1206*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1207*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
1208*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1209*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1210*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
1211*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1212*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1213*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1214*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1215*5f39d1b3SJooyung Han       : "r0", "r1", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20",
1216*5f39d1b3SJooyung Han         "d21", "cc", "memory");
1217*5f39d1b3SJooyung Han }
1218*5f39d1b3SJooyung Han 
1219*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)1220*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 4, RowMajorWithSum>::Pack(
1221*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1222*5f39d1b3SJooyung Han #ifdef DEBUG
1223*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1224*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1225*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 3, 8, 4, RowMajorWithSum>::Pack()"
1226*5f39d1b3SJooyung Han             << std::endl
1227*5f39d1b3SJooyung Han             << std::flush;
1228*5f39d1b3SJooyung Han #endif
1229*5f39d1b3SJooyung Han #endif
1230*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1231*5f39d1b3SJooyung Han   asm volatile(
1232*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1233*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1234*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1235*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1236*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1237*5f39d1b3SJooyung Han 
1238*5f39d1b3SJooyung Han       // Reduce count by leftovers.
1239*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
1240*5f39d1b3SJooyung Han       "beq 2f\n"
1241*5f39d1b3SJooyung Han 
1242*5f39d1b3SJooyung Han       "1:"
1243*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1244*5f39d1b3SJooyung Han 
1245*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x8.
1246*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1247*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1248*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1249*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1250*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1251*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1252*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1253*5f39d1b3SJooyung Han 
1254*5f39d1b3SJooyung Han       "bne 1b\n"
1255*5f39d1b3SJooyung Han 
1256*5f39d1b3SJooyung Han       "2:"
1257*5f39d1b3SJooyung Han 
1258*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x4.
1259*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
1260*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
1261*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
1262*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
1263*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
1264*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
1265*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1266*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1267*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1268*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1269*5f39d1b3SJooyung Han 
1270*5f39d1b3SJooyung Han       // Aggregator Reduction.
1271*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1272*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1273*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1274*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1275*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1276*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1277*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1278*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1279*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1280*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
1281*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1282*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1283*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
1284*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1285*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1286*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1287*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1288*5f39d1b3SJooyung Han       : "r0", "r1", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20",
1289*5f39d1b3SJooyung Han         "d21", "cc", "memory");
1290*5f39d1b3SJooyung Han }
1291*5f39d1b3SJooyung Han 
1292*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)1293*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 5, RowMajorWithSum>::Pack(
1294*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1295*5f39d1b3SJooyung Han #ifdef DEBUG
1296*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1297*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1298*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 3, 8, 5, RowMajorWithSum>::Pack()"
1299*5f39d1b3SJooyung Han             << std::endl
1300*5f39d1b3SJooyung Han             << std::flush;
1301*5f39d1b3SJooyung Han #endif
1302*5f39d1b3SJooyung Han #endif
1303*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1304*5f39d1b3SJooyung Han   asm volatile(
1305*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1306*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1307*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1308*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1309*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1310*5f39d1b3SJooyung Han 
1311*5f39d1b3SJooyung Han       // Reduce count by leftovers.
1312*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
1313*5f39d1b3SJooyung Han       "beq 2f\n"
1314*5f39d1b3SJooyung Han 
1315*5f39d1b3SJooyung Han       "1:"
1316*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1317*5f39d1b3SJooyung Han 
1318*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x8.
1319*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1320*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1321*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1322*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1323*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1324*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1325*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1326*5f39d1b3SJooyung Han 
1327*5f39d1b3SJooyung Han       "bne 1b\n"
1328*5f39d1b3SJooyung Han 
1329*5f39d1b3SJooyung Han       "2:"
1330*5f39d1b3SJooyung Han 
1331*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x5.
1332*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
1333*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
1334*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
1335*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
1336*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]]!\n"
1337*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
1338*5f39d1b3SJooyung Han       "vld1.8 {d1[4]}, [r0]!\n"
1339*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
1340*5f39d1b3SJooyung Han       "vld1.8 {d2[4]}, [r1]!\n"
1341*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1342*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1343*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1344*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1345*5f39d1b3SJooyung Han 
1346*5f39d1b3SJooyung Han       // Aggregator Reduction.
1347*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1348*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1349*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1350*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1351*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1352*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1353*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1354*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1355*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1356*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
1357*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1358*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1359*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
1360*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1361*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1362*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1363*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1364*5f39d1b3SJooyung Han       : "r0", "r1", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20",
1365*5f39d1b3SJooyung Han         "d21", "cc", "memory");
1366*5f39d1b3SJooyung Han }
1367*5f39d1b3SJooyung Han 
1368*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)1369*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 6, RowMajorWithSum>::Pack(
1370*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1371*5f39d1b3SJooyung Han #ifdef DEBUG
1372*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1373*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1374*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 3, 8, 6, RowMajorWithSum>::Pack()"
1375*5f39d1b3SJooyung Han             << std::endl
1376*5f39d1b3SJooyung Han             << std::flush;
1377*5f39d1b3SJooyung Han #endif
1378*5f39d1b3SJooyung Han #endif
1379*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1380*5f39d1b3SJooyung Han   asm volatile(
1381*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1382*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1383*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1384*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1385*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1386*5f39d1b3SJooyung Han 
1387*5f39d1b3SJooyung Han       // Reduce count by leftovers.
1388*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
1389*5f39d1b3SJooyung Han       "beq 2f\n"
1390*5f39d1b3SJooyung Han 
1391*5f39d1b3SJooyung Han       "1:"
1392*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1393*5f39d1b3SJooyung Han 
1394*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x8.
1395*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1396*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1397*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1398*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1399*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1400*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1401*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1402*5f39d1b3SJooyung Han 
1403*5f39d1b3SJooyung Han       "bne 1b\n"
1404*5f39d1b3SJooyung Han 
1405*5f39d1b3SJooyung Han       "2:"
1406*5f39d1b3SJooyung Han 
1407*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x6.
1408*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
1409*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
1410*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
1411*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
1412*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
1413*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
1414*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
1415*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
1416*5f39d1b3SJooyung Han       "vld1.16 {d2[2]}, [r1]!\n"
1417*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1418*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1419*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1420*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1421*5f39d1b3SJooyung Han 
1422*5f39d1b3SJooyung Han       // Aggregator Reduction.
1423*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1424*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1425*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1426*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1427*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1428*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1429*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1430*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1431*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1432*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
1433*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1434*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1435*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
1436*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1437*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1438*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1439*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1440*5f39d1b3SJooyung Han       : "r0", "r1", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20",
1441*5f39d1b3SJooyung Han         "d21", "cc", "memory");
1442*5f39d1b3SJooyung Han }
1443*5f39d1b3SJooyung Han 
1444*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)1445*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 7, RowMajorWithSum>::Pack(
1446*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1447*5f39d1b3SJooyung Han #ifdef DEBUG
1448*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1449*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1450*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 3, 8, 7, RowMajorWithSum>::Pack()"
1451*5f39d1b3SJooyung Han             << std::endl
1452*5f39d1b3SJooyung Han             << std::flush;
1453*5f39d1b3SJooyung Han #endif
1454*5f39d1b3SJooyung Han #endif
1455*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1456*5f39d1b3SJooyung Han   asm volatile(
1457*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1458*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1459*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1460*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1461*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1462*5f39d1b3SJooyung Han 
1463*5f39d1b3SJooyung Han       // Reduce count by leftovers.
1464*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
1465*5f39d1b3SJooyung Han       "beq 2f\n"
1466*5f39d1b3SJooyung Han 
1467*5f39d1b3SJooyung Han       "1:"
1468*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1469*5f39d1b3SJooyung Han 
1470*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x8.
1471*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1472*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1473*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1474*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1475*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1476*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1477*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1478*5f39d1b3SJooyung Han 
1479*5f39d1b3SJooyung Han       "bne 1b\n"
1480*5f39d1b3SJooyung Han 
1481*5f39d1b3SJooyung Han       "2:"
1482*5f39d1b3SJooyung Han 
1483*5f39d1b3SJooyung Han       // Load Aggregate Store: 3x7.
1484*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
1485*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
1486*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
1487*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
1488*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
1489*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]]!\n"
1490*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
1491*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
1492*5f39d1b3SJooyung Han       "vld1.8 {d1[6]}, [r0]!\n"
1493*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
1494*5f39d1b3SJooyung Han       "vld1.16 {d2[2]}, [r1]!\n"
1495*5f39d1b3SJooyung Han       "vld1.8 {d2[6]}, [r1]!\n"
1496*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1497*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1498*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1499*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
1500*5f39d1b3SJooyung Han 
1501*5f39d1b3SJooyung Han       // Aggregator Reduction.
1502*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1503*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1504*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1505*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1506*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1507*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1508*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1509*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1510*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1511*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
1512*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1513*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1514*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
1515*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1516*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1517*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1518*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1519*5f39d1b3SJooyung Han       : "r0", "r1", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20",
1520*5f39d1b3SJooyung Han         "d21", "cc", "memory");
1521*5f39d1b3SJooyung Han }
1522*5f39d1b3SJooyung Han 
1523*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)1524*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 0, RowMajorWithSum>::Pack(
1525*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1526*5f39d1b3SJooyung Han #ifdef DEBUG
1527*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1528*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1529*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 4, 8, 0, RowMajorWithSum>::Pack()"
1530*5f39d1b3SJooyung Han             << std::endl
1531*5f39d1b3SJooyung Han             << std::flush;
1532*5f39d1b3SJooyung Han #endif
1533*5f39d1b3SJooyung Han #endif
1534*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1535*5f39d1b3SJooyung Han   asm volatile(
1536*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1537*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1538*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
1539*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1540*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1541*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1542*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
1543*5f39d1b3SJooyung Han 
1544*5f39d1b3SJooyung Han       "1:"
1545*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1546*5f39d1b3SJooyung Han 
1547*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x8.
1548*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1549*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1550*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1551*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
1552*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1553*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1554*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1555*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
1556*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
1557*5f39d1b3SJooyung Han 
1558*5f39d1b3SJooyung Han       "bne 1b\n"
1559*5f39d1b3SJooyung Han 
1560*5f39d1b3SJooyung Han       // Aggregator Reduction.
1561*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1562*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1563*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1564*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1565*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1566*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
1567*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1568*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1569*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1570*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
1571*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1572*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
1573*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1574*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1575*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
1576*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1577*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1578*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1579*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1580*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19",
1581*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "cc", "memory");
1582*5f39d1b3SJooyung Han }
1583*5f39d1b3SJooyung Han 
1584*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)1585*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 1, RowMajorWithSum>::Pack(
1586*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1587*5f39d1b3SJooyung Han #ifdef DEBUG
1588*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1589*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1590*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 4, 8, 1, RowMajorWithSum>::Pack()"
1591*5f39d1b3SJooyung Han             << std::endl
1592*5f39d1b3SJooyung Han             << std::flush;
1593*5f39d1b3SJooyung Han #endif
1594*5f39d1b3SJooyung Han #endif
1595*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1596*5f39d1b3SJooyung Han   asm volatile(
1597*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1598*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1599*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
1600*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1601*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1602*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1603*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
1604*5f39d1b3SJooyung Han 
1605*5f39d1b3SJooyung Han       // Reduce count by leftovers.
1606*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
1607*5f39d1b3SJooyung Han       "beq 2f\n"
1608*5f39d1b3SJooyung Han 
1609*5f39d1b3SJooyung Han       "1:"
1610*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1611*5f39d1b3SJooyung Han 
1612*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x8.
1613*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1614*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1615*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1616*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
1617*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1618*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1619*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1620*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
1621*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
1622*5f39d1b3SJooyung Han 
1623*5f39d1b3SJooyung Han       "bne 1b\n"
1624*5f39d1b3SJooyung Han 
1625*5f39d1b3SJooyung Han       "2:"
1626*5f39d1b3SJooyung Han 
1627*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x1.
1628*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
1629*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
1630*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
1631*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
1632*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]]!\n"
1633*5f39d1b3SJooyung Han       "vld1.8 {d1[0]}, [r0]!\n"
1634*5f39d1b3SJooyung Han       "vld1.8 {d2[0]}, [r1]!\n"
1635*5f39d1b3SJooyung Han       "vld1.8 {d3[0]}, [r2]!\n"
1636*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1637*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1638*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1639*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
1640*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
1641*5f39d1b3SJooyung Han 
1642*5f39d1b3SJooyung Han       // Aggregator Reduction.
1643*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1644*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1645*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1646*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1647*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1648*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
1649*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1650*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1651*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1652*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
1653*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1654*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
1655*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1656*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1657*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
1658*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1659*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1660*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1661*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1662*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19",
1663*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "cc", "memory");
1664*5f39d1b3SJooyung Han }
1665*5f39d1b3SJooyung Han 
1666*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)1667*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 2, RowMajorWithSum>::Pack(
1668*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1669*5f39d1b3SJooyung Han #ifdef DEBUG
1670*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1671*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1672*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 4, 8, 2, RowMajorWithSum>::Pack()"
1673*5f39d1b3SJooyung Han             << std::endl
1674*5f39d1b3SJooyung Han             << std::flush;
1675*5f39d1b3SJooyung Han #endif
1676*5f39d1b3SJooyung Han #endif
1677*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1678*5f39d1b3SJooyung Han   asm volatile(
1679*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1680*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1681*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
1682*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1683*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1684*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1685*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
1686*5f39d1b3SJooyung Han 
1687*5f39d1b3SJooyung Han       // Reduce count by leftovers.
1688*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
1689*5f39d1b3SJooyung Han       "beq 2f\n"
1690*5f39d1b3SJooyung Han 
1691*5f39d1b3SJooyung Han       "1:"
1692*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1693*5f39d1b3SJooyung Han 
1694*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x8.
1695*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1696*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1697*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1698*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
1699*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1700*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1701*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1702*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
1703*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
1704*5f39d1b3SJooyung Han 
1705*5f39d1b3SJooyung Han       "bne 1b\n"
1706*5f39d1b3SJooyung Han 
1707*5f39d1b3SJooyung Han       "2:"
1708*5f39d1b3SJooyung Han 
1709*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x2.
1710*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
1711*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
1712*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
1713*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
1714*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
1715*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
1716*5f39d1b3SJooyung Han       "vld1.16 {d2[0]}, [r1]!\n"
1717*5f39d1b3SJooyung Han       "vld1.16 {d3[0]}, [r2]!\n"
1718*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1719*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1720*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1721*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
1722*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
1723*5f39d1b3SJooyung Han 
1724*5f39d1b3SJooyung Han       // Aggregator Reduction.
1725*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1726*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1727*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1728*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1729*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1730*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
1731*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1732*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1733*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1734*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
1735*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1736*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
1737*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1738*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1739*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
1740*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1741*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1742*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1743*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1744*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19",
1745*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "cc", "memory");
1746*5f39d1b3SJooyung Han }
1747*5f39d1b3SJooyung Han 
1748*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)1749*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 3, RowMajorWithSum>::Pack(
1750*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1751*5f39d1b3SJooyung Han #ifdef DEBUG
1752*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1753*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1754*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 4, 8, 3, RowMajorWithSum>::Pack()"
1755*5f39d1b3SJooyung Han             << std::endl
1756*5f39d1b3SJooyung Han             << std::flush;
1757*5f39d1b3SJooyung Han #endif
1758*5f39d1b3SJooyung Han #endif
1759*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1760*5f39d1b3SJooyung Han   asm volatile(
1761*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1762*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1763*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
1764*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1765*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1766*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1767*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
1768*5f39d1b3SJooyung Han 
1769*5f39d1b3SJooyung Han       // Reduce count by leftovers.
1770*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
1771*5f39d1b3SJooyung Han       "beq 2f\n"
1772*5f39d1b3SJooyung Han 
1773*5f39d1b3SJooyung Han       "1:"
1774*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1775*5f39d1b3SJooyung Han 
1776*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x8.
1777*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1778*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1779*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1780*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
1781*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1782*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1783*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1784*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
1785*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
1786*5f39d1b3SJooyung Han 
1787*5f39d1b3SJooyung Han       "bne 1b\n"
1788*5f39d1b3SJooyung Han 
1789*5f39d1b3SJooyung Han       "2:"
1790*5f39d1b3SJooyung Han 
1791*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x3.
1792*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
1793*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
1794*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
1795*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
1796*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
1797*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]]!\n"
1798*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
1799*5f39d1b3SJooyung Han       "vld1.8 {d1[2]}, [r0]!\n"
1800*5f39d1b3SJooyung Han       "vld1.16 {d2[0]}, [r1]!\n"
1801*5f39d1b3SJooyung Han       "vld1.8 {d2[2]}, [r1]!\n"
1802*5f39d1b3SJooyung Han       "vld1.16 {d3[0]}, [r2]!\n"
1803*5f39d1b3SJooyung Han       "vld1.8 {d3[2]}, [r2]!\n"
1804*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1805*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1806*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1807*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
1808*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
1809*5f39d1b3SJooyung Han 
1810*5f39d1b3SJooyung Han       // Aggregator Reduction.
1811*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1812*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1813*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1814*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1815*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1816*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
1817*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1818*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1819*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1820*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
1821*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1822*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
1823*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1824*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1825*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
1826*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1827*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1828*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1829*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1830*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19",
1831*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "cc", "memory");
1832*5f39d1b3SJooyung Han }
1833*5f39d1b3SJooyung Han 
1834*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)1835*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 4, RowMajorWithSum>::Pack(
1836*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1837*5f39d1b3SJooyung Han #ifdef DEBUG
1838*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1839*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1840*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 4, 8, 4, RowMajorWithSum>::Pack()"
1841*5f39d1b3SJooyung Han             << std::endl
1842*5f39d1b3SJooyung Han             << std::flush;
1843*5f39d1b3SJooyung Han #endif
1844*5f39d1b3SJooyung Han #endif
1845*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1846*5f39d1b3SJooyung Han   asm volatile(
1847*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1848*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1849*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
1850*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1851*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1852*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1853*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
1854*5f39d1b3SJooyung Han 
1855*5f39d1b3SJooyung Han       // Reduce count by leftovers.
1856*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
1857*5f39d1b3SJooyung Han       "beq 2f\n"
1858*5f39d1b3SJooyung Han 
1859*5f39d1b3SJooyung Han       "1:"
1860*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1861*5f39d1b3SJooyung Han 
1862*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x8.
1863*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1864*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1865*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1866*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
1867*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1868*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1869*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1870*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
1871*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
1872*5f39d1b3SJooyung Han 
1873*5f39d1b3SJooyung Han       "bne 1b\n"
1874*5f39d1b3SJooyung Han 
1875*5f39d1b3SJooyung Han       "2:"
1876*5f39d1b3SJooyung Han 
1877*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x4.
1878*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
1879*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
1880*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
1881*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
1882*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
1883*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
1884*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
1885*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
1886*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1887*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1888*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1889*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
1890*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
1891*5f39d1b3SJooyung Han 
1892*5f39d1b3SJooyung Han       // Aggregator Reduction.
1893*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1894*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1895*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1896*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1897*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1898*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
1899*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1900*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1901*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1902*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
1903*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1904*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
1905*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1906*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1907*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
1908*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1909*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1910*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1911*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1912*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19",
1913*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "cc", "memory");
1914*5f39d1b3SJooyung Han }
1915*5f39d1b3SJooyung Han 
1916*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)1917*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 5, RowMajorWithSum>::Pack(
1918*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
1919*5f39d1b3SJooyung Han #ifdef DEBUG
1920*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
1921*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
1922*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 4, 8, 5, RowMajorWithSum>::Pack()"
1923*5f39d1b3SJooyung Han             << std::endl
1924*5f39d1b3SJooyung Han             << std::flush;
1925*5f39d1b3SJooyung Han #endif
1926*5f39d1b3SJooyung Han #endif
1927*5f39d1b3SJooyung Han   int params_count_copy = params.count;
1928*5f39d1b3SJooyung Han   asm volatile(
1929*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
1930*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
1931*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
1932*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
1933*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
1934*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
1935*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
1936*5f39d1b3SJooyung Han 
1937*5f39d1b3SJooyung Han       // Reduce count by leftovers.
1938*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
1939*5f39d1b3SJooyung Han       "beq 2f\n"
1940*5f39d1b3SJooyung Han 
1941*5f39d1b3SJooyung Han       "1:"
1942*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
1943*5f39d1b3SJooyung Han 
1944*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x8.
1945*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
1946*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
1947*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
1948*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
1949*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1950*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1951*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1952*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
1953*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
1954*5f39d1b3SJooyung Han 
1955*5f39d1b3SJooyung Han       "bne 1b\n"
1956*5f39d1b3SJooyung Han 
1957*5f39d1b3SJooyung Han       "2:"
1958*5f39d1b3SJooyung Han 
1959*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x5.
1960*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
1961*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
1962*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
1963*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
1964*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
1965*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]]!\n"
1966*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
1967*5f39d1b3SJooyung Han       "vld1.8 {d1[4]}, [r0]!\n"
1968*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
1969*5f39d1b3SJooyung Han       "vld1.8 {d2[4]}, [r1]!\n"
1970*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
1971*5f39d1b3SJooyung Han       "vld1.8 {d3[4]}, [r2]!\n"
1972*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
1973*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
1974*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
1975*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
1976*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
1977*5f39d1b3SJooyung Han 
1978*5f39d1b3SJooyung Han       // Aggregator Reduction.
1979*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
1980*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
1981*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
1982*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
1983*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
1984*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
1985*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
1986*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
1987*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
1988*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
1989*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
1990*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
1991*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
1992*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
1993*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
1994*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
1995*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
1996*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
1997*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
1998*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19",
1999*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "cc", "memory");
2000*5f39d1b3SJooyung Han }
2001*5f39d1b3SJooyung Han 
2002*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)2003*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 6, RowMajorWithSum>::Pack(
2004*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
2005*5f39d1b3SJooyung Han #ifdef DEBUG
2006*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
2007*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
2008*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 4, 8, 6, RowMajorWithSum>::Pack()"
2009*5f39d1b3SJooyung Han             << std::endl
2010*5f39d1b3SJooyung Han             << std::flush;
2011*5f39d1b3SJooyung Han #endif
2012*5f39d1b3SJooyung Han #endif
2013*5f39d1b3SJooyung Han   int params_count_copy = params.count;
2014*5f39d1b3SJooyung Han   asm volatile(
2015*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
2016*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
2017*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
2018*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
2019*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
2020*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
2021*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
2022*5f39d1b3SJooyung Han 
2023*5f39d1b3SJooyung Han       // Reduce count by leftovers.
2024*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
2025*5f39d1b3SJooyung Han       "beq 2f\n"
2026*5f39d1b3SJooyung Han 
2027*5f39d1b3SJooyung Han       "1:"
2028*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
2029*5f39d1b3SJooyung Han 
2030*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x8.
2031*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
2032*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
2033*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
2034*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
2035*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2036*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2037*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2038*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2039*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
2040*5f39d1b3SJooyung Han 
2041*5f39d1b3SJooyung Han       "bne 1b\n"
2042*5f39d1b3SJooyung Han 
2043*5f39d1b3SJooyung Han       "2:"
2044*5f39d1b3SJooyung Han 
2045*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x6.
2046*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
2047*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
2048*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
2049*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
2050*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
2051*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
2052*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
2053*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
2054*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
2055*5f39d1b3SJooyung Han       "vld1.16 {d2[2]}, [r1]!\n"
2056*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
2057*5f39d1b3SJooyung Han       "vld1.16 {d3[2]}, [r2]!\n"
2058*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2059*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2060*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2061*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2062*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
2063*5f39d1b3SJooyung Han 
2064*5f39d1b3SJooyung Han       // Aggregator Reduction.
2065*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
2066*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
2067*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
2068*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
2069*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
2070*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
2071*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
2072*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
2073*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
2074*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
2075*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
2076*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
2077*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
2078*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
2079*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
2080*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
2081*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
2082*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
2083*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
2084*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19",
2085*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "cc", "memory");
2086*5f39d1b3SJooyung Han }
2087*5f39d1b3SJooyung Han 
2088*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)2089*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 7, RowMajorWithSum>::Pack(
2090*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
2091*5f39d1b3SJooyung Han #ifdef DEBUG
2092*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
2093*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
2094*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 4, 8, 7, RowMajorWithSum>::Pack()"
2095*5f39d1b3SJooyung Han             << std::endl
2096*5f39d1b3SJooyung Han             << std::flush;
2097*5f39d1b3SJooyung Han #endif
2098*5f39d1b3SJooyung Han #endif
2099*5f39d1b3SJooyung Han   int params_count_copy = params.count;
2100*5f39d1b3SJooyung Han   asm volatile(
2101*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
2102*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
2103*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
2104*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
2105*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
2106*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
2107*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
2108*5f39d1b3SJooyung Han 
2109*5f39d1b3SJooyung Han       // Reduce count by leftovers.
2110*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
2111*5f39d1b3SJooyung Han       "beq 2f\n"
2112*5f39d1b3SJooyung Han 
2113*5f39d1b3SJooyung Han       "1:"
2114*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
2115*5f39d1b3SJooyung Han 
2116*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x8.
2117*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
2118*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
2119*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
2120*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
2121*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2122*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2123*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2124*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2125*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
2126*5f39d1b3SJooyung Han 
2127*5f39d1b3SJooyung Han       "bne 1b\n"
2128*5f39d1b3SJooyung Han 
2129*5f39d1b3SJooyung Han       "2:"
2130*5f39d1b3SJooyung Han 
2131*5f39d1b3SJooyung Han       // Load Aggregate Store: 4x7.
2132*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
2133*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
2134*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
2135*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
2136*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
2137*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
2138*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]]!\n"
2139*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
2140*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
2141*5f39d1b3SJooyung Han       "vld1.8 {d1[6]}, [r0]!\n"
2142*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
2143*5f39d1b3SJooyung Han       "vld1.16 {d2[2]}, [r1]!\n"
2144*5f39d1b3SJooyung Han       "vld1.8 {d2[6]}, [r1]!\n"
2145*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
2146*5f39d1b3SJooyung Han       "vld1.16 {d3[2]}, [r2]!\n"
2147*5f39d1b3SJooyung Han       "vld1.8 {d3[6]}, [r2]!\n"
2148*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2149*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2150*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2151*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2152*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
2153*5f39d1b3SJooyung Han 
2154*5f39d1b3SJooyung Han       // Aggregator Reduction.
2155*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
2156*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
2157*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
2158*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
2159*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
2160*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
2161*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
2162*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
2163*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
2164*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
2165*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
2166*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
2167*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
2168*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
2169*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
2170*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
2171*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
2172*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
2173*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
2174*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19",
2175*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "cc", "memory");
2176*5f39d1b3SJooyung Han }
2177*5f39d1b3SJooyung Han 
2178*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)2179*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 0, RowMajorWithSum>::Pack(
2180*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
2181*5f39d1b3SJooyung Han #ifdef DEBUG
2182*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
2183*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
2184*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 5, 8, 0, RowMajorWithSum>::Pack()"
2185*5f39d1b3SJooyung Han             << std::endl
2186*5f39d1b3SJooyung Han             << std::flush;
2187*5f39d1b3SJooyung Han #endif
2188*5f39d1b3SJooyung Han #endif
2189*5f39d1b3SJooyung Han   int params_count_copy = params.count;
2190*5f39d1b3SJooyung Han   asm volatile(
2191*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
2192*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
2193*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
2194*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
2195*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
2196*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
2197*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
2198*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
2199*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
2200*5f39d1b3SJooyung Han 
2201*5f39d1b3SJooyung Han       "1:"
2202*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
2203*5f39d1b3SJooyung Han 
2204*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x8.
2205*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
2206*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
2207*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
2208*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
2209*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
2210*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2211*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2212*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2213*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2214*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2215*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2216*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2217*5f39d1b3SJooyung Han 
2218*5f39d1b3SJooyung Han       "bne 1b\n"
2219*5f39d1b3SJooyung Han 
2220*5f39d1b3SJooyung Han       // Aggregator Reduction.
2221*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
2222*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
2223*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
2224*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
2225*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
2226*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
2227*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
2228*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
2229*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
2230*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
2231*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
2232*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
2233*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
2234*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
2235*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
2236*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
2237*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
2238*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
2239*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
2240*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
2241*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
2242*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
2243*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
2244*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
2245*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "d0", "d1", "d2", "d3", "d4", "d16", "d17",
2246*5f39d1b3SJooyung Han         "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "cc", "memory");
2247*5f39d1b3SJooyung Han }
2248*5f39d1b3SJooyung Han 
2249*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)2250*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 1, RowMajorWithSum>::Pack(
2251*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
2252*5f39d1b3SJooyung Han #ifdef DEBUG
2253*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
2254*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
2255*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 5, 8, 1, RowMajorWithSum>::Pack()"
2256*5f39d1b3SJooyung Han             << std::endl
2257*5f39d1b3SJooyung Han             << std::flush;
2258*5f39d1b3SJooyung Han #endif
2259*5f39d1b3SJooyung Han #endif
2260*5f39d1b3SJooyung Han   int params_count_copy = params.count;
2261*5f39d1b3SJooyung Han   asm volatile(
2262*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
2263*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
2264*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
2265*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
2266*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
2267*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
2268*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
2269*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
2270*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
2271*5f39d1b3SJooyung Han 
2272*5f39d1b3SJooyung Han       // Reduce count by leftovers.
2273*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
2274*5f39d1b3SJooyung Han       "beq 2f\n"
2275*5f39d1b3SJooyung Han 
2276*5f39d1b3SJooyung Han       "1:"
2277*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
2278*5f39d1b3SJooyung Han 
2279*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x8.
2280*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
2281*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
2282*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
2283*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
2284*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
2285*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2286*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2287*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2288*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2289*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2290*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2291*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2292*5f39d1b3SJooyung Han 
2293*5f39d1b3SJooyung Han       "bne 1b\n"
2294*5f39d1b3SJooyung Han 
2295*5f39d1b3SJooyung Han       "2:"
2296*5f39d1b3SJooyung Han 
2297*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x1.
2298*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
2299*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
2300*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
2301*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
2302*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
2303*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]]!\n"
2304*5f39d1b3SJooyung Han       "vld1.8 {d1[0]}, [r0]!\n"
2305*5f39d1b3SJooyung Han       "vld1.8 {d2[0]}, [r1]!\n"
2306*5f39d1b3SJooyung Han       "vld1.8 {d3[0]}, [r2]!\n"
2307*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [r3]!\n"
2308*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2309*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2310*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2311*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2312*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2313*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2314*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2315*5f39d1b3SJooyung Han 
2316*5f39d1b3SJooyung Han       // Aggregator Reduction.
2317*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
2318*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
2319*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
2320*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
2321*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
2322*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
2323*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
2324*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
2325*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
2326*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
2327*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
2328*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
2329*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
2330*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
2331*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
2332*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
2333*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
2334*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
2335*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
2336*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
2337*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
2338*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
2339*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
2340*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
2341*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "d0", "d1", "d2", "d3", "d4", "d16", "d17",
2342*5f39d1b3SJooyung Han         "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "cc", "memory");
2343*5f39d1b3SJooyung Han }
2344*5f39d1b3SJooyung Han 
2345*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)2346*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 2, RowMajorWithSum>::Pack(
2347*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
2348*5f39d1b3SJooyung Han #ifdef DEBUG
2349*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
2350*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
2351*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 5, 8, 2, RowMajorWithSum>::Pack()"
2352*5f39d1b3SJooyung Han             << std::endl
2353*5f39d1b3SJooyung Han             << std::flush;
2354*5f39d1b3SJooyung Han #endif
2355*5f39d1b3SJooyung Han #endif
2356*5f39d1b3SJooyung Han   int params_count_copy = params.count;
2357*5f39d1b3SJooyung Han   asm volatile(
2358*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
2359*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
2360*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
2361*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
2362*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
2363*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
2364*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
2365*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
2366*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
2367*5f39d1b3SJooyung Han 
2368*5f39d1b3SJooyung Han       // Reduce count by leftovers.
2369*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
2370*5f39d1b3SJooyung Han       "beq 2f\n"
2371*5f39d1b3SJooyung Han 
2372*5f39d1b3SJooyung Han       "1:"
2373*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
2374*5f39d1b3SJooyung Han 
2375*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x8.
2376*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
2377*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
2378*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
2379*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
2380*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
2381*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2382*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2383*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2384*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2385*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2386*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2387*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2388*5f39d1b3SJooyung Han 
2389*5f39d1b3SJooyung Han       "bne 1b\n"
2390*5f39d1b3SJooyung Han 
2391*5f39d1b3SJooyung Han       "2:"
2392*5f39d1b3SJooyung Han 
2393*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x2.
2394*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
2395*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
2396*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
2397*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
2398*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
2399*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
2400*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
2401*5f39d1b3SJooyung Han       "vld1.16 {d2[0]}, [r1]!\n"
2402*5f39d1b3SJooyung Han       "vld1.16 {d3[0]}, [r2]!\n"
2403*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [r3]!\n"
2404*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2405*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2406*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2407*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2408*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2409*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2410*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2411*5f39d1b3SJooyung Han 
2412*5f39d1b3SJooyung Han       // Aggregator Reduction.
2413*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
2414*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
2415*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
2416*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
2417*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
2418*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
2419*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
2420*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
2421*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
2422*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
2423*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
2424*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
2425*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
2426*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
2427*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
2428*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
2429*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
2430*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
2431*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
2432*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
2433*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
2434*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
2435*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
2436*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
2437*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "d0", "d1", "d2", "d3", "d4", "d16", "d17",
2438*5f39d1b3SJooyung Han         "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "cc", "memory");
2439*5f39d1b3SJooyung Han }
2440*5f39d1b3SJooyung Han 
2441*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)2442*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 3, RowMajorWithSum>::Pack(
2443*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
2444*5f39d1b3SJooyung Han #ifdef DEBUG
2445*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
2446*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
2447*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 5, 8, 3, RowMajorWithSum>::Pack()"
2448*5f39d1b3SJooyung Han             << std::endl
2449*5f39d1b3SJooyung Han             << std::flush;
2450*5f39d1b3SJooyung Han #endif
2451*5f39d1b3SJooyung Han #endif
2452*5f39d1b3SJooyung Han   int params_count_copy = params.count;
2453*5f39d1b3SJooyung Han   asm volatile(
2454*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
2455*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
2456*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
2457*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
2458*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
2459*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
2460*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
2461*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
2462*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
2463*5f39d1b3SJooyung Han 
2464*5f39d1b3SJooyung Han       // Reduce count by leftovers.
2465*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
2466*5f39d1b3SJooyung Han       "beq 2f\n"
2467*5f39d1b3SJooyung Han 
2468*5f39d1b3SJooyung Han       "1:"
2469*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
2470*5f39d1b3SJooyung Han 
2471*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x8.
2472*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
2473*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
2474*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
2475*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
2476*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
2477*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2478*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2479*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2480*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2481*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2482*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2483*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2484*5f39d1b3SJooyung Han 
2485*5f39d1b3SJooyung Han       "bne 1b\n"
2486*5f39d1b3SJooyung Han 
2487*5f39d1b3SJooyung Han       "2:"
2488*5f39d1b3SJooyung Han 
2489*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x3.
2490*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
2491*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
2492*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
2493*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
2494*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
2495*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
2496*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]]!\n"
2497*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
2498*5f39d1b3SJooyung Han       "vld1.8 {d1[2]}, [r0]!\n"
2499*5f39d1b3SJooyung Han       "vld1.16 {d2[0]}, [r1]!\n"
2500*5f39d1b3SJooyung Han       "vld1.8 {d2[2]}, [r1]!\n"
2501*5f39d1b3SJooyung Han       "vld1.16 {d3[0]}, [r2]!\n"
2502*5f39d1b3SJooyung Han       "vld1.8 {d3[2]}, [r2]!\n"
2503*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [r3]!\n"
2504*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [r3]!\n"
2505*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2506*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2507*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2508*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2509*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2510*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2511*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2512*5f39d1b3SJooyung Han 
2513*5f39d1b3SJooyung Han       // Aggregator Reduction.
2514*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
2515*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
2516*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
2517*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
2518*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
2519*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
2520*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
2521*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
2522*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
2523*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
2524*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
2525*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
2526*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
2527*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
2528*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
2529*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
2530*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
2531*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
2532*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
2533*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
2534*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
2535*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
2536*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
2537*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
2538*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "d0", "d1", "d2", "d3", "d4", "d16", "d17",
2539*5f39d1b3SJooyung Han         "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "cc", "memory");
2540*5f39d1b3SJooyung Han }
2541*5f39d1b3SJooyung Han 
2542*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)2543*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 4, RowMajorWithSum>::Pack(
2544*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
2545*5f39d1b3SJooyung Han #ifdef DEBUG
2546*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
2547*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
2548*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 5, 8, 4, RowMajorWithSum>::Pack()"
2549*5f39d1b3SJooyung Han             << std::endl
2550*5f39d1b3SJooyung Han             << std::flush;
2551*5f39d1b3SJooyung Han #endif
2552*5f39d1b3SJooyung Han #endif
2553*5f39d1b3SJooyung Han   int params_count_copy = params.count;
2554*5f39d1b3SJooyung Han   asm volatile(
2555*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
2556*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
2557*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
2558*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
2559*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
2560*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
2561*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
2562*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
2563*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
2564*5f39d1b3SJooyung Han 
2565*5f39d1b3SJooyung Han       // Reduce count by leftovers.
2566*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
2567*5f39d1b3SJooyung Han       "beq 2f\n"
2568*5f39d1b3SJooyung Han 
2569*5f39d1b3SJooyung Han       "1:"
2570*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
2571*5f39d1b3SJooyung Han 
2572*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x8.
2573*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
2574*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
2575*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
2576*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
2577*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
2578*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2579*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2580*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2581*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2582*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2583*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2584*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2585*5f39d1b3SJooyung Han 
2586*5f39d1b3SJooyung Han       "bne 1b\n"
2587*5f39d1b3SJooyung Han 
2588*5f39d1b3SJooyung Han       "2:"
2589*5f39d1b3SJooyung Han 
2590*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x4.
2591*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
2592*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
2593*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
2594*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
2595*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
2596*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
2597*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
2598*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
2599*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
2600*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
2601*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2602*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2603*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2604*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2605*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2606*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2607*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2608*5f39d1b3SJooyung Han 
2609*5f39d1b3SJooyung Han       // Aggregator Reduction.
2610*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
2611*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
2612*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
2613*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
2614*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
2615*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
2616*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
2617*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
2618*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
2619*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
2620*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
2621*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
2622*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
2623*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
2624*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
2625*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
2626*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
2627*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
2628*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
2629*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
2630*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
2631*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
2632*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
2633*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
2634*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "d0", "d1", "d2", "d3", "d4", "d16", "d17",
2635*5f39d1b3SJooyung Han         "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "cc", "memory");
2636*5f39d1b3SJooyung Han }
2637*5f39d1b3SJooyung Han 
2638*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)2639*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 5, RowMajorWithSum>::Pack(
2640*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
2641*5f39d1b3SJooyung Han #ifdef DEBUG
2642*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
2643*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
2644*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 5, 8, 5, RowMajorWithSum>::Pack()"
2645*5f39d1b3SJooyung Han             << std::endl
2646*5f39d1b3SJooyung Han             << std::flush;
2647*5f39d1b3SJooyung Han #endif
2648*5f39d1b3SJooyung Han #endif
2649*5f39d1b3SJooyung Han   int params_count_copy = params.count;
2650*5f39d1b3SJooyung Han   asm volatile(
2651*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
2652*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
2653*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
2654*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
2655*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
2656*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
2657*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
2658*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
2659*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
2660*5f39d1b3SJooyung Han 
2661*5f39d1b3SJooyung Han       // Reduce count by leftovers.
2662*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
2663*5f39d1b3SJooyung Han       "beq 2f\n"
2664*5f39d1b3SJooyung Han 
2665*5f39d1b3SJooyung Han       "1:"
2666*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
2667*5f39d1b3SJooyung Han 
2668*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x8.
2669*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
2670*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
2671*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
2672*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
2673*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
2674*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2675*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2676*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2677*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2678*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2679*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2680*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2681*5f39d1b3SJooyung Han 
2682*5f39d1b3SJooyung Han       "bne 1b\n"
2683*5f39d1b3SJooyung Han 
2684*5f39d1b3SJooyung Han       "2:"
2685*5f39d1b3SJooyung Han 
2686*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x5.
2687*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
2688*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
2689*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
2690*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
2691*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
2692*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
2693*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]]!\n"
2694*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
2695*5f39d1b3SJooyung Han       "vld1.8 {d1[4]}, [r0]!\n"
2696*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
2697*5f39d1b3SJooyung Han       "vld1.8 {d2[4]}, [r1]!\n"
2698*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
2699*5f39d1b3SJooyung Han       "vld1.8 {d3[4]}, [r2]!\n"
2700*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
2701*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [r3]!\n"
2702*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2703*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2704*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2705*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2706*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2707*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2708*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2709*5f39d1b3SJooyung Han 
2710*5f39d1b3SJooyung Han       // Aggregator Reduction.
2711*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
2712*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
2713*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
2714*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
2715*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
2716*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
2717*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
2718*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
2719*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
2720*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
2721*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
2722*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
2723*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
2724*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
2725*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
2726*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
2727*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
2728*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
2729*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
2730*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
2731*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
2732*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
2733*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
2734*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
2735*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "d0", "d1", "d2", "d3", "d4", "d16", "d17",
2736*5f39d1b3SJooyung Han         "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "cc", "memory");
2737*5f39d1b3SJooyung Han }
2738*5f39d1b3SJooyung Han 
2739*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)2740*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 6, RowMajorWithSum>::Pack(
2741*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
2742*5f39d1b3SJooyung Han #ifdef DEBUG
2743*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
2744*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
2745*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 5, 8, 6, RowMajorWithSum>::Pack()"
2746*5f39d1b3SJooyung Han             << std::endl
2747*5f39d1b3SJooyung Han             << std::flush;
2748*5f39d1b3SJooyung Han #endif
2749*5f39d1b3SJooyung Han #endif
2750*5f39d1b3SJooyung Han   int params_count_copy = params.count;
2751*5f39d1b3SJooyung Han   asm volatile(
2752*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
2753*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
2754*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
2755*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
2756*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
2757*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
2758*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
2759*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
2760*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
2761*5f39d1b3SJooyung Han 
2762*5f39d1b3SJooyung Han       // Reduce count by leftovers.
2763*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
2764*5f39d1b3SJooyung Han       "beq 2f\n"
2765*5f39d1b3SJooyung Han 
2766*5f39d1b3SJooyung Han       "1:"
2767*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
2768*5f39d1b3SJooyung Han 
2769*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x8.
2770*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
2771*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
2772*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
2773*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
2774*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
2775*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2776*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2777*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2778*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2779*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2780*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2781*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2782*5f39d1b3SJooyung Han 
2783*5f39d1b3SJooyung Han       "bne 1b\n"
2784*5f39d1b3SJooyung Han 
2785*5f39d1b3SJooyung Han       "2:"
2786*5f39d1b3SJooyung Han 
2787*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x6.
2788*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
2789*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
2790*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
2791*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
2792*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
2793*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
2794*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
2795*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
2796*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
2797*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
2798*5f39d1b3SJooyung Han       "vld1.16 {d2[2]}, [r1]!\n"
2799*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
2800*5f39d1b3SJooyung Han       "vld1.16 {d3[2]}, [r2]!\n"
2801*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
2802*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [r3]!\n"
2803*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2804*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2805*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2806*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2807*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2808*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2809*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2810*5f39d1b3SJooyung Han 
2811*5f39d1b3SJooyung Han       // Aggregator Reduction.
2812*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
2813*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
2814*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
2815*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
2816*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
2817*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
2818*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
2819*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
2820*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
2821*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
2822*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
2823*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
2824*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
2825*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
2826*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
2827*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
2828*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
2829*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
2830*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
2831*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
2832*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
2833*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
2834*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
2835*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
2836*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "d0", "d1", "d2", "d3", "d4", "d16", "d17",
2837*5f39d1b3SJooyung Han         "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "cc", "memory");
2838*5f39d1b3SJooyung Han }
2839*5f39d1b3SJooyung Han 
2840*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)2841*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 7, RowMajorWithSum>::Pack(
2842*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
2843*5f39d1b3SJooyung Han #ifdef DEBUG
2844*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
2845*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
2846*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 5, 8, 7, RowMajorWithSum>::Pack()"
2847*5f39d1b3SJooyung Han             << std::endl
2848*5f39d1b3SJooyung Han             << std::flush;
2849*5f39d1b3SJooyung Han #endif
2850*5f39d1b3SJooyung Han #endif
2851*5f39d1b3SJooyung Han   int params_count_copy = params.count;
2852*5f39d1b3SJooyung Han   asm volatile(
2853*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
2854*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
2855*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
2856*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
2857*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
2858*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
2859*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
2860*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
2861*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
2862*5f39d1b3SJooyung Han 
2863*5f39d1b3SJooyung Han       // Reduce count by leftovers.
2864*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
2865*5f39d1b3SJooyung Han       "beq 2f\n"
2866*5f39d1b3SJooyung Han 
2867*5f39d1b3SJooyung Han       "1:"
2868*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
2869*5f39d1b3SJooyung Han 
2870*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x8.
2871*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
2872*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
2873*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
2874*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
2875*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
2876*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2877*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2878*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2879*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2880*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2881*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2882*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2883*5f39d1b3SJooyung Han 
2884*5f39d1b3SJooyung Han       "bne 1b\n"
2885*5f39d1b3SJooyung Han 
2886*5f39d1b3SJooyung Han       "2:"
2887*5f39d1b3SJooyung Han 
2888*5f39d1b3SJooyung Han       // Load Aggregate Store: 5x7.
2889*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
2890*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
2891*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
2892*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
2893*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
2894*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
2895*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
2896*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]]!\n"
2897*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
2898*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
2899*5f39d1b3SJooyung Han       "vld1.8 {d1[6]}, [r0]!\n"
2900*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
2901*5f39d1b3SJooyung Han       "vld1.16 {d2[2]}, [r1]!\n"
2902*5f39d1b3SJooyung Han       "vld1.8 {d2[6]}, [r1]!\n"
2903*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
2904*5f39d1b3SJooyung Han       "vld1.16 {d3[2]}, [r2]!\n"
2905*5f39d1b3SJooyung Han       "vld1.8 {d3[6]}, [r2]!\n"
2906*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
2907*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [r3]!\n"
2908*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [r3]!\n"
2909*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2910*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2911*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2912*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2913*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2914*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
2915*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
2916*5f39d1b3SJooyung Han 
2917*5f39d1b3SJooyung Han       // Aggregator Reduction.
2918*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
2919*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
2920*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
2921*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
2922*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
2923*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
2924*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
2925*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
2926*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
2927*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
2928*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
2929*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
2930*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
2931*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
2932*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
2933*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
2934*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
2935*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
2936*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
2937*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
2938*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
2939*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
2940*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
2941*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
2942*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "d0", "d1", "d2", "d3", "d4", "d16", "d17",
2943*5f39d1b3SJooyung Han         "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "cc", "memory");
2944*5f39d1b3SJooyung Han }
2945*5f39d1b3SJooyung Han 
2946*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)2947*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 0, RowMajorWithSum>::Pack(
2948*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
2949*5f39d1b3SJooyung Han #ifdef DEBUG
2950*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
2951*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
2952*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 6, 8, 0, RowMajorWithSum>::Pack()"
2953*5f39d1b3SJooyung Han             << std::endl
2954*5f39d1b3SJooyung Han             << std::flush;
2955*5f39d1b3SJooyung Han #endif
2956*5f39d1b3SJooyung Han #endif
2957*5f39d1b3SJooyung Han   int params_count_copy = params.count;
2958*5f39d1b3SJooyung Han   asm volatile(
2959*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
2960*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
2961*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
2962*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
2963*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
2964*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
2965*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
2966*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
2967*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
2968*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
2969*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
2970*5f39d1b3SJooyung Han 
2971*5f39d1b3SJooyung Han       "1:"
2972*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
2973*5f39d1b3SJooyung Han 
2974*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x8.
2975*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
2976*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
2977*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
2978*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
2979*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
2980*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
2981*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
2982*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
2983*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
2984*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
2985*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
2986*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
2987*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
2988*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
2989*5f39d1b3SJooyung Han 
2990*5f39d1b3SJooyung Han       "bne 1b\n"
2991*5f39d1b3SJooyung Han 
2992*5f39d1b3SJooyung Han       // Aggregator Reduction.
2993*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
2994*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
2995*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
2996*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
2997*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
2998*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
2999*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
3000*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
3001*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
3002*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
3003*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
3004*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
3005*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
3006*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
3007*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
3008*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
3009*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
3010*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
3011*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
3012*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
3013*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
3014*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
3015*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
3016*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
3017*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
3018*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
3019*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "d0", "d1", "d2", "d3", "d4", "d5", "d16",
3020*5f39d1b3SJooyung Han         "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26",
3021*5f39d1b3SJooyung Han         "d27", "cc", "memory");
3022*5f39d1b3SJooyung Han }
3023*5f39d1b3SJooyung Han 
3024*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)3025*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 1, RowMajorWithSum>::Pack(
3026*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
3027*5f39d1b3SJooyung Han #ifdef DEBUG
3028*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
3029*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
3030*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 6, 8, 1, RowMajorWithSum>::Pack()"
3031*5f39d1b3SJooyung Han             << std::endl
3032*5f39d1b3SJooyung Han             << std::flush;
3033*5f39d1b3SJooyung Han #endif
3034*5f39d1b3SJooyung Han #endif
3035*5f39d1b3SJooyung Han   int params_count_copy = params.count;
3036*5f39d1b3SJooyung Han   asm volatile(
3037*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
3038*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
3039*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
3040*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
3041*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
3042*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
3043*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
3044*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
3045*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
3046*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
3047*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
3048*5f39d1b3SJooyung Han 
3049*5f39d1b3SJooyung Han       // Reduce count by leftovers.
3050*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
3051*5f39d1b3SJooyung Han       "beq 2f\n"
3052*5f39d1b3SJooyung Han 
3053*5f39d1b3SJooyung Han       "1:"
3054*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
3055*5f39d1b3SJooyung Han 
3056*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x8.
3057*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
3058*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
3059*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
3060*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
3061*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
3062*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
3063*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3064*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3065*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3066*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3067*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3068*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3069*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3070*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3071*5f39d1b3SJooyung Han 
3072*5f39d1b3SJooyung Han       "bne 1b\n"
3073*5f39d1b3SJooyung Han 
3074*5f39d1b3SJooyung Han       "2:"
3075*5f39d1b3SJooyung Han 
3076*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x1.
3077*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
3078*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
3079*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
3080*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
3081*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
3082*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
3083*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]]!\n"
3084*5f39d1b3SJooyung Han       "vld1.8 {d1[0]}, [r0]!\n"
3085*5f39d1b3SJooyung Han       "vld1.8 {d2[0]}, [r1]!\n"
3086*5f39d1b3SJooyung Han       "vld1.8 {d3[0]}, [r2]!\n"
3087*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [r3]!\n"
3088*5f39d1b3SJooyung Han       "vld1.8 {d5[0]}, [r4]!\n"
3089*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3090*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3091*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3092*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3093*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3094*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3095*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3096*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3097*5f39d1b3SJooyung Han 
3098*5f39d1b3SJooyung Han       // Aggregator Reduction.
3099*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
3100*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
3101*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
3102*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
3103*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
3104*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
3105*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
3106*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
3107*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
3108*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
3109*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
3110*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
3111*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
3112*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
3113*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
3114*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
3115*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
3116*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
3117*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
3118*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
3119*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
3120*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
3121*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
3122*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
3123*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
3124*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
3125*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "d0", "d1", "d2", "d3", "d4", "d5", "d16",
3126*5f39d1b3SJooyung Han         "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26",
3127*5f39d1b3SJooyung Han         "d27", "cc", "memory");
3128*5f39d1b3SJooyung Han }
3129*5f39d1b3SJooyung Han 
3130*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)3131*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 2, RowMajorWithSum>::Pack(
3132*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
3133*5f39d1b3SJooyung Han #ifdef DEBUG
3134*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
3135*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
3136*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 6, 8, 2, RowMajorWithSum>::Pack()"
3137*5f39d1b3SJooyung Han             << std::endl
3138*5f39d1b3SJooyung Han             << std::flush;
3139*5f39d1b3SJooyung Han #endif
3140*5f39d1b3SJooyung Han #endif
3141*5f39d1b3SJooyung Han   int params_count_copy = params.count;
3142*5f39d1b3SJooyung Han   asm volatile(
3143*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
3144*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
3145*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
3146*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
3147*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
3148*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
3149*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
3150*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
3151*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
3152*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
3153*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
3154*5f39d1b3SJooyung Han 
3155*5f39d1b3SJooyung Han       // Reduce count by leftovers.
3156*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
3157*5f39d1b3SJooyung Han       "beq 2f\n"
3158*5f39d1b3SJooyung Han 
3159*5f39d1b3SJooyung Han       "1:"
3160*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
3161*5f39d1b3SJooyung Han 
3162*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x8.
3163*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
3164*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
3165*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
3166*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
3167*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
3168*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
3169*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3170*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3171*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3172*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3173*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3174*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3175*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3176*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3177*5f39d1b3SJooyung Han 
3178*5f39d1b3SJooyung Han       "bne 1b\n"
3179*5f39d1b3SJooyung Han 
3180*5f39d1b3SJooyung Han       "2:"
3181*5f39d1b3SJooyung Han 
3182*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x2.
3183*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
3184*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
3185*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
3186*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
3187*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
3188*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
3189*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
3190*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
3191*5f39d1b3SJooyung Han       "vld1.16 {d2[0]}, [r1]!\n"
3192*5f39d1b3SJooyung Han       "vld1.16 {d3[0]}, [r2]!\n"
3193*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [r3]!\n"
3194*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [r4]!\n"
3195*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3196*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3197*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3198*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3199*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3200*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3201*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3202*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3203*5f39d1b3SJooyung Han 
3204*5f39d1b3SJooyung Han       // Aggregator Reduction.
3205*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
3206*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
3207*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
3208*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
3209*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
3210*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
3211*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
3212*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
3213*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
3214*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
3215*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
3216*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
3217*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
3218*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
3219*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
3220*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
3221*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
3222*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
3223*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
3224*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
3225*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
3226*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
3227*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
3228*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
3229*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
3230*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
3231*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "d0", "d1", "d2", "d3", "d4", "d5", "d16",
3232*5f39d1b3SJooyung Han         "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26",
3233*5f39d1b3SJooyung Han         "d27", "cc", "memory");
3234*5f39d1b3SJooyung Han }
3235*5f39d1b3SJooyung Han 
3236*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)3237*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 3, RowMajorWithSum>::Pack(
3238*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
3239*5f39d1b3SJooyung Han #ifdef DEBUG
3240*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
3241*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
3242*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 6, 8, 3, RowMajorWithSum>::Pack()"
3243*5f39d1b3SJooyung Han             << std::endl
3244*5f39d1b3SJooyung Han             << std::flush;
3245*5f39d1b3SJooyung Han #endif
3246*5f39d1b3SJooyung Han #endif
3247*5f39d1b3SJooyung Han   int params_count_copy = params.count;
3248*5f39d1b3SJooyung Han   asm volatile(
3249*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
3250*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
3251*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
3252*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
3253*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
3254*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
3255*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
3256*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
3257*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
3258*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
3259*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
3260*5f39d1b3SJooyung Han 
3261*5f39d1b3SJooyung Han       // Reduce count by leftovers.
3262*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
3263*5f39d1b3SJooyung Han       "beq 2f\n"
3264*5f39d1b3SJooyung Han 
3265*5f39d1b3SJooyung Han       "1:"
3266*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
3267*5f39d1b3SJooyung Han 
3268*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x8.
3269*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
3270*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
3271*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
3272*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
3273*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
3274*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
3275*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3276*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3277*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3278*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3279*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3280*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3281*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3282*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3283*5f39d1b3SJooyung Han 
3284*5f39d1b3SJooyung Han       "bne 1b\n"
3285*5f39d1b3SJooyung Han 
3286*5f39d1b3SJooyung Han       "2:"
3287*5f39d1b3SJooyung Han 
3288*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x3.
3289*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
3290*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
3291*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
3292*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
3293*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
3294*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
3295*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
3296*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]]!\n"
3297*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
3298*5f39d1b3SJooyung Han       "vld1.8 {d1[2]}, [r0]!\n"
3299*5f39d1b3SJooyung Han       "vld1.16 {d2[0]}, [r1]!\n"
3300*5f39d1b3SJooyung Han       "vld1.8 {d2[2]}, [r1]!\n"
3301*5f39d1b3SJooyung Han       "vld1.16 {d3[0]}, [r2]!\n"
3302*5f39d1b3SJooyung Han       "vld1.8 {d3[2]}, [r2]!\n"
3303*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [r3]!\n"
3304*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [r3]!\n"
3305*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [r4]!\n"
3306*5f39d1b3SJooyung Han       "vld1.8 {d5[2]}, [r4]!\n"
3307*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3308*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3309*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3310*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3311*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3312*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3313*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3314*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3315*5f39d1b3SJooyung Han 
3316*5f39d1b3SJooyung Han       // Aggregator Reduction.
3317*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
3318*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
3319*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
3320*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
3321*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
3322*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
3323*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
3324*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
3325*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
3326*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
3327*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
3328*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
3329*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
3330*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
3331*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
3332*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
3333*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
3334*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
3335*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
3336*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
3337*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
3338*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
3339*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
3340*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
3341*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
3342*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
3343*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "d0", "d1", "d2", "d3", "d4", "d5", "d16",
3344*5f39d1b3SJooyung Han         "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26",
3345*5f39d1b3SJooyung Han         "d27", "cc", "memory");
3346*5f39d1b3SJooyung Han }
3347*5f39d1b3SJooyung Han 
3348*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)3349*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 4, RowMajorWithSum>::Pack(
3350*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
3351*5f39d1b3SJooyung Han #ifdef DEBUG
3352*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
3353*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
3354*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 6, 8, 4, RowMajorWithSum>::Pack()"
3355*5f39d1b3SJooyung Han             << std::endl
3356*5f39d1b3SJooyung Han             << std::flush;
3357*5f39d1b3SJooyung Han #endif
3358*5f39d1b3SJooyung Han #endif
3359*5f39d1b3SJooyung Han   int params_count_copy = params.count;
3360*5f39d1b3SJooyung Han   asm volatile(
3361*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
3362*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
3363*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
3364*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
3365*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
3366*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
3367*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
3368*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
3369*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
3370*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
3371*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
3372*5f39d1b3SJooyung Han 
3373*5f39d1b3SJooyung Han       // Reduce count by leftovers.
3374*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
3375*5f39d1b3SJooyung Han       "beq 2f\n"
3376*5f39d1b3SJooyung Han 
3377*5f39d1b3SJooyung Han       "1:"
3378*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
3379*5f39d1b3SJooyung Han 
3380*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x8.
3381*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
3382*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
3383*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
3384*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
3385*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
3386*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
3387*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3388*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3389*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3390*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3391*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3392*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3393*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3394*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3395*5f39d1b3SJooyung Han 
3396*5f39d1b3SJooyung Han       "bne 1b\n"
3397*5f39d1b3SJooyung Han 
3398*5f39d1b3SJooyung Han       "2:"
3399*5f39d1b3SJooyung Han 
3400*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x4.
3401*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
3402*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
3403*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
3404*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
3405*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
3406*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
3407*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
3408*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
3409*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
3410*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
3411*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
3412*5f39d1b3SJooyung Han       "vld1.32 {d5[0]}, [r4]!\n"
3413*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3414*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3415*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3416*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3417*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3418*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3419*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3420*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3421*5f39d1b3SJooyung Han 
3422*5f39d1b3SJooyung Han       // Aggregator Reduction.
3423*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
3424*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
3425*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
3426*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
3427*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
3428*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
3429*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
3430*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
3431*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
3432*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
3433*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
3434*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
3435*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
3436*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
3437*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
3438*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
3439*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
3440*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
3441*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
3442*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
3443*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
3444*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
3445*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
3446*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
3447*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
3448*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
3449*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "d0", "d1", "d2", "d3", "d4", "d5", "d16",
3450*5f39d1b3SJooyung Han         "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26",
3451*5f39d1b3SJooyung Han         "d27", "cc", "memory");
3452*5f39d1b3SJooyung Han }
3453*5f39d1b3SJooyung Han 
3454*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)3455*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 5, RowMajorWithSum>::Pack(
3456*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
3457*5f39d1b3SJooyung Han #ifdef DEBUG
3458*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
3459*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
3460*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 6, 8, 5, RowMajorWithSum>::Pack()"
3461*5f39d1b3SJooyung Han             << std::endl
3462*5f39d1b3SJooyung Han             << std::flush;
3463*5f39d1b3SJooyung Han #endif
3464*5f39d1b3SJooyung Han #endif
3465*5f39d1b3SJooyung Han   int params_count_copy = params.count;
3466*5f39d1b3SJooyung Han   asm volatile(
3467*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
3468*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
3469*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
3470*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
3471*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
3472*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
3473*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
3474*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
3475*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
3476*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
3477*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
3478*5f39d1b3SJooyung Han 
3479*5f39d1b3SJooyung Han       // Reduce count by leftovers.
3480*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
3481*5f39d1b3SJooyung Han       "beq 2f\n"
3482*5f39d1b3SJooyung Han 
3483*5f39d1b3SJooyung Han       "1:"
3484*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
3485*5f39d1b3SJooyung Han 
3486*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x8.
3487*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
3488*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
3489*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
3490*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
3491*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
3492*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
3493*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3494*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3495*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3496*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3497*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3498*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3499*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3500*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3501*5f39d1b3SJooyung Han 
3502*5f39d1b3SJooyung Han       "bne 1b\n"
3503*5f39d1b3SJooyung Han 
3504*5f39d1b3SJooyung Han       "2:"
3505*5f39d1b3SJooyung Han 
3506*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x5.
3507*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
3508*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
3509*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
3510*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
3511*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
3512*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
3513*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
3514*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]]!\n"
3515*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
3516*5f39d1b3SJooyung Han       "vld1.8 {d1[4]}, [r0]!\n"
3517*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
3518*5f39d1b3SJooyung Han       "vld1.8 {d2[4]}, [r1]!\n"
3519*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
3520*5f39d1b3SJooyung Han       "vld1.8 {d3[4]}, [r2]!\n"
3521*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
3522*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [r3]!\n"
3523*5f39d1b3SJooyung Han       "vld1.32 {d5[0]}, [r4]!\n"
3524*5f39d1b3SJooyung Han       "vld1.8 {d5[4]}, [r4]!\n"
3525*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3526*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3527*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3528*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3529*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3530*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3531*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3532*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3533*5f39d1b3SJooyung Han 
3534*5f39d1b3SJooyung Han       // Aggregator Reduction.
3535*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
3536*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
3537*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
3538*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
3539*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
3540*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
3541*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
3542*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
3543*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
3544*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
3545*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
3546*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
3547*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
3548*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
3549*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
3550*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
3551*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
3552*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
3553*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
3554*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
3555*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
3556*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
3557*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
3558*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
3559*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
3560*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
3561*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "d0", "d1", "d2", "d3", "d4", "d5", "d16",
3562*5f39d1b3SJooyung Han         "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26",
3563*5f39d1b3SJooyung Han         "d27", "cc", "memory");
3564*5f39d1b3SJooyung Han }
3565*5f39d1b3SJooyung Han 
3566*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)3567*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 6, RowMajorWithSum>::Pack(
3568*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
3569*5f39d1b3SJooyung Han #ifdef DEBUG
3570*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
3571*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
3572*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 6, 8, 6, RowMajorWithSum>::Pack()"
3573*5f39d1b3SJooyung Han             << std::endl
3574*5f39d1b3SJooyung Han             << std::flush;
3575*5f39d1b3SJooyung Han #endif
3576*5f39d1b3SJooyung Han #endif
3577*5f39d1b3SJooyung Han   int params_count_copy = params.count;
3578*5f39d1b3SJooyung Han   asm volatile(
3579*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
3580*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
3581*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
3582*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
3583*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
3584*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
3585*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
3586*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
3587*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
3588*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
3589*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
3590*5f39d1b3SJooyung Han 
3591*5f39d1b3SJooyung Han       // Reduce count by leftovers.
3592*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
3593*5f39d1b3SJooyung Han       "beq 2f\n"
3594*5f39d1b3SJooyung Han 
3595*5f39d1b3SJooyung Han       "1:"
3596*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
3597*5f39d1b3SJooyung Han 
3598*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x8.
3599*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
3600*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
3601*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
3602*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
3603*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
3604*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
3605*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3606*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3607*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3608*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3609*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3610*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3611*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3612*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3613*5f39d1b3SJooyung Han 
3614*5f39d1b3SJooyung Han       "bne 1b\n"
3615*5f39d1b3SJooyung Han 
3616*5f39d1b3SJooyung Han       "2:"
3617*5f39d1b3SJooyung Han 
3618*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x6.
3619*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
3620*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
3621*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
3622*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
3623*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
3624*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
3625*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
3626*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
3627*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
3628*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
3629*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
3630*5f39d1b3SJooyung Han       "vld1.16 {d2[2]}, [r1]!\n"
3631*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
3632*5f39d1b3SJooyung Han       "vld1.16 {d3[2]}, [r2]!\n"
3633*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
3634*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [r3]!\n"
3635*5f39d1b3SJooyung Han       "vld1.32 {d5[0]}, [r4]!\n"
3636*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [r4]!\n"
3637*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3638*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3639*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3640*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3641*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3642*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3643*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3644*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3645*5f39d1b3SJooyung Han 
3646*5f39d1b3SJooyung Han       // Aggregator Reduction.
3647*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
3648*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
3649*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
3650*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
3651*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
3652*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
3653*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
3654*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
3655*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
3656*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
3657*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
3658*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
3659*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
3660*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
3661*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
3662*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
3663*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
3664*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
3665*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
3666*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
3667*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
3668*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
3669*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
3670*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
3671*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
3672*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
3673*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "d0", "d1", "d2", "d3", "d4", "d5", "d16",
3674*5f39d1b3SJooyung Han         "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26",
3675*5f39d1b3SJooyung Han         "d27", "cc", "memory");
3676*5f39d1b3SJooyung Han }
3677*5f39d1b3SJooyung Han 
3678*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)3679*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 7, RowMajorWithSum>::Pack(
3680*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
3681*5f39d1b3SJooyung Han #ifdef DEBUG
3682*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
3683*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
3684*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 6, 8, 7, RowMajorWithSum>::Pack()"
3685*5f39d1b3SJooyung Han             << std::endl
3686*5f39d1b3SJooyung Han             << std::flush;
3687*5f39d1b3SJooyung Han #endif
3688*5f39d1b3SJooyung Han #endif
3689*5f39d1b3SJooyung Han   int params_count_copy = params.count;
3690*5f39d1b3SJooyung Han   asm volatile(
3691*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
3692*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
3693*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
3694*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
3695*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
3696*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
3697*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
3698*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
3699*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
3700*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
3701*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
3702*5f39d1b3SJooyung Han 
3703*5f39d1b3SJooyung Han       // Reduce count by leftovers.
3704*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
3705*5f39d1b3SJooyung Han       "beq 2f\n"
3706*5f39d1b3SJooyung Han 
3707*5f39d1b3SJooyung Han       "1:"
3708*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
3709*5f39d1b3SJooyung Han 
3710*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x8.
3711*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
3712*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
3713*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
3714*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
3715*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
3716*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
3717*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3718*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3719*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3720*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3721*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3722*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3723*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3724*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3725*5f39d1b3SJooyung Han 
3726*5f39d1b3SJooyung Han       "bne 1b\n"
3727*5f39d1b3SJooyung Han 
3728*5f39d1b3SJooyung Han       "2:"
3729*5f39d1b3SJooyung Han 
3730*5f39d1b3SJooyung Han       // Load Aggregate Store: 6x7.
3731*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
3732*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
3733*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
3734*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
3735*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
3736*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
3737*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
3738*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
3739*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]]!\n"
3740*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
3741*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
3742*5f39d1b3SJooyung Han       "vld1.8 {d1[6]}, [r0]!\n"
3743*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
3744*5f39d1b3SJooyung Han       "vld1.16 {d2[2]}, [r1]!\n"
3745*5f39d1b3SJooyung Han       "vld1.8 {d2[6]}, [r1]!\n"
3746*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
3747*5f39d1b3SJooyung Han       "vld1.16 {d3[2]}, [r2]!\n"
3748*5f39d1b3SJooyung Han       "vld1.8 {d3[6]}, [r2]!\n"
3749*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
3750*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [r3]!\n"
3751*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [r3]!\n"
3752*5f39d1b3SJooyung Han       "vld1.32 {d5[0]}, [r4]!\n"
3753*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [r4]!\n"
3754*5f39d1b3SJooyung Han       "vld1.8 {d5[6]}, [r4]!\n"
3755*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3756*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3757*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3758*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3759*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3760*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3761*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
3762*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
3763*5f39d1b3SJooyung Han 
3764*5f39d1b3SJooyung Han       // Aggregator Reduction.
3765*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
3766*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
3767*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
3768*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
3769*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
3770*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
3771*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
3772*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
3773*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
3774*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
3775*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
3776*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
3777*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
3778*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
3779*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
3780*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
3781*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
3782*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
3783*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
3784*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
3785*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
3786*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
3787*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
3788*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
3789*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset),
3790*5f39d1b3SJooyung Han         [additive_sum_offset] "r"(params.additive_sum_offset)
3791*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "d0", "d1", "d2", "d3", "d4", "d5", "d16",
3792*5f39d1b3SJooyung Han         "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26",
3793*5f39d1b3SJooyung Han         "d27", "cc", "memory");
3794*5f39d1b3SJooyung Han }
3795*5f39d1b3SJooyung Han 
3796*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)3797*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 0, RowMajorWithSum>::Pack(
3798*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
3799*5f39d1b3SJooyung Han #ifdef DEBUG
3800*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
3801*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
3802*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 7, 8, 0, RowMajorWithSum>::Pack()"
3803*5f39d1b3SJooyung Han             << std::endl
3804*5f39d1b3SJooyung Han             << std::flush;
3805*5f39d1b3SJooyung Han #endif
3806*5f39d1b3SJooyung Han #endif
3807*5f39d1b3SJooyung Han   int params_count_copy = params.count;
3808*5f39d1b3SJooyung Han   asm volatile(
3809*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
3810*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
3811*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
3812*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
3813*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
3814*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
3815*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
3816*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
3817*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
3818*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
3819*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
3820*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
3821*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
3822*5f39d1b3SJooyung Han 
3823*5f39d1b3SJooyung Han       "1:"
3824*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
3825*5f39d1b3SJooyung Han 
3826*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x8.
3827*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
3828*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
3829*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
3830*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
3831*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
3832*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
3833*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
3834*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3835*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3836*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3837*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3838*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3839*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3840*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
3841*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
3842*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
3843*5f39d1b3SJooyung Han 
3844*5f39d1b3SJooyung Han       "bne 1b\n"
3845*5f39d1b3SJooyung Han 
3846*5f39d1b3SJooyung Han       // Aggregator Reduction.
3847*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
3848*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
3849*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
3850*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
3851*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
3852*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
3853*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
3854*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
3855*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
3856*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
3857*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
3858*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
3859*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
3860*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
3861*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
3862*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
3863*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
3864*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
3865*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
3866*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
3867*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
3868*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
3869*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
3870*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
3871*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
3872*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
3873*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
3874*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
3875*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
3876*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
3877*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
3878*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "d0", "d1", "d2", "d3", "d4", "d5",
3879*5f39d1b3SJooyung Han         "d6", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24",
3880*5f39d1b3SJooyung Han         "d25", "d26", "d27", "d28", "d29", "cc", "memory");
3881*5f39d1b3SJooyung Han }
3882*5f39d1b3SJooyung Han 
3883*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)3884*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 1, RowMajorWithSum>::Pack(
3885*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
3886*5f39d1b3SJooyung Han #ifdef DEBUG
3887*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
3888*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
3889*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 7, 8, 1, RowMajorWithSum>::Pack()"
3890*5f39d1b3SJooyung Han             << std::endl
3891*5f39d1b3SJooyung Han             << std::flush;
3892*5f39d1b3SJooyung Han #endif
3893*5f39d1b3SJooyung Han #endif
3894*5f39d1b3SJooyung Han   int params_count_copy = params.count;
3895*5f39d1b3SJooyung Han   asm volatile(
3896*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
3897*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
3898*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
3899*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
3900*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
3901*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
3902*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
3903*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
3904*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
3905*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
3906*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
3907*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
3908*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
3909*5f39d1b3SJooyung Han 
3910*5f39d1b3SJooyung Han       // Reduce count by leftovers.
3911*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
3912*5f39d1b3SJooyung Han       "beq 2f\n"
3913*5f39d1b3SJooyung Han 
3914*5f39d1b3SJooyung Han       "1:"
3915*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
3916*5f39d1b3SJooyung Han 
3917*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x8.
3918*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
3919*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
3920*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
3921*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
3922*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
3923*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
3924*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
3925*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3926*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3927*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3928*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3929*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3930*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3931*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
3932*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
3933*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
3934*5f39d1b3SJooyung Han 
3935*5f39d1b3SJooyung Han       "bne 1b\n"
3936*5f39d1b3SJooyung Han 
3937*5f39d1b3SJooyung Han       "2:"
3938*5f39d1b3SJooyung Han 
3939*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x1.
3940*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
3941*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
3942*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
3943*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
3944*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
3945*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
3946*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
3947*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]]!\n"
3948*5f39d1b3SJooyung Han       "vld1.8 {d1[0]}, [r0]!\n"
3949*5f39d1b3SJooyung Han       "vld1.8 {d2[0]}, [r1]!\n"
3950*5f39d1b3SJooyung Han       "vld1.8 {d3[0]}, [r2]!\n"
3951*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [r3]!\n"
3952*5f39d1b3SJooyung Han       "vld1.8 {d5[0]}, [r4]!\n"
3953*5f39d1b3SJooyung Han       "vld1.8 {d6[0]}, [r5]!\n"
3954*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
3955*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
3956*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
3957*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
3958*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
3959*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
3960*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
3961*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
3962*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
3963*5f39d1b3SJooyung Han 
3964*5f39d1b3SJooyung Han       // Aggregator Reduction.
3965*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
3966*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
3967*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
3968*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
3969*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
3970*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
3971*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
3972*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
3973*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
3974*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
3975*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
3976*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
3977*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
3978*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
3979*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
3980*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
3981*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
3982*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
3983*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
3984*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
3985*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
3986*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
3987*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
3988*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
3989*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
3990*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
3991*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
3992*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
3993*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
3994*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
3995*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
3996*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "d0", "d1", "d2", "d3", "d4", "d5",
3997*5f39d1b3SJooyung Han         "d6", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24",
3998*5f39d1b3SJooyung Han         "d25", "d26", "d27", "d28", "d29", "cc", "memory");
3999*5f39d1b3SJooyung Han }
4000*5f39d1b3SJooyung Han 
4001*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)4002*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 2, RowMajorWithSum>::Pack(
4003*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
4004*5f39d1b3SJooyung Han #ifdef DEBUG
4005*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
4006*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
4007*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 7, 8, 2, RowMajorWithSum>::Pack()"
4008*5f39d1b3SJooyung Han             << std::endl
4009*5f39d1b3SJooyung Han             << std::flush;
4010*5f39d1b3SJooyung Han #endif
4011*5f39d1b3SJooyung Han #endif
4012*5f39d1b3SJooyung Han   int params_count_copy = params.count;
4013*5f39d1b3SJooyung Han   asm volatile(
4014*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
4015*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
4016*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
4017*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
4018*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
4019*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
4020*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
4021*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
4022*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
4023*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
4024*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
4025*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
4026*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
4027*5f39d1b3SJooyung Han 
4028*5f39d1b3SJooyung Han       // Reduce count by leftovers.
4029*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
4030*5f39d1b3SJooyung Han       "beq 2f\n"
4031*5f39d1b3SJooyung Han 
4032*5f39d1b3SJooyung Han       "1:"
4033*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
4034*5f39d1b3SJooyung Han 
4035*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x8.
4036*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
4037*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
4038*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
4039*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
4040*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
4041*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
4042*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
4043*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4044*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4045*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4046*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4047*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4048*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4049*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4050*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
4051*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
4052*5f39d1b3SJooyung Han 
4053*5f39d1b3SJooyung Han       "bne 1b\n"
4054*5f39d1b3SJooyung Han 
4055*5f39d1b3SJooyung Han       "2:"
4056*5f39d1b3SJooyung Han 
4057*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x2.
4058*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
4059*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
4060*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
4061*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
4062*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
4063*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
4064*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
4065*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
4066*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
4067*5f39d1b3SJooyung Han       "vld1.16 {d2[0]}, [r1]!\n"
4068*5f39d1b3SJooyung Han       "vld1.16 {d3[0]}, [r2]!\n"
4069*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [r3]!\n"
4070*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [r4]!\n"
4071*5f39d1b3SJooyung Han       "vld1.16 {d6[0]}, [r5]!\n"
4072*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4073*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4074*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4075*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4076*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4077*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4078*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4079*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
4080*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
4081*5f39d1b3SJooyung Han 
4082*5f39d1b3SJooyung Han       // Aggregator Reduction.
4083*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
4084*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
4085*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
4086*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
4087*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
4088*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
4089*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
4090*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
4091*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
4092*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
4093*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
4094*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
4095*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
4096*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
4097*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
4098*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
4099*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
4100*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
4101*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
4102*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
4103*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
4104*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
4105*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
4106*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
4107*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
4108*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
4109*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
4110*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
4111*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
4112*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
4113*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
4114*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "d0", "d1", "d2", "d3", "d4", "d5",
4115*5f39d1b3SJooyung Han         "d6", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24",
4116*5f39d1b3SJooyung Han         "d25", "d26", "d27", "d28", "d29", "cc", "memory");
4117*5f39d1b3SJooyung Han }
4118*5f39d1b3SJooyung Han 
4119*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)4120*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 3, RowMajorWithSum>::Pack(
4121*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
4122*5f39d1b3SJooyung Han #ifdef DEBUG
4123*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
4124*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
4125*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 7, 8, 3, RowMajorWithSum>::Pack()"
4126*5f39d1b3SJooyung Han             << std::endl
4127*5f39d1b3SJooyung Han             << std::flush;
4128*5f39d1b3SJooyung Han #endif
4129*5f39d1b3SJooyung Han #endif
4130*5f39d1b3SJooyung Han   int params_count_copy = params.count;
4131*5f39d1b3SJooyung Han   asm volatile(
4132*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
4133*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
4134*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
4135*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
4136*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
4137*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
4138*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
4139*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
4140*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
4141*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
4142*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
4143*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
4144*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
4145*5f39d1b3SJooyung Han 
4146*5f39d1b3SJooyung Han       // Reduce count by leftovers.
4147*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
4148*5f39d1b3SJooyung Han       "beq 2f\n"
4149*5f39d1b3SJooyung Han 
4150*5f39d1b3SJooyung Han       "1:"
4151*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
4152*5f39d1b3SJooyung Han 
4153*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x8.
4154*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
4155*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
4156*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
4157*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
4158*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
4159*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
4160*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
4161*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4162*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4163*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4164*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4165*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4166*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4167*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4168*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
4169*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
4170*5f39d1b3SJooyung Han 
4171*5f39d1b3SJooyung Han       "bne 1b\n"
4172*5f39d1b3SJooyung Han 
4173*5f39d1b3SJooyung Han       "2:"
4174*5f39d1b3SJooyung Han 
4175*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x3.
4176*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
4177*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
4178*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
4179*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
4180*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
4181*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
4182*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
4183*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
4184*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]]!\n"
4185*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
4186*5f39d1b3SJooyung Han       "vld1.8 {d1[2]}, [r0]!\n"
4187*5f39d1b3SJooyung Han       "vld1.16 {d2[0]}, [r1]!\n"
4188*5f39d1b3SJooyung Han       "vld1.8 {d2[2]}, [r1]!\n"
4189*5f39d1b3SJooyung Han       "vld1.16 {d3[0]}, [r2]!\n"
4190*5f39d1b3SJooyung Han       "vld1.8 {d3[2]}, [r2]!\n"
4191*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [r3]!\n"
4192*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [r3]!\n"
4193*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [r4]!\n"
4194*5f39d1b3SJooyung Han       "vld1.8 {d5[2]}, [r4]!\n"
4195*5f39d1b3SJooyung Han       "vld1.16 {d6[0]}, [r5]!\n"
4196*5f39d1b3SJooyung Han       "vld1.8 {d6[2]}, [r5]!\n"
4197*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4198*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4199*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4200*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4201*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4202*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4203*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4204*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
4205*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
4206*5f39d1b3SJooyung Han 
4207*5f39d1b3SJooyung Han       // Aggregator Reduction.
4208*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
4209*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
4210*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
4211*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
4212*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
4213*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
4214*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
4215*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
4216*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
4217*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
4218*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
4219*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
4220*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
4221*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
4222*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
4223*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
4224*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
4225*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
4226*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
4227*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
4228*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
4229*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
4230*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
4231*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
4232*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
4233*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
4234*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
4235*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
4236*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
4237*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
4238*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
4239*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "d0", "d1", "d2", "d3", "d4", "d5",
4240*5f39d1b3SJooyung Han         "d6", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24",
4241*5f39d1b3SJooyung Han         "d25", "d26", "d27", "d28", "d29", "cc", "memory");
4242*5f39d1b3SJooyung Han }
4243*5f39d1b3SJooyung Han 
4244*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)4245*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 4, RowMajorWithSum>::Pack(
4246*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
4247*5f39d1b3SJooyung Han #ifdef DEBUG
4248*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
4249*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
4250*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 7, 8, 4, RowMajorWithSum>::Pack()"
4251*5f39d1b3SJooyung Han             << std::endl
4252*5f39d1b3SJooyung Han             << std::flush;
4253*5f39d1b3SJooyung Han #endif
4254*5f39d1b3SJooyung Han #endif
4255*5f39d1b3SJooyung Han   int params_count_copy = params.count;
4256*5f39d1b3SJooyung Han   asm volatile(
4257*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
4258*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
4259*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
4260*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
4261*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
4262*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
4263*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
4264*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
4265*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
4266*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
4267*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
4268*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
4269*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
4270*5f39d1b3SJooyung Han 
4271*5f39d1b3SJooyung Han       // Reduce count by leftovers.
4272*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
4273*5f39d1b3SJooyung Han       "beq 2f\n"
4274*5f39d1b3SJooyung Han 
4275*5f39d1b3SJooyung Han       "1:"
4276*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
4277*5f39d1b3SJooyung Han 
4278*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x8.
4279*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
4280*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
4281*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
4282*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
4283*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
4284*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
4285*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
4286*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4287*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4288*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4289*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4290*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4291*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4292*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4293*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
4294*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
4295*5f39d1b3SJooyung Han 
4296*5f39d1b3SJooyung Han       "bne 1b\n"
4297*5f39d1b3SJooyung Han 
4298*5f39d1b3SJooyung Han       "2:"
4299*5f39d1b3SJooyung Han 
4300*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x4.
4301*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
4302*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
4303*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
4304*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
4305*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
4306*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
4307*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
4308*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
4309*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
4310*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
4311*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
4312*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
4313*5f39d1b3SJooyung Han       "vld1.32 {d5[0]}, [r4]!\n"
4314*5f39d1b3SJooyung Han       "vld1.32 {d6[0]}, [r5]!\n"
4315*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4316*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4317*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4318*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4319*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4320*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4321*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4322*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
4323*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
4324*5f39d1b3SJooyung Han 
4325*5f39d1b3SJooyung Han       // Aggregator Reduction.
4326*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
4327*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
4328*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
4329*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
4330*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
4331*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
4332*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
4333*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
4334*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
4335*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
4336*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
4337*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
4338*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
4339*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
4340*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
4341*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
4342*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
4343*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
4344*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
4345*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
4346*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
4347*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
4348*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
4349*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
4350*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
4351*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
4352*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
4353*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
4354*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
4355*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
4356*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
4357*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "d0", "d1", "d2", "d3", "d4", "d5",
4358*5f39d1b3SJooyung Han         "d6", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24",
4359*5f39d1b3SJooyung Han         "d25", "d26", "d27", "d28", "d29", "cc", "memory");
4360*5f39d1b3SJooyung Han }
4361*5f39d1b3SJooyung Han 
4362*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)4363*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 5, RowMajorWithSum>::Pack(
4364*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
4365*5f39d1b3SJooyung Han #ifdef DEBUG
4366*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
4367*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
4368*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 7, 8, 5, RowMajorWithSum>::Pack()"
4369*5f39d1b3SJooyung Han             << std::endl
4370*5f39d1b3SJooyung Han             << std::flush;
4371*5f39d1b3SJooyung Han #endif
4372*5f39d1b3SJooyung Han #endif
4373*5f39d1b3SJooyung Han   int params_count_copy = params.count;
4374*5f39d1b3SJooyung Han   asm volatile(
4375*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
4376*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
4377*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
4378*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
4379*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
4380*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
4381*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
4382*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
4383*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
4384*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
4385*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
4386*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
4387*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
4388*5f39d1b3SJooyung Han 
4389*5f39d1b3SJooyung Han       // Reduce count by leftovers.
4390*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
4391*5f39d1b3SJooyung Han       "beq 2f\n"
4392*5f39d1b3SJooyung Han 
4393*5f39d1b3SJooyung Han       "1:"
4394*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
4395*5f39d1b3SJooyung Han 
4396*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x8.
4397*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
4398*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
4399*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
4400*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
4401*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
4402*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
4403*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
4404*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4405*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4406*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4407*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4408*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4409*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4410*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4411*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
4412*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
4413*5f39d1b3SJooyung Han 
4414*5f39d1b3SJooyung Han       "bne 1b\n"
4415*5f39d1b3SJooyung Han 
4416*5f39d1b3SJooyung Han       "2:"
4417*5f39d1b3SJooyung Han 
4418*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x5.
4419*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
4420*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
4421*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
4422*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
4423*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
4424*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
4425*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
4426*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
4427*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]]!\n"
4428*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
4429*5f39d1b3SJooyung Han       "vld1.8 {d1[4]}, [r0]!\n"
4430*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
4431*5f39d1b3SJooyung Han       "vld1.8 {d2[4]}, [r1]!\n"
4432*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
4433*5f39d1b3SJooyung Han       "vld1.8 {d3[4]}, [r2]!\n"
4434*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
4435*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [r3]!\n"
4436*5f39d1b3SJooyung Han       "vld1.32 {d5[0]}, [r4]!\n"
4437*5f39d1b3SJooyung Han       "vld1.8 {d5[4]}, [r4]!\n"
4438*5f39d1b3SJooyung Han       "vld1.32 {d6[0]}, [r5]!\n"
4439*5f39d1b3SJooyung Han       "vld1.8 {d6[4]}, [r5]!\n"
4440*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4441*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4442*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4443*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4444*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4445*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4446*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4447*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
4448*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
4449*5f39d1b3SJooyung Han 
4450*5f39d1b3SJooyung Han       // Aggregator Reduction.
4451*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
4452*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
4453*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
4454*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
4455*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
4456*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
4457*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
4458*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
4459*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
4460*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
4461*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
4462*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
4463*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
4464*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
4465*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
4466*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
4467*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
4468*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
4469*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
4470*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
4471*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
4472*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
4473*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
4474*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
4475*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
4476*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
4477*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
4478*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
4479*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
4480*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
4481*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
4482*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "d0", "d1", "d2", "d3", "d4", "d5",
4483*5f39d1b3SJooyung Han         "d6", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24",
4484*5f39d1b3SJooyung Han         "d25", "d26", "d27", "d28", "d29", "cc", "memory");
4485*5f39d1b3SJooyung Han }
4486*5f39d1b3SJooyung Han 
4487*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)4488*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 6, RowMajorWithSum>::Pack(
4489*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
4490*5f39d1b3SJooyung Han #ifdef DEBUG
4491*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
4492*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
4493*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 7, 8, 6, RowMajorWithSum>::Pack()"
4494*5f39d1b3SJooyung Han             << std::endl
4495*5f39d1b3SJooyung Han             << std::flush;
4496*5f39d1b3SJooyung Han #endif
4497*5f39d1b3SJooyung Han #endif
4498*5f39d1b3SJooyung Han   int params_count_copy = params.count;
4499*5f39d1b3SJooyung Han   asm volatile(
4500*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
4501*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
4502*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
4503*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
4504*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
4505*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
4506*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
4507*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
4508*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
4509*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
4510*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
4511*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
4512*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
4513*5f39d1b3SJooyung Han 
4514*5f39d1b3SJooyung Han       // Reduce count by leftovers.
4515*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
4516*5f39d1b3SJooyung Han       "beq 2f\n"
4517*5f39d1b3SJooyung Han 
4518*5f39d1b3SJooyung Han       "1:"
4519*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
4520*5f39d1b3SJooyung Han 
4521*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x8.
4522*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
4523*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
4524*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
4525*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
4526*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
4527*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
4528*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
4529*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4530*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4531*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4532*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4533*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4534*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4535*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4536*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
4537*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
4538*5f39d1b3SJooyung Han 
4539*5f39d1b3SJooyung Han       "bne 1b\n"
4540*5f39d1b3SJooyung Han 
4541*5f39d1b3SJooyung Han       "2:"
4542*5f39d1b3SJooyung Han 
4543*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x6.
4544*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
4545*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
4546*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
4547*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
4548*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
4549*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
4550*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
4551*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
4552*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
4553*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
4554*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
4555*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
4556*5f39d1b3SJooyung Han       "vld1.16 {d2[2]}, [r1]!\n"
4557*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
4558*5f39d1b3SJooyung Han       "vld1.16 {d3[2]}, [r2]!\n"
4559*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
4560*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [r3]!\n"
4561*5f39d1b3SJooyung Han       "vld1.32 {d5[0]}, [r4]!\n"
4562*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [r4]!\n"
4563*5f39d1b3SJooyung Han       "vld1.32 {d6[0]}, [r5]!\n"
4564*5f39d1b3SJooyung Han       "vld1.16 {d6[2]}, [r5]!\n"
4565*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4566*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4567*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4568*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4569*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4570*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4571*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4572*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
4573*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
4574*5f39d1b3SJooyung Han 
4575*5f39d1b3SJooyung Han       // Aggregator Reduction.
4576*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
4577*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
4578*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
4579*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
4580*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
4581*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
4582*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
4583*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
4584*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
4585*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
4586*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
4587*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
4588*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
4589*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
4590*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
4591*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
4592*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
4593*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
4594*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
4595*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
4596*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
4597*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
4598*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
4599*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
4600*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
4601*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
4602*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
4603*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
4604*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
4605*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
4606*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
4607*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "d0", "d1", "d2", "d3", "d4", "d5",
4608*5f39d1b3SJooyung Han         "d6", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24",
4609*5f39d1b3SJooyung Han         "d25", "d26", "d27", "d28", "d29", "cc", "memory");
4610*5f39d1b3SJooyung Han }
4611*5f39d1b3SJooyung Han 
4612*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)4613*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 7, RowMajorWithSum>::Pack(
4614*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
4615*5f39d1b3SJooyung Han #ifdef DEBUG
4616*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
4617*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
4618*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 7, 8, 7, RowMajorWithSum>::Pack()"
4619*5f39d1b3SJooyung Han             << std::endl
4620*5f39d1b3SJooyung Han             << std::flush;
4621*5f39d1b3SJooyung Han #endif
4622*5f39d1b3SJooyung Han #endif
4623*5f39d1b3SJooyung Han   int params_count_copy = params.count;
4624*5f39d1b3SJooyung Han   asm volatile(
4625*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
4626*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
4627*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
4628*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
4629*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
4630*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
4631*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
4632*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
4633*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
4634*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
4635*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
4636*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
4637*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
4638*5f39d1b3SJooyung Han 
4639*5f39d1b3SJooyung Han       // Reduce count by leftovers.
4640*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
4641*5f39d1b3SJooyung Han       "beq 2f\n"
4642*5f39d1b3SJooyung Han 
4643*5f39d1b3SJooyung Han       "1:"
4644*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
4645*5f39d1b3SJooyung Han 
4646*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x8.
4647*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
4648*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
4649*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
4650*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
4651*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
4652*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
4653*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
4654*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4655*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4656*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4657*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4658*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4659*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4660*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4661*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
4662*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
4663*5f39d1b3SJooyung Han 
4664*5f39d1b3SJooyung Han       "bne 1b\n"
4665*5f39d1b3SJooyung Han 
4666*5f39d1b3SJooyung Han       "2:"
4667*5f39d1b3SJooyung Han 
4668*5f39d1b3SJooyung Han       // Load Aggregate Store: 7x7.
4669*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
4670*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
4671*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
4672*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
4673*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
4674*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
4675*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
4676*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
4677*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
4678*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]]!\n"
4679*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
4680*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
4681*5f39d1b3SJooyung Han       "vld1.8 {d1[6]}, [r0]!\n"
4682*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
4683*5f39d1b3SJooyung Han       "vld1.16 {d2[2]}, [r1]!\n"
4684*5f39d1b3SJooyung Han       "vld1.8 {d2[6]}, [r1]!\n"
4685*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
4686*5f39d1b3SJooyung Han       "vld1.16 {d3[2]}, [r2]!\n"
4687*5f39d1b3SJooyung Han       "vld1.8 {d3[6]}, [r2]!\n"
4688*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
4689*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [r3]!\n"
4690*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [r3]!\n"
4691*5f39d1b3SJooyung Han       "vld1.32 {d5[0]}, [r4]!\n"
4692*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [r4]!\n"
4693*5f39d1b3SJooyung Han       "vld1.8 {d5[6]}, [r4]!\n"
4694*5f39d1b3SJooyung Han       "vld1.32 {d6[0]}, [r5]!\n"
4695*5f39d1b3SJooyung Han       "vld1.16 {d6[2]}, [r5]!\n"
4696*5f39d1b3SJooyung Han       "vld1.8 {d6[6]}, [r5]!\n"
4697*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4698*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4699*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4700*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4701*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4702*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4703*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4704*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
4705*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
4706*5f39d1b3SJooyung Han 
4707*5f39d1b3SJooyung Han       // Aggregator Reduction.
4708*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
4709*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
4710*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
4711*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
4712*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
4713*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
4714*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
4715*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
4716*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
4717*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
4718*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
4719*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
4720*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
4721*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
4722*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
4723*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
4724*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
4725*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
4726*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
4727*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
4728*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
4729*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
4730*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
4731*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
4732*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
4733*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
4734*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
4735*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
4736*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
4737*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
4738*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
4739*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "d0", "d1", "d2", "d3", "d4", "d5",
4740*5f39d1b3SJooyung Han         "d6", "d16", "d17", "d18", "d19", "d20", "d21", "d22", "d23", "d24",
4741*5f39d1b3SJooyung Han         "d25", "d26", "d27", "d28", "d29", "cc", "memory");
4742*5f39d1b3SJooyung Han }
4743*5f39d1b3SJooyung Han 
4744*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)4745*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 0, RowMajorWithSum>::Pack(
4746*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
4747*5f39d1b3SJooyung Han #ifdef DEBUG
4748*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
4749*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
4750*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 8, 8, 0, RowMajorWithSum>::Pack()"
4751*5f39d1b3SJooyung Han             << std::endl
4752*5f39d1b3SJooyung Han             << std::flush;
4753*5f39d1b3SJooyung Han #endif
4754*5f39d1b3SJooyung Han #endif
4755*5f39d1b3SJooyung Han   int params_count_copy = params.count;
4756*5f39d1b3SJooyung Han   asm volatile(
4757*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
4758*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
4759*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
4760*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
4761*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
4762*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
4763*5f39d1b3SJooyung Han       "add r6, r5, %[stride]\n"
4764*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
4765*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
4766*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
4767*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
4768*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
4769*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
4770*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
4771*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
4772*5f39d1b3SJooyung Han 
4773*5f39d1b3SJooyung Han       "1:"
4774*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
4775*5f39d1b3SJooyung Han 
4776*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x8.
4777*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
4778*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
4779*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
4780*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
4781*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
4782*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
4783*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
4784*5f39d1b3SJooyung Han       "vld1.32 {d7}, [r6]!\n"
4785*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4786*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4787*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4788*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4789*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4790*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4791*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4792*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
4793*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
4794*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
4795*5f39d1b3SJooyung Han 
4796*5f39d1b3SJooyung Han       "bne 1b\n"
4797*5f39d1b3SJooyung Han 
4798*5f39d1b3SJooyung Han       // Aggregator Reduction.
4799*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
4800*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
4801*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
4802*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
4803*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
4804*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
4805*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
4806*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
4807*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
4808*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
4809*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
4810*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
4811*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
4812*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
4813*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
4814*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
4815*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
4816*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
4817*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
4818*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
4819*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
4820*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
4821*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
4822*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
4823*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
4824*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
4825*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
4826*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
4827*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
4828*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
4829*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
4830*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
4831*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
4832*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "d0", "d1", "d2", "d3", "d4",
4833*5f39d1b3SJooyung Han         "d5", "d6", "d7", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
4834*5f39d1b3SJooyung Han         "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", "cc",
4835*5f39d1b3SJooyung Han         "memory");
4836*5f39d1b3SJooyung Han }
4837*5f39d1b3SJooyung Han 
4838*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)4839*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 1, RowMajorWithSum>::Pack(
4840*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
4841*5f39d1b3SJooyung Han #ifdef DEBUG
4842*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
4843*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
4844*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 8, 8, 1, RowMajorWithSum>::Pack()"
4845*5f39d1b3SJooyung Han             << std::endl
4846*5f39d1b3SJooyung Han             << std::flush;
4847*5f39d1b3SJooyung Han #endif
4848*5f39d1b3SJooyung Han #endif
4849*5f39d1b3SJooyung Han   int params_count_copy = params.count;
4850*5f39d1b3SJooyung Han   asm volatile(
4851*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
4852*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
4853*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
4854*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
4855*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
4856*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
4857*5f39d1b3SJooyung Han       "add r6, r5, %[stride]\n"
4858*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
4859*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
4860*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
4861*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
4862*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
4863*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
4864*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
4865*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
4866*5f39d1b3SJooyung Han 
4867*5f39d1b3SJooyung Han       // Reduce count by leftovers.
4868*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
4869*5f39d1b3SJooyung Han       "beq 2f\n"
4870*5f39d1b3SJooyung Han 
4871*5f39d1b3SJooyung Han       "1:"
4872*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
4873*5f39d1b3SJooyung Han 
4874*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x8.
4875*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
4876*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
4877*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
4878*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
4879*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
4880*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
4881*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
4882*5f39d1b3SJooyung Han       "vld1.32 {d7}, [r6]!\n"
4883*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4884*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4885*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4886*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4887*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4888*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4889*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4890*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
4891*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
4892*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
4893*5f39d1b3SJooyung Han 
4894*5f39d1b3SJooyung Han       "bne 1b\n"
4895*5f39d1b3SJooyung Han 
4896*5f39d1b3SJooyung Han       "2:"
4897*5f39d1b3SJooyung Han 
4898*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x1.
4899*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
4900*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
4901*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
4902*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
4903*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
4904*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
4905*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
4906*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
4907*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]]!\n"
4908*5f39d1b3SJooyung Han       "vld1.8 {d1[0]}, [r0]!\n"
4909*5f39d1b3SJooyung Han       "vld1.8 {d2[0]}, [r1]!\n"
4910*5f39d1b3SJooyung Han       "vld1.8 {d3[0]}, [r2]!\n"
4911*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [r3]!\n"
4912*5f39d1b3SJooyung Han       "vld1.8 {d5[0]}, [r4]!\n"
4913*5f39d1b3SJooyung Han       "vld1.8 {d6[0]}, [r5]!\n"
4914*5f39d1b3SJooyung Han       "vld1.8 {d7[0]}, [r6]!\n"
4915*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
4916*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
4917*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
4918*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
4919*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
4920*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
4921*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
4922*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
4923*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
4924*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
4925*5f39d1b3SJooyung Han 
4926*5f39d1b3SJooyung Han       // Aggregator Reduction.
4927*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
4928*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
4929*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
4930*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
4931*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
4932*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
4933*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
4934*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
4935*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
4936*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
4937*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
4938*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
4939*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
4940*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
4941*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
4942*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
4943*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
4944*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
4945*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
4946*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
4947*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
4948*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
4949*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
4950*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
4951*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
4952*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
4953*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
4954*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
4955*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
4956*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
4957*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
4958*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
4959*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
4960*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "d0", "d1", "d2", "d3", "d4",
4961*5f39d1b3SJooyung Han         "d5", "d6", "d7", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
4962*5f39d1b3SJooyung Han         "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", "cc",
4963*5f39d1b3SJooyung Han         "memory");
4964*5f39d1b3SJooyung Han }
4965*5f39d1b3SJooyung Han 
4966*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)4967*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 2, RowMajorWithSum>::Pack(
4968*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
4969*5f39d1b3SJooyung Han #ifdef DEBUG
4970*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
4971*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
4972*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 8, 8, 2, RowMajorWithSum>::Pack()"
4973*5f39d1b3SJooyung Han             << std::endl
4974*5f39d1b3SJooyung Han             << std::flush;
4975*5f39d1b3SJooyung Han #endif
4976*5f39d1b3SJooyung Han #endif
4977*5f39d1b3SJooyung Han   int params_count_copy = params.count;
4978*5f39d1b3SJooyung Han   asm volatile(
4979*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
4980*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
4981*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
4982*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
4983*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
4984*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
4985*5f39d1b3SJooyung Han       "add r6, r5, %[stride]\n"
4986*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
4987*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
4988*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
4989*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
4990*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
4991*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
4992*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
4993*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
4994*5f39d1b3SJooyung Han 
4995*5f39d1b3SJooyung Han       // Reduce count by leftovers.
4996*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
4997*5f39d1b3SJooyung Han       "beq 2f\n"
4998*5f39d1b3SJooyung Han 
4999*5f39d1b3SJooyung Han       "1:"
5000*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
5001*5f39d1b3SJooyung Han 
5002*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x8.
5003*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
5004*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
5005*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
5006*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
5007*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
5008*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
5009*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
5010*5f39d1b3SJooyung Han       "vld1.32 {d7}, [r6]!\n"
5011*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5012*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
5013*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
5014*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
5015*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
5016*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
5017*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
5018*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
5019*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
5020*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
5021*5f39d1b3SJooyung Han 
5022*5f39d1b3SJooyung Han       "bne 1b\n"
5023*5f39d1b3SJooyung Han 
5024*5f39d1b3SJooyung Han       "2:"
5025*5f39d1b3SJooyung Han 
5026*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x2.
5027*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
5028*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
5029*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
5030*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
5031*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
5032*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
5033*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
5034*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
5035*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
5036*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
5037*5f39d1b3SJooyung Han       "vld1.16 {d2[0]}, [r1]!\n"
5038*5f39d1b3SJooyung Han       "vld1.16 {d3[0]}, [r2]!\n"
5039*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [r3]!\n"
5040*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [r4]!\n"
5041*5f39d1b3SJooyung Han       "vld1.16 {d6[0]}, [r5]!\n"
5042*5f39d1b3SJooyung Han       "vld1.16 {d7[0]}, [r6]!\n"
5043*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5044*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
5045*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
5046*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
5047*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
5048*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
5049*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
5050*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
5051*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
5052*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
5053*5f39d1b3SJooyung Han 
5054*5f39d1b3SJooyung Han       // Aggregator Reduction.
5055*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
5056*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
5057*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
5058*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
5059*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
5060*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
5061*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
5062*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
5063*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
5064*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
5065*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
5066*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
5067*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
5068*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
5069*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
5070*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
5071*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
5072*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
5073*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
5074*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
5075*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
5076*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
5077*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
5078*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
5079*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
5080*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
5081*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
5082*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
5083*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
5084*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
5085*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
5086*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
5087*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
5088*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "d0", "d1", "d2", "d3", "d4",
5089*5f39d1b3SJooyung Han         "d5", "d6", "d7", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
5090*5f39d1b3SJooyung Han         "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", "cc",
5091*5f39d1b3SJooyung Han         "memory");
5092*5f39d1b3SJooyung Han }
5093*5f39d1b3SJooyung Han 
5094*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)5095*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 3, RowMajorWithSum>::Pack(
5096*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
5097*5f39d1b3SJooyung Han #ifdef DEBUG
5098*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
5099*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
5100*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 8, 8, 3, RowMajorWithSum>::Pack()"
5101*5f39d1b3SJooyung Han             << std::endl
5102*5f39d1b3SJooyung Han             << std::flush;
5103*5f39d1b3SJooyung Han #endif
5104*5f39d1b3SJooyung Han #endif
5105*5f39d1b3SJooyung Han   int params_count_copy = params.count;
5106*5f39d1b3SJooyung Han   asm volatile(
5107*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
5108*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
5109*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
5110*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
5111*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
5112*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
5113*5f39d1b3SJooyung Han       "add r6, r5, %[stride]\n"
5114*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
5115*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
5116*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
5117*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
5118*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
5119*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
5120*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
5121*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
5122*5f39d1b3SJooyung Han 
5123*5f39d1b3SJooyung Han       // Reduce count by leftovers.
5124*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
5125*5f39d1b3SJooyung Han       "beq 2f\n"
5126*5f39d1b3SJooyung Han 
5127*5f39d1b3SJooyung Han       "1:"
5128*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
5129*5f39d1b3SJooyung Han 
5130*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x8.
5131*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
5132*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
5133*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
5134*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
5135*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
5136*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
5137*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
5138*5f39d1b3SJooyung Han       "vld1.32 {d7}, [r6]!\n"
5139*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5140*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
5141*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
5142*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
5143*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
5144*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
5145*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
5146*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
5147*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
5148*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
5149*5f39d1b3SJooyung Han 
5150*5f39d1b3SJooyung Han       "bne 1b\n"
5151*5f39d1b3SJooyung Han 
5152*5f39d1b3SJooyung Han       "2:"
5153*5f39d1b3SJooyung Han 
5154*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x3.
5155*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
5156*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
5157*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
5158*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
5159*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
5160*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
5161*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
5162*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
5163*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]]!\n"
5164*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]]!\n"
5165*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [r0]!\n"
5166*5f39d1b3SJooyung Han       "vld1.8 {d1[2]}, [r0]!\n"
5167*5f39d1b3SJooyung Han       "vld1.16 {d2[0]}, [r1]!\n"
5168*5f39d1b3SJooyung Han       "vld1.8 {d2[2]}, [r1]!\n"
5169*5f39d1b3SJooyung Han       "vld1.16 {d3[0]}, [r2]!\n"
5170*5f39d1b3SJooyung Han       "vld1.8 {d3[2]}, [r2]!\n"
5171*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [r3]!\n"
5172*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [r3]!\n"
5173*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [r4]!\n"
5174*5f39d1b3SJooyung Han       "vld1.8 {d5[2]}, [r4]!\n"
5175*5f39d1b3SJooyung Han       "vld1.16 {d6[0]}, [r5]!\n"
5176*5f39d1b3SJooyung Han       "vld1.8 {d6[2]}, [r5]!\n"
5177*5f39d1b3SJooyung Han       "vld1.16 {d7[0]}, [r6]!\n"
5178*5f39d1b3SJooyung Han       "vld1.8 {d7[2]}, [r6]!\n"
5179*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5180*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
5181*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
5182*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
5183*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
5184*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
5185*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
5186*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
5187*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
5188*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
5189*5f39d1b3SJooyung Han 
5190*5f39d1b3SJooyung Han       // Aggregator Reduction.
5191*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
5192*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
5193*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
5194*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
5195*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
5196*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
5197*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
5198*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
5199*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
5200*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
5201*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
5202*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
5203*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
5204*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
5205*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
5206*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
5207*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
5208*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
5209*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
5210*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
5211*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
5212*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
5213*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
5214*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
5215*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
5216*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
5217*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
5218*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
5219*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
5220*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
5221*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
5222*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
5223*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
5224*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "d0", "d1", "d2", "d3", "d4",
5225*5f39d1b3SJooyung Han         "d5", "d6", "d7", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
5226*5f39d1b3SJooyung Han         "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", "cc",
5227*5f39d1b3SJooyung Han         "memory");
5228*5f39d1b3SJooyung Han }
5229*5f39d1b3SJooyung Han 
5230*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)5231*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 4, RowMajorWithSum>::Pack(
5232*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
5233*5f39d1b3SJooyung Han #ifdef DEBUG
5234*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
5235*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
5236*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 8, 8, 4, RowMajorWithSum>::Pack()"
5237*5f39d1b3SJooyung Han             << std::endl
5238*5f39d1b3SJooyung Han             << std::flush;
5239*5f39d1b3SJooyung Han #endif
5240*5f39d1b3SJooyung Han #endif
5241*5f39d1b3SJooyung Han   int params_count_copy = params.count;
5242*5f39d1b3SJooyung Han   asm volatile(
5243*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
5244*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
5245*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
5246*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
5247*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
5248*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
5249*5f39d1b3SJooyung Han       "add r6, r5, %[stride]\n"
5250*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
5251*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
5252*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
5253*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
5254*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
5255*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
5256*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
5257*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
5258*5f39d1b3SJooyung Han 
5259*5f39d1b3SJooyung Han       // Reduce count by leftovers.
5260*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
5261*5f39d1b3SJooyung Han       "beq 2f\n"
5262*5f39d1b3SJooyung Han 
5263*5f39d1b3SJooyung Han       "1:"
5264*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
5265*5f39d1b3SJooyung Han 
5266*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x8.
5267*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
5268*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
5269*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
5270*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
5271*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
5272*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
5273*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
5274*5f39d1b3SJooyung Han       "vld1.32 {d7}, [r6]!\n"
5275*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5276*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
5277*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
5278*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
5279*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
5280*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
5281*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
5282*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
5283*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
5284*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
5285*5f39d1b3SJooyung Han 
5286*5f39d1b3SJooyung Han       "bne 1b\n"
5287*5f39d1b3SJooyung Han 
5288*5f39d1b3SJooyung Han       "2:"
5289*5f39d1b3SJooyung Han 
5290*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x4.
5291*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
5292*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
5293*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
5294*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
5295*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
5296*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
5297*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
5298*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
5299*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
5300*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
5301*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
5302*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
5303*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
5304*5f39d1b3SJooyung Han       "vld1.32 {d5[0]}, [r4]!\n"
5305*5f39d1b3SJooyung Han       "vld1.32 {d6[0]}, [r5]!\n"
5306*5f39d1b3SJooyung Han       "vld1.32 {d7[0]}, [r6]!\n"
5307*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5308*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
5309*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
5310*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
5311*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
5312*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
5313*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
5314*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
5315*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
5316*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
5317*5f39d1b3SJooyung Han 
5318*5f39d1b3SJooyung Han       // Aggregator Reduction.
5319*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
5320*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
5321*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
5322*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
5323*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
5324*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
5325*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
5326*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
5327*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
5328*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
5329*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
5330*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
5331*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
5332*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
5333*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
5334*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
5335*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
5336*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
5337*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
5338*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
5339*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
5340*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
5341*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
5342*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
5343*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
5344*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
5345*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
5346*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
5347*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
5348*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
5349*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
5350*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
5351*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
5352*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "d0", "d1", "d2", "d3", "d4",
5353*5f39d1b3SJooyung Han         "d5", "d6", "d7", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
5354*5f39d1b3SJooyung Han         "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", "cc",
5355*5f39d1b3SJooyung Han         "memory");
5356*5f39d1b3SJooyung Han }
5357*5f39d1b3SJooyung Han 
5358*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)5359*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 5, RowMajorWithSum>::Pack(
5360*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
5361*5f39d1b3SJooyung Han #ifdef DEBUG
5362*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
5363*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
5364*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 8, 8, 5, RowMajorWithSum>::Pack()"
5365*5f39d1b3SJooyung Han             << std::endl
5366*5f39d1b3SJooyung Han             << std::flush;
5367*5f39d1b3SJooyung Han #endif
5368*5f39d1b3SJooyung Han #endif
5369*5f39d1b3SJooyung Han   int params_count_copy = params.count;
5370*5f39d1b3SJooyung Han   asm volatile(
5371*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
5372*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
5373*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
5374*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
5375*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
5376*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
5377*5f39d1b3SJooyung Han       "add r6, r5, %[stride]\n"
5378*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
5379*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
5380*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
5381*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
5382*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
5383*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
5384*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
5385*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
5386*5f39d1b3SJooyung Han 
5387*5f39d1b3SJooyung Han       // Reduce count by leftovers.
5388*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
5389*5f39d1b3SJooyung Han       "beq 2f\n"
5390*5f39d1b3SJooyung Han 
5391*5f39d1b3SJooyung Han       "1:"
5392*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
5393*5f39d1b3SJooyung Han 
5394*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x8.
5395*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
5396*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
5397*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
5398*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
5399*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
5400*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
5401*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
5402*5f39d1b3SJooyung Han       "vld1.32 {d7}, [r6]!\n"
5403*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5404*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
5405*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
5406*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
5407*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
5408*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
5409*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
5410*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
5411*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
5412*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
5413*5f39d1b3SJooyung Han 
5414*5f39d1b3SJooyung Han       "bne 1b\n"
5415*5f39d1b3SJooyung Han 
5416*5f39d1b3SJooyung Han       "2:"
5417*5f39d1b3SJooyung Han 
5418*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x5.
5419*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
5420*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
5421*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
5422*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
5423*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
5424*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
5425*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
5426*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
5427*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
5428*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]]!\n"
5429*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
5430*5f39d1b3SJooyung Han       "vld1.8 {d1[4]}, [r0]!\n"
5431*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
5432*5f39d1b3SJooyung Han       "vld1.8 {d2[4]}, [r1]!\n"
5433*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
5434*5f39d1b3SJooyung Han       "vld1.8 {d3[4]}, [r2]!\n"
5435*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
5436*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [r3]!\n"
5437*5f39d1b3SJooyung Han       "vld1.32 {d5[0]}, [r4]!\n"
5438*5f39d1b3SJooyung Han       "vld1.8 {d5[4]}, [r4]!\n"
5439*5f39d1b3SJooyung Han       "vld1.32 {d6[0]}, [r5]!\n"
5440*5f39d1b3SJooyung Han       "vld1.8 {d6[4]}, [r5]!\n"
5441*5f39d1b3SJooyung Han       "vld1.32 {d7[0]}, [r6]!\n"
5442*5f39d1b3SJooyung Han       "vld1.8 {d7[4]}, [r6]!\n"
5443*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5444*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
5445*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
5446*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
5447*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
5448*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
5449*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
5450*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
5451*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
5452*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
5453*5f39d1b3SJooyung Han 
5454*5f39d1b3SJooyung Han       // Aggregator Reduction.
5455*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
5456*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
5457*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
5458*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
5459*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
5460*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
5461*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
5462*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
5463*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
5464*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
5465*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
5466*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
5467*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
5468*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
5469*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
5470*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
5471*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
5472*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
5473*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
5474*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
5475*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
5476*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
5477*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
5478*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
5479*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
5480*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
5481*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
5482*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
5483*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
5484*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
5485*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
5486*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
5487*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
5488*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "d0", "d1", "d2", "d3", "d4",
5489*5f39d1b3SJooyung Han         "d5", "d6", "d7", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
5490*5f39d1b3SJooyung Han         "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", "cc",
5491*5f39d1b3SJooyung Han         "memory");
5492*5f39d1b3SJooyung Han }
5493*5f39d1b3SJooyung Han 
5494*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)5495*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 6, RowMajorWithSum>::Pack(
5496*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
5497*5f39d1b3SJooyung Han #ifdef DEBUG
5498*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
5499*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
5500*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 8, 8, 6, RowMajorWithSum>::Pack()"
5501*5f39d1b3SJooyung Han             << std::endl
5502*5f39d1b3SJooyung Han             << std::flush;
5503*5f39d1b3SJooyung Han #endif
5504*5f39d1b3SJooyung Han #endif
5505*5f39d1b3SJooyung Han   int params_count_copy = params.count;
5506*5f39d1b3SJooyung Han   asm volatile(
5507*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
5508*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
5509*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
5510*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
5511*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
5512*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
5513*5f39d1b3SJooyung Han       "add r6, r5, %[stride]\n"
5514*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
5515*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
5516*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
5517*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
5518*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
5519*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
5520*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
5521*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
5522*5f39d1b3SJooyung Han 
5523*5f39d1b3SJooyung Han       // Reduce count by leftovers.
5524*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
5525*5f39d1b3SJooyung Han       "beq 2f\n"
5526*5f39d1b3SJooyung Han 
5527*5f39d1b3SJooyung Han       "1:"
5528*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
5529*5f39d1b3SJooyung Han 
5530*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x8.
5531*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
5532*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
5533*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
5534*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
5535*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
5536*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
5537*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
5538*5f39d1b3SJooyung Han       "vld1.32 {d7}, [r6]!\n"
5539*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5540*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
5541*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
5542*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
5543*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
5544*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
5545*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
5546*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
5547*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
5548*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
5549*5f39d1b3SJooyung Han 
5550*5f39d1b3SJooyung Han       "bne 1b\n"
5551*5f39d1b3SJooyung Han 
5552*5f39d1b3SJooyung Han       "2:"
5553*5f39d1b3SJooyung Han 
5554*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x6.
5555*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
5556*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
5557*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
5558*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
5559*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
5560*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
5561*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
5562*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
5563*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
5564*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
5565*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
5566*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
5567*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
5568*5f39d1b3SJooyung Han       "vld1.16 {d2[2]}, [r1]!\n"
5569*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
5570*5f39d1b3SJooyung Han       "vld1.16 {d3[2]}, [r2]!\n"
5571*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
5572*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [r3]!\n"
5573*5f39d1b3SJooyung Han       "vld1.32 {d5[0]}, [r4]!\n"
5574*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [r4]!\n"
5575*5f39d1b3SJooyung Han       "vld1.32 {d6[0]}, [r5]!\n"
5576*5f39d1b3SJooyung Han       "vld1.16 {d6[2]}, [r5]!\n"
5577*5f39d1b3SJooyung Han       "vld1.32 {d7[0]}, [r6]!\n"
5578*5f39d1b3SJooyung Han       "vld1.16 {d7[2]}, [r6]!\n"
5579*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5580*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
5581*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
5582*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
5583*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
5584*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
5585*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
5586*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
5587*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
5588*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
5589*5f39d1b3SJooyung Han 
5590*5f39d1b3SJooyung Han       // Aggregator Reduction.
5591*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
5592*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
5593*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
5594*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
5595*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
5596*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
5597*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
5598*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
5599*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
5600*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
5601*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
5602*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
5603*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
5604*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
5605*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
5606*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
5607*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
5608*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
5609*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
5610*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
5611*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
5612*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
5613*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
5614*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
5615*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
5616*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
5617*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
5618*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
5619*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
5620*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
5621*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
5622*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
5623*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
5624*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "d0", "d1", "d2", "d3", "d4",
5625*5f39d1b3SJooyung Han         "d5", "d6", "d7", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
5626*5f39d1b3SJooyung Han         "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", "cc",
5627*5f39d1b3SJooyung Han         "memory");
5628*5f39d1b3SJooyung Han }
5629*5f39d1b3SJooyung Han 
5630*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const RowMajorWithSum & params,uint8_t * out)5631*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 7, RowMajorWithSum>::Pack(
5632*5f39d1b3SJooyung Han     const uint8_t* in, const RowMajorWithSum& params, uint8_t* out) {
5633*5f39d1b3SJooyung Han #ifdef DEBUG
5634*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
5635*5f39d1b3SJooyung Han   std::cout << __FILE__ << "(" << __LINE__
5636*5f39d1b3SJooyung Han             << ") RowMajorWithSum<uint8_t, 8, 8, 7, RowMajorWithSum>::Pack()"
5637*5f39d1b3SJooyung Han             << std::endl
5638*5f39d1b3SJooyung Han             << std::flush;
5639*5f39d1b3SJooyung Han #endif
5640*5f39d1b3SJooyung Han #endif
5641*5f39d1b3SJooyung Han   int params_count_copy = params.count;
5642*5f39d1b3SJooyung Han   asm volatile(
5643*5f39d1b3SJooyung Han       "add r0, %[in], %[stride]\n"
5644*5f39d1b3SJooyung Han       "add r1, r0, %[stride]\n"
5645*5f39d1b3SJooyung Han       "add r2, r1, %[stride]\n"
5646*5f39d1b3SJooyung Han       "add r3, r2, %[stride]\n"
5647*5f39d1b3SJooyung Han       "add r4, r3, %[stride]\n"
5648*5f39d1b3SJooyung Han       "add r5, r4, %[stride]\n"
5649*5f39d1b3SJooyung Han       "add r6, r5, %[stride]\n"
5650*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
5651*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
5652*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
5653*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
5654*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
5655*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
5656*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
5657*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
5658*5f39d1b3SJooyung Han 
5659*5f39d1b3SJooyung Han       // Reduce count by leftovers.
5660*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
5661*5f39d1b3SJooyung Han       "beq 2f\n"
5662*5f39d1b3SJooyung Han 
5663*5f39d1b3SJooyung Han       "1:"
5664*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
5665*5f39d1b3SJooyung Han 
5666*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x8.
5667*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]]!\n"
5668*5f39d1b3SJooyung Han       "vld1.32 {d1}, [r0]!\n"
5669*5f39d1b3SJooyung Han       "vld1.32 {d2}, [r1]!\n"
5670*5f39d1b3SJooyung Han       "vld1.32 {d3}, [r2]!\n"
5671*5f39d1b3SJooyung Han       "vld1.32 {d4}, [r3]!\n"
5672*5f39d1b3SJooyung Han       "vld1.32 {d5}, [r4]!\n"
5673*5f39d1b3SJooyung Han       "vld1.32 {d6}, [r5]!\n"
5674*5f39d1b3SJooyung Han       "vld1.32 {d7}, [r6]!\n"
5675*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5676*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
5677*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
5678*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
5679*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
5680*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
5681*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
5682*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
5683*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
5684*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
5685*5f39d1b3SJooyung Han 
5686*5f39d1b3SJooyung Han       "bne 1b\n"
5687*5f39d1b3SJooyung Han 
5688*5f39d1b3SJooyung Han       "2:"
5689*5f39d1b3SJooyung Han 
5690*5f39d1b3SJooyung Han       // Load Aggregate Store: 8x7.
5691*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
5692*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
5693*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
5694*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
5695*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
5696*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
5697*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
5698*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
5699*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
5700*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]]!\n"
5701*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]]!\n"
5702*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [r0]!\n"
5703*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [r0]!\n"
5704*5f39d1b3SJooyung Han       "vld1.8 {d1[6]}, [r0]!\n"
5705*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [r1]!\n"
5706*5f39d1b3SJooyung Han       "vld1.16 {d2[2]}, [r1]!\n"
5707*5f39d1b3SJooyung Han       "vld1.8 {d2[6]}, [r1]!\n"
5708*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [r2]!\n"
5709*5f39d1b3SJooyung Han       "vld1.16 {d3[2]}, [r2]!\n"
5710*5f39d1b3SJooyung Han       "vld1.8 {d3[6]}, [r2]!\n"
5711*5f39d1b3SJooyung Han       "vld1.32 {d4[0]}, [r3]!\n"
5712*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [r3]!\n"
5713*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [r3]!\n"
5714*5f39d1b3SJooyung Han       "vld1.32 {d5[0]}, [r4]!\n"
5715*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [r4]!\n"
5716*5f39d1b3SJooyung Han       "vld1.8 {d5[6]}, [r4]!\n"
5717*5f39d1b3SJooyung Han       "vld1.32 {d6[0]}, [r5]!\n"
5718*5f39d1b3SJooyung Han       "vld1.16 {d6[2]}, [r5]!\n"
5719*5f39d1b3SJooyung Han       "vld1.8 {d6[6]}, [r5]!\n"
5720*5f39d1b3SJooyung Han       "vld1.32 {d7[0]}, [r6]!\n"
5721*5f39d1b3SJooyung Han       "vld1.16 {d7[2]}, [r6]!\n"
5722*5f39d1b3SJooyung Han       "vld1.8 {d7[6]}, [r6]!\n"
5723*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5724*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
5725*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
5726*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
5727*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
5728*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
5729*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
5730*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
5731*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
5732*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
5733*5f39d1b3SJooyung Han 
5734*5f39d1b3SJooyung Han       // Aggregator Reduction.
5735*5f39d1b3SJooyung Han       "ldr r0, %[multiplicative_sum_offset]\n"
5736*5f39d1b3SJooyung Han       "ldr r1, %[additive_sum_offset]\n"
5737*5f39d1b3SJooyung Han       "vmov.32 d0[0], r0\n"
5738*5f39d1b3SJooyung Han       "vdup.32 q1, r1\n"
5739*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
5740*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
5741*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
5742*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
5743*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
5744*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
5745*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
5746*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
5747*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
5748*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
5749*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
5750*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
5751*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
5752*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
5753*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
5754*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
5755*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
5756*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
5757*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
5758*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
5759*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
5760*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
5761*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
5762*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
5763*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
5764*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [in] "+r"(in), [out] "+r"(out)
5765*5f39d1b3SJooyung Han       : [stride] "r"(params.stride),
5766*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "m"(params.multiplicative_sum_offset),
5767*5f39d1b3SJooyung Han         [additive_sum_offset] "m"(params.additive_sum_offset)
5768*5f39d1b3SJooyung Han       : "r0", "r1", "r2", "r3", "r4", "r5", "r6", "d0", "d1", "d2", "d3", "d4",
5769*5f39d1b3SJooyung Han         "d5", "d6", "d7", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
5770*5f39d1b3SJooyung Han         "d23", "d24", "d25", "d26", "d27", "d28", "d29", "d30", "d31", "cc",
5771*5f39d1b3SJooyung Han         "memory");
5772*5f39d1b3SJooyung Han }
5773*5f39d1b3SJooyung Han 
5774*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)5775*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 0, ColumnMajorWithSum>::Pack(
5776*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
5777*5f39d1b3SJooyung Han #ifdef DEBUG
5778*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
5779*5f39d1b3SJooyung Han   std::cout
5780*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
5781*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 1, 8, 0, ColumnMajorWithSum>::Pack()"
5782*5f39d1b3SJooyung Han       << std::endl
5783*5f39d1b3SJooyung Han       << std::flush;
5784*5f39d1b3SJooyung Han #endif
5785*5f39d1b3SJooyung Han #endif
5786*5f39d1b3SJooyung Han   int params_count_copy = params.count;
5787*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
5788*5f39d1b3SJooyung Han   asm volatile(
5789*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
5790*5f39d1b3SJooyung Han 
5791*5f39d1b3SJooyung Han       "1:"
5792*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
5793*5f39d1b3SJooyung Han 
5794*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x8
5795*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
5796*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
5797*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
5798*5f39d1b3SJooyung Han       "vld1.8 {d0[3]}, [%[in]], %[stride]\n"
5799*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]], %[stride]\n"
5800*5f39d1b3SJooyung Han       "vld1.8 {d0[5]}, [%[in]], %[stride]\n"
5801*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]], %[stride]\n"
5802*5f39d1b3SJooyung Han       "vld1.8 {d0[7]}, [%[in]], %[stride]\n"
5803*5f39d1b3SJooyung Han       "pld [%[in]]\n"
5804*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5805*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
5806*5f39d1b3SJooyung Han 
5807*5f39d1b3SJooyung Han       "bne 1b\n"
5808*5f39d1b3SJooyung Han 
5809*5f39d1b3SJooyung Han       // Aggregator Reduction.
5810*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
5811*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
5812*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
5813*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
5814*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
5815*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
5816*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
5817*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
5818*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
5819*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
5820*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
5821*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
5822*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
5823*5f39d1b3SJooyung Han }
5824*5f39d1b3SJooyung Han 
5825*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)5826*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 1, ColumnMajorWithSum>::Pack(
5827*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
5828*5f39d1b3SJooyung Han #ifdef DEBUG
5829*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
5830*5f39d1b3SJooyung Han   std::cout
5831*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
5832*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 1, 8, 1, ColumnMajorWithSum>::Pack()"
5833*5f39d1b3SJooyung Han       << std::endl
5834*5f39d1b3SJooyung Han       << std::flush;
5835*5f39d1b3SJooyung Han #endif
5836*5f39d1b3SJooyung Han #endif
5837*5f39d1b3SJooyung Han   int params_count_copy = params.count;
5838*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
5839*5f39d1b3SJooyung Han   asm volatile(
5840*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
5841*5f39d1b3SJooyung Han 
5842*5f39d1b3SJooyung Han       // Reduce count by leftovers.
5843*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
5844*5f39d1b3SJooyung Han       "beq 2f\n"
5845*5f39d1b3SJooyung Han 
5846*5f39d1b3SJooyung Han       "1:"
5847*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
5848*5f39d1b3SJooyung Han 
5849*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x8
5850*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
5851*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
5852*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
5853*5f39d1b3SJooyung Han       "vld1.8 {d0[3]}, [%[in]], %[stride]\n"
5854*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]], %[stride]\n"
5855*5f39d1b3SJooyung Han       "vld1.8 {d0[5]}, [%[in]], %[stride]\n"
5856*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]], %[stride]\n"
5857*5f39d1b3SJooyung Han       "vld1.8 {d0[7]}, [%[in]], %[stride]\n"
5858*5f39d1b3SJooyung Han       "pld [%[in]]\n"
5859*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5860*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
5861*5f39d1b3SJooyung Han 
5862*5f39d1b3SJooyung Han       "bne 1b\n"
5863*5f39d1b3SJooyung Han 
5864*5f39d1b3SJooyung Han       "2:"
5865*5f39d1b3SJooyung Han 
5866*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x1
5867*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
5868*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
5869*5f39d1b3SJooyung Han       "pld [%[in]]\n"
5870*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5871*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
5872*5f39d1b3SJooyung Han 
5873*5f39d1b3SJooyung Han       // Aggregator Reduction.
5874*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
5875*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
5876*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
5877*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
5878*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
5879*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
5880*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
5881*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
5882*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
5883*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
5884*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
5885*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
5886*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
5887*5f39d1b3SJooyung Han }
5888*5f39d1b3SJooyung Han 
5889*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)5890*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 2, ColumnMajorWithSum>::Pack(
5891*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
5892*5f39d1b3SJooyung Han #ifdef DEBUG
5893*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
5894*5f39d1b3SJooyung Han   std::cout
5895*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
5896*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 1, 8, 2, ColumnMajorWithSum>::Pack()"
5897*5f39d1b3SJooyung Han       << std::endl
5898*5f39d1b3SJooyung Han       << std::flush;
5899*5f39d1b3SJooyung Han #endif
5900*5f39d1b3SJooyung Han #endif
5901*5f39d1b3SJooyung Han   int params_count_copy = params.count;
5902*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
5903*5f39d1b3SJooyung Han   asm volatile(
5904*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
5905*5f39d1b3SJooyung Han 
5906*5f39d1b3SJooyung Han       // Reduce count by leftovers.
5907*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
5908*5f39d1b3SJooyung Han       "beq 2f\n"
5909*5f39d1b3SJooyung Han 
5910*5f39d1b3SJooyung Han       "1:"
5911*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
5912*5f39d1b3SJooyung Han 
5913*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x8
5914*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
5915*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
5916*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
5917*5f39d1b3SJooyung Han       "vld1.8 {d0[3]}, [%[in]], %[stride]\n"
5918*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]], %[stride]\n"
5919*5f39d1b3SJooyung Han       "vld1.8 {d0[5]}, [%[in]], %[stride]\n"
5920*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]], %[stride]\n"
5921*5f39d1b3SJooyung Han       "vld1.8 {d0[7]}, [%[in]], %[stride]\n"
5922*5f39d1b3SJooyung Han       "pld [%[in]]\n"
5923*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5924*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
5925*5f39d1b3SJooyung Han 
5926*5f39d1b3SJooyung Han       "bne 1b\n"
5927*5f39d1b3SJooyung Han 
5928*5f39d1b3SJooyung Han       "2:"
5929*5f39d1b3SJooyung Han 
5930*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x2
5931*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
5932*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
5933*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
5934*5f39d1b3SJooyung Han       "pld [%[in]]\n"
5935*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5936*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
5937*5f39d1b3SJooyung Han 
5938*5f39d1b3SJooyung Han       // Aggregator Reduction.
5939*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
5940*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
5941*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
5942*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
5943*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
5944*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
5945*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
5946*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
5947*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
5948*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
5949*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
5950*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
5951*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
5952*5f39d1b3SJooyung Han }
5953*5f39d1b3SJooyung Han 
5954*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)5955*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 3, ColumnMajorWithSum>::Pack(
5956*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
5957*5f39d1b3SJooyung Han #ifdef DEBUG
5958*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
5959*5f39d1b3SJooyung Han   std::cout
5960*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
5961*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 1, 8, 3, ColumnMajorWithSum>::Pack()"
5962*5f39d1b3SJooyung Han       << std::endl
5963*5f39d1b3SJooyung Han       << std::flush;
5964*5f39d1b3SJooyung Han #endif
5965*5f39d1b3SJooyung Han #endif
5966*5f39d1b3SJooyung Han   int params_count_copy = params.count;
5967*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
5968*5f39d1b3SJooyung Han   asm volatile(
5969*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
5970*5f39d1b3SJooyung Han 
5971*5f39d1b3SJooyung Han       // Reduce count by leftovers.
5972*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
5973*5f39d1b3SJooyung Han       "beq 2f\n"
5974*5f39d1b3SJooyung Han 
5975*5f39d1b3SJooyung Han       "1:"
5976*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
5977*5f39d1b3SJooyung Han 
5978*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x8
5979*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
5980*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
5981*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
5982*5f39d1b3SJooyung Han       "vld1.8 {d0[3]}, [%[in]], %[stride]\n"
5983*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]], %[stride]\n"
5984*5f39d1b3SJooyung Han       "vld1.8 {d0[5]}, [%[in]], %[stride]\n"
5985*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]], %[stride]\n"
5986*5f39d1b3SJooyung Han       "vld1.8 {d0[7]}, [%[in]], %[stride]\n"
5987*5f39d1b3SJooyung Han       "pld [%[in]]\n"
5988*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
5989*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
5990*5f39d1b3SJooyung Han 
5991*5f39d1b3SJooyung Han       "bne 1b\n"
5992*5f39d1b3SJooyung Han 
5993*5f39d1b3SJooyung Han       "2:"
5994*5f39d1b3SJooyung Han 
5995*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x3
5996*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
5997*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
5998*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
5999*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
6000*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6001*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6002*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
6003*5f39d1b3SJooyung Han 
6004*5f39d1b3SJooyung Han       // Aggregator Reduction.
6005*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6006*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6007*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6008*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6009*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
6010*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6011*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6012*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
6013*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6014*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6015*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6016*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6017*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
6018*5f39d1b3SJooyung Han }
6019*5f39d1b3SJooyung Han 
6020*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6021*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 4, ColumnMajorWithSum>::Pack(
6022*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6023*5f39d1b3SJooyung Han #ifdef DEBUG
6024*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6025*5f39d1b3SJooyung Han   std::cout
6026*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6027*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 1, 8, 4, ColumnMajorWithSum>::Pack()"
6028*5f39d1b3SJooyung Han       << std::endl
6029*5f39d1b3SJooyung Han       << std::flush;
6030*5f39d1b3SJooyung Han #endif
6031*5f39d1b3SJooyung Han #endif
6032*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6033*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6034*5f39d1b3SJooyung Han   asm volatile(
6035*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6036*5f39d1b3SJooyung Han 
6037*5f39d1b3SJooyung Han       // Reduce count by leftovers.
6038*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
6039*5f39d1b3SJooyung Han       "beq 2f\n"
6040*5f39d1b3SJooyung Han 
6041*5f39d1b3SJooyung Han       "1:"
6042*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6043*5f39d1b3SJooyung Han 
6044*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x8
6045*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
6046*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
6047*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
6048*5f39d1b3SJooyung Han       "vld1.8 {d0[3]}, [%[in]], %[stride]\n"
6049*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]], %[stride]\n"
6050*5f39d1b3SJooyung Han       "vld1.8 {d0[5]}, [%[in]], %[stride]\n"
6051*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]], %[stride]\n"
6052*5f39d1b3SJooyung Han       "vld1.8 {d0[7]}, [%[in]], %[stride]\n"
6053*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6054*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6055*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
6056*5f39d1b3SJooyung Han 
6057*5f39d1b3SJooyung Han       "bne 1b\n"
6058*5f39d1b3SJooyung Han 
6059*5f39d1b3SJooyung Han       "2:"
6060*5f39d1b3SJooyung Han 
6061*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x4
6062*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
6063*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
6064*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
6065*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
6066*5f39d1b3SJooyung Han       "vld1.8 {d0[3]}, [%[in]], %[stride]\n"
6067*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6068*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6069*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
6070*5f39d1b3SJooyung Han 
6071*5f39d1b3SJooyung Han       // Aggregator Reduction.
6072*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6073*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6074*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6075*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6076*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
6077*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6078*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6079*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
6080*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6081*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6082*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6083*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6084*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
6085*5f39d1b3SJooyung Han }
6086*5f39d1b3SJooyung Han 
6087*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6088*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 5, ColumnMajorWithSum>::Pack(
6089*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6090*5f39d1b3SJooyung Han #ifdef DEBUG
6091*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6092*5f39d1b3SJooyung Han   std::cout
6093*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6094*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 1, 8, 5, ColumnMajorWithSum>::Pack()"
6095*5f39d1b3SJooyung Han       << std::endl
6096*5f39d1b3SJooyung Han       << std::flush;
6097*5f39d1b3SJooyung Han #endif
6098*5f39d1b3SJooyung Han #endif
6099*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6100*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6101*5f39d1b3SJooyung Han   asm volatile(
6102*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6103*5f39d1b3SJooyung Han 
6104*5f39d1b3SJooyung Han       // Reduce count by leftovers.
6105*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
6106*5f39d1b3SJooyung Han       "beq 2f\n"
6107*5f39d1b3SJooyung Han 
6108*5f39d1b3SJooyung Han       "1:"
6109*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6110*5f39d1b3SJooyung Han 
6111*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x8
6112*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
6113*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
6114*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
6115*5f39d1b3SJooyung Han       "vld1.8 {d0[3]}, [%[in]], %[stride]\n"
6116*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]], %[stride]\n"
6117*5f39d1b3SJooyung Han       "vld1.8 {d0[5]}, [%[in]], %[stride]\n"
6118*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]], %[stride]\n"
6119*5f39d1b3SJooyung Han       "vld1.8 {d0[7]}, [%[in]], %[stride]\n"
6120*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6121*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6122*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
6123*5f39d1b3SJooyung Han 
6124*5f39d1b3SJooyung Han       "bne 1b\n"
6125*5f39d1b3SJooyung Han 
6126*5f39d1b3SJooyung Han       "2:"
6127*5f39d1b3SJooyung Han 
6128*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x5
6129*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
6130*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
6131*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
6132*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
6133*5f39d1b3SJooyung Han       "vld1.8 {d0[3]}, [%[in]], %[stride]\n"
6134*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]], %[stride]\n"
6135*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6136*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6137*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
6138*5f39d1b3SJooyung Han 
6139*5f39d1b3SJooyung Han       // Aggregator Reduction.
6140*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6141*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6142*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6143*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6144*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
6145*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6146*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6147*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
6148*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6149*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6150*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6151*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6152*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
6153*5f39d1b3SJooyung Han }
6154*5f39d1b3SJooyung Han 
6155*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6156*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 6, ColumnMajorWithSum>::Pack(
6157*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6158*5f39d1b3SJooyung Han #ifdef DEBUG
6159*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6160*5f39d1b3SJooyung Han   std::cout
6161*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6162*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 1, 8, 6, ColumnMajorWithSum>::Pack()"
6163*5f39d1b3SJooyung Han       << std::endl
6164*5f39d1b3SJooyung Han       << std::flush;
6165*5f39d1b3SJooyung Han #endif
6166*5f39d1b3SJooyung Han #endif
6167*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6168*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6169*5f39d1b3SJooyung Han   asm volatile(
6170*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6171*5f39d1b3SJooyung Han 
6172*5f39d1b3SJooyung Han       // Reduce count by leftovers.
6173*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
6174*5f39d1b3SJooyung Han       "beq 2f\n"
6175*5f39d1b3SJooyung Han 
6176*5f39d1b3SJooyung Han       "1:"
6177*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6178*5f39d1b3SJooyung Han 
6179*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x8
6180*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
6181*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
6182*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
6183*5f39d1b3SJooyung Han       "vld1.8 {d0[3]}, [%[in]], %[stride]\n"
6184*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]], %[stride]\n"
6185*5f39d1b3SJooyung Han       "vld1.8 {d0[5]}, [%[in]], %[stride]\n"
6186*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]], %[stride]\n"
6187*5f39d1b3SJooyung Han       "vld1.8 {d0[7]}, [%[in]], %[stride]\n"
6188*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6189*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6190*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
6191*5f39d1b3SJooyung Han 
6192*5f39d1b3SJooyung Han       "bne 1b\n"
6193*5f39d1b3SJooyung Han 
6194*5f39d1b3SJooyung Han       "2:"
6195*5f39d1b3SJooyung Han 
6196*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x6
6197*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
6198*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
6199*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
6200*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
6201*5f39d1b3SJooyung Han       "vld1.8 {d0[3]}, [%[in]], %[stride]\n"
6202*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]], %[stride]\n"
6203*5f39d1b3SJooyung Han       "vld1.8 {d0[5]}, [%[in]], %[stride]\n"
6204*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6205*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6206*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
6207*5f39d1b3SJooyung Han 
6208*5f39d1b3SJooyung Han       // Aggregator Reduction.
6209*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6210*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6211*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6212*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6213*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
6214*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6215*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6216*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
6217*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6218*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6219*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6220*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6221*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
6222*5f39d1b3SJooyung Han }
6223*5f39d1b3SJooyung Han 
6224*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6225*5f39d1b3SJooyung Han inline void Stream<uint8_t, 1, 8, 7, ColumnMajorWithSum>::Pack(
6226*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6227*5f39d1b3SJooyung Han #ifdef DEBUG
6228*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6229*5f39d1b3SJooyung Han   std::cout
6230*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6231*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 1, 8, 7, ColumnMajorWithSum>::Pack()"
6232*5f39d1b3SJooyung Han       << std::endl
6233*5f39d1b3SJooyung Han       << std::flush;
6234*5f39d1b3SJooyung Han #endif
6235*5f39d1b3SJooyung Han #endif
6236*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6237*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6238*5f39d1b3SJooyung Han   asm volatile(
6239*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6240*5f39d1b3SJooyung Han 
6241*5f39d1b3SJooyung Han       // Reduce count by leftovers.
6242*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
6243*5f39d1b3SJooyung Han       "beq 2f\n"
6244*5f39d1b3SJooyung Han 
6245*5f39d1b3SJooyung Han       "1:"
6246*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6247*5f39d1b3SJooyung Han 
6248*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x8
6249*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
6250*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
6251*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
6252*5f39d1b3SJooyung Han       "vld1.8 {d0[3]}, [%[in]], %[stride]\n"
6253*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]], %[stride]\n"
6254*5f39d1b3SJooyung Han       "vld1.8 {d0[5]}, [%[in]], %[stride]\n"
6255*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]], %[stride]\n"
6256*5f39d1b3SJooyung Han       "vld1.8 {d0[7]}, [%[in]], %[stride]\n"
6257*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6258*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6259*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
6260*5f39d1b3SJooyung Han 
6261*5f39d1b3SJooyung Han       "bne 1b\n"
6262*5f39d1b3SJooyung Han 
6263*5f39d1b3SJooyung Han       "2:"
6264*5f39d1b3SJooyung Han 
6265*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 1x7
6266*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
6267*5f39d1b3SJooyung Han       "vld1.8 {d0[0]}, [%[in]], %[stride]\n"
6268*5f39d1b3SJooyung Han       "vld1.8 {d0[1]}, [%[in]], %[stride]\n"
6269*5f39d1b3SJooyung Han       "vld1.8 {d0[2]}, [%[in]], %[stride]\n"
6270*5f39d1b3SJooyung Han       "vld1.8 {d0[3]}, [%[in]], %[stride]\n"
6271*5f39d1b3SJooyung Han       "vld1.8 {d0[4]}, [%[in]], %[stride]\n"
6272*5f39d1b3SJooyung Han       "vld1.8 {d0[5]}, [%[in]], %[stride]\n"
6273*5f39d1b3SJooyung Han       "vld1.8 {d0[6]}, [%[in]], %[stride]\n"
6274*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6275*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6276*5f39d1b3SJooyung Han       "vst1.32 {d0}, [%[out]:64]!\n"
6277*5f39d1b3SJooyung Han 
6278*5f39d1b3SJooyung Han       // Aggregator Reduction.
6279*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6280*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6281*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6282*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6283*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d16\n"
6284*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6285*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6286*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
6287*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6288*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6289*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6290*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6291*5f39d1b3SJooyung Han       : "d0", "d2", "d3", "d16", "d17", "cc", "memory");
6292*5f39d1b3SJooyung Han }
6293*5f39d1b3SJooyung Han 
6294*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6295*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 0, ColumnMajorWithSum>::Pack(
6296*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6297*5f39d1b3SJooyung Han #ifdef DEBUG
6298*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6299*5f39d1b3SJooyung Han   std::cout
6300*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6301*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 2, 8, 0, ColumnMajorWithSum>::Pack()"
6302*5f39d1b3SJooyung Han       << std::endl
6303*5f39d1b3SJooyung Han       << std::flush;
6304*5f39d1b3SJooyung Han #endif
6305*5f39d1b3SJooyung Han #endif
6306*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6307*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6308*5f39d1b3SJooyung Han   asm volatile(
6309*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6310*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
6311*5f39d1b3SJooyung Han 
6312*5f39d1b3SJooyung Han       "1:"
6313*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6314*5f39d1b3SJooyung Han 
6315*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x8
6316*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6317*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6318*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6319*5f39d1b3SJooyung Han       "vld1.16 {d0[3]}, [%[in]], %[stride]\n"
6320*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [%[in]], %[stride]\n"
6321*5f39d1b3SJooyung Han       "vld1.16 {d1[1]}, [%[in]], %[stride]\n"
6322*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [%[in]], %[stride]\n"
6323*5f39d1b3SJooyung Han       "vld1.16 {d1[3]}, [%[in]], %[stride]\n"
6324*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6325*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6326*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6327*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6328*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6329*5f39d1b3SJooyung Han 
6330*5f39d1b3SJooyung Han       "bne 1b\n"
6331*5f39d1b3SJooyung Han 
6332*5f39d1b3SJooyung Han       // Aggregator Reduction.
6333*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6334*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6335*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6336*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
6337*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6338*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
6339*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
6340*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6341*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6342*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
6343*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6344*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6345*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6346*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6347*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc", "memory");
6348*5f39d1b3SJooyung Han }
6349*5f39d1b3SJooyung Han 
6350*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6351*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 1, ColumnMajorWithSum>::Pack(
6352*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6353*5f39d1b3SJooyung Han #ifdef DEBUG
6354*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6355*5f39d1b3SJooyung Han   std::cout
6356*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6357*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 2, 8, 1, ColumnMajorWithSum>::Pack()"
6358*5f39d1b3SJooyung Han       << std::endl
6359*5f39d1b3SJooyung Han       << std::flush;
6360*5f39d1b3SJooyung Han #endif
6361*5f39d1b3SJooyung Han #endif
6362*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6363*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6364*5f39d1b3SJooyung Han   asm volatile(
6365*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6366*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
6367*5f39d1b3SJooyung Han 
6368*5f39d1b3SJooyung Han       // Reduce count by leftovers.
6369*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
6370*5f39d1b3SJooyung Han       "beq 2f\n"
6371*5f39d1b3SJooyung Han 
6372*5f39d1b3SJooyung Han       "1:"
6373*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6374*5f39d1b3SJooyung Han 
6375*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x8
6376*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6377*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6378*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6379*5f39d1b3SJooyung Han       "vld1.16 {d0[3]}, [%[in]], %[stride]\n"
6380*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [%[in]], %[stride]\n"
6381*5f39d1b3SJooyung Han       "vld1.16 {d1[1]}, [%[in]], %[stride]\n"
6382*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [%[in]], %[stride]\n"
6383*5f39d1b3SJooyung Han       "vld1.16 {d1[3]}, [%[in]], %[stride]\n"
6384*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6385*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6386*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6387*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6388*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6389*5f39d1b3SJooyung Han 
6390*5f39d1b3SJooyung Han       "bne 1b\n"
6391*5f39d1b3SJooyung Han 
6392*5f39d1b3SJooyung Han       "2:"
6393*5f39d1b3SJooyung Han 
6394*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x1
6395*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
6396*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
6397*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6398*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6399*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6400*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6401*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6402*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6403*5f39d1b3SJooyung Han 
6404*5f39d1b3SJooyung Han       // Aggregator Reduction.
6405*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6406*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6407*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6408*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
6409*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6410*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
6411*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
6412*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6413*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6414*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
6415*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6416*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6417*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6418*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6419*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc", "memory");
6420*5f39d1b3SJooyung Han }
6421*5f39d1b3SJooyung Han 
6422*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6423*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 2, ColumnMajorWithSum>::Pack(
6424*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6425*5f39d1b3SJooyung Han #ifdef DEBUG
6426*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6427*5f39d1b3SJooyung Han   std::cout
6428*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6429*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 2, 8, 2, ColumnMajorWithSum>::Pack()"
6430*5f39d1b3SJooyung Han       << std::endl
6431*5f39d1b3SJooyung Han       << std::flush;
6432*5f39d1b3SJooyung Han #endif
6433*5f39d1b3SJooyung Han #endif
6434*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6435*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6436*5f39d1b3SJooyung Han   asm volatile(
6437*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6438*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
6439*5f39d1b3SJooyung Han 
6440*5f39d1b3SJooyung Han       // Reduce count by leftovers.
6441*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
6442*5f39d1b3SJooyung Han       "beq 2f\n"
6443*5f39d1b3SJooyung Han 
6444*5f39d1b3SJooyung Han       "1:"
6445*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6446*5f39d1b3SJooyung Han 
6447*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x8
6448*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6449*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6450*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6451*5f39d1b3SJooyung Han       "vld1.16 {d0[3]}, [%[in]], %[stride]\n"
6452*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [%[in]], %[stride]\n"
6453*5f39d1b3SJooyung Han       "vld1.16 {d1[1]}, [%[in]], %[stride]\n"
6454*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [%[in]], %[stride]\n"
6455*5f39d1b3SJooyung Han       "vld1.16 {d1[3]}, [%[in]], %[stride]\n"
6456*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6457*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6458*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6459*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6460*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6461*5f39d1b3SJooyung Han 
6462*5f39d1b3SJooyung Han       "bne 1b\n"
6463*5f39d1b3SJooyung Han 
6464*5f39d1b3SJooyung Han       "2:"
6465*5f39d1b3SJooyung Han 
6466*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x2
6467*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
6468*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
6469*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6470*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6471*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6472*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6473*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6474*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6475*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6476*5f39d1b3SJooyung Han 
6477*5f39d1b3SJooyung Han       // Aggregator Reduction.
6478*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6479*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6480*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6481*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
6482*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6483*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
6484*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
6485*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6486*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6487*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
6488*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6489*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6490*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6491*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6492*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc", "memory");
6493*5f39d1b3SJooyung Han }
6494*5f39d1b3SJooyung Han 
6495*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6496*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 3, ColumnMajorWithSum>::Pack(
6497*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6498*5f39d1b3SJooyung Han #ifdef DEBUG
6499*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6500*5f39d1b3SJooyung Han   std::cout
6501*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6502*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 2, 8, 3, ColumnMajorWithSum>::Pack()"
6503*5f39d1b3SJooyung Han       << std::endl
6504*5f39d1b3SJooyung Han       << std::flush;
6505*5f39d1b3SJooyung Han #endif
6506*5f39d1b3SJooyung Han #endif
6507*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6508*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6509*5f39d1b3SJooyung Han   asm volatile(
6510*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6511*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
6512*5f39d1b3SJooyung Han 
6513*5f39d1b3SJooyung Han       // Reduce count by leftovers.
6514*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
6515*5f39d1b3SJooyung Han       "beq 2f\n"
6516*5f39d1b3SJooyung Han 
6517*5f39d1b3SJooyung Han       "1:"
6518*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6519*5f39d1b3SJooyung Han 
6520*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x8
6521*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6522*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6523*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6524*5f39d1b3SJooyung Han       "vld1.16 {d0[3]}, [%[in]], %[stride]\n"
6525*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [%[in]], %[stride]\n"
6526*5f39d1b3SJooyung Han       "vld1.16 {d1[1]}, [%[in]], %[stride]\n"
6527*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [%[in]], %[stride]\n"
6528*5f39d1b3SJooyung Han       "vld1.16 {d1[3]}, [%[in]], %[stride]\n"
6529*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6530*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6531*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6532*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6533*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6534*5f39d1b3SJooyung Han 
6535*5f39d1b3SJooyung Han       "bne 1b\n"
6536*5f39d1b3SJooyung Han 
6537*5f39d1b3SJooyung Han       "2:"
6538*5f39d1b3SJooyung Han 
6539*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x3
6540*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
6541*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
6542*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6543*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6544*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6545*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6546*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6547*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6548*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6549*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6550*5f39d1b3SJooyung Han 
6551*5f39d1b3SJooyung Han       // Aggregator Reduction.
6552*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6553*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6554*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6555*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
6556*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6557*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
6558*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
6559*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6560*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6561*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
6562*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6563*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6564*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6565*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6566*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc", "memory");
6567*5f39d1b3SJooyung Han }
6568*5f39d1b3SJooyung Han 
6569*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6570*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 4, ColumnMajorWithSum>::Pack(
6571*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6572*5f39d1b3SJooyung Han #ifdef DEBUG
6573*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6574*5f39d1b3SJooyung Han   std::cout
6575*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6576*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 2, 8, 4, ColumnMajorWithSum>::Pack()"
6577*5f39d1b3SJooyung Han       << std::endl
6578*5f39d1b3SJooyung Han       << std::flush;
6579*5f39d1b3SJooyung Han #endif
6580*5f39d1b3SJooyung Han #endif
6581*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6582*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6583*5f39d1b3SJooyung Han   asm volatile(
6584*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6585*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
6586*5f39d1b3SJooyung Han 
6587*5f39d1b3SJooyung Han       // Reduce count by leftovers.
6588*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
6589*5f39d1b3SJooyung Han       "beq 2f\n"
6590*5f39d1b3SJooyung Han 
6591*5f39d1b3SJooyung Han       "1:"
6592*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6593*5f39d1b3SJooyung Han 
6594*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x8
6595*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6596*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6597*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6598*5f39d1b3SJooyung Han       "vld1.16 {d0[3]}, [%[in]], %[stride]\n"
6599*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [%[in]], %[stride]\n"
6600*5f39d1b3SJooyung Han       "vld1.16 {d1[1]}, [%[in]], %[stride]\n"
6601*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [%[in]], %[stride]\n"
6602*5f39d1b3SJooyung Han       "vld1.16 {d1[3]}, [%[in]], %[stride]\n"
6603*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6604*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6605*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6606*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6607*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6608*5f39d1b3SJooyung Han 
6609*5f39d1b3SJooyung Han       "bne 1b\n"
6610*5f39d1b3SJooyung Han 
6611*5f39d1b3SJooyung Han       "2:"
6612*5f39d1b3SJooyung Han 
6613*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x4
6614*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
6615*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
6616*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6617*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6618*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6619*5f39d1b3SJooyung Han       "vld1.16 {d0[3]}, [%[in]], %[stride]\n"
6620*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6621*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6622*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6623*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6624*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6625*5f39d1b3SJooyung Han 
6626*5f39d1b3SJooyung Han       // Aggregator Reduction.
6627*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6628*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6629*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6630*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
6631*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6632*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
6633*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
6634*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6635*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6636*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
6637*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6638*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6639*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6640*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6641*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc", "memory");
6642*5f39d1b3SJooyung Han }
6643*5f39d1b3SJooyung Han 
6644*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6645*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 5, ColumnMajorWithSum>::Pack(
6646*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6647*5f39d1b3SJooyung Han #ifdef DEBUG
6648*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6649*5f39d1b3SJooyung Han   std::cout
6650*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6651*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 2, 8, 5, ColumnMajorWithSum>::Pack()"
6652*5f39d1b3SJooyung Han       << std::endl
6653*5f39d1b3SJooyung Han       << std::flush;
6654*5f39d1b3SJooyung Han #endif
6655*5f39d1b3SJooyung Han #endif
6656*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6657*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6658*5f39d1b3SJooyung Han   asm volatile(
6659*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6660*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
6661*5f39d1b3SJooyung Han 
6662*5f39d1b3SJooyung Han       // Reduce count by leftovers.
6663*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
6664*5f39d1b3SJooyung Han       "beq 2f\n"
6665*5f39d1b3SJooyung Han 
6666*5f39d1b3SJooyung Han       "1:"
6667*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6668*5f39d1b3SJooyung Han 
6669*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x8
6670*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6671*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6672*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6673*5f39d1b3SJooyung Han       "vld1.16 {d0[3]}, [%[in]], %[stride]\n"
6674*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [%[in]], %[stride]\n"
6675*5f39d1b3SJooyung Han       "vld1.16 {d1[1]}, [%[in]], %[stride]\n"
6676*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [%[in]], %[stride]\n"
6677*5f39d1b3SJooyung Han       "vld1.16 {d1[3]}, [%[in]], %[stride]\n"
6678*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6679*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6680*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6681*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6682*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6683*5f39d1b3SJooyung Han 
6684*5f39d1b3SJooyung Han       "bne 1b\n"
6685*5f39d1b3SJooyung Han 
6686*5f39d1b3SJooyung Han       "2:"
6687*5f39d1b3SJooyung Han 
6688*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x5
6689*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
6690*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
6691*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6692*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6693*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6694*5f39d1b3SJooyung Han       "vld1.16 {d0[3]}, [%[in]], %[stride]\n"
6695*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [%[in]], %[stride]\n"
6696*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6697*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6698*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6699*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6700*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6701*5f39d1b3SJooyung Han 
6702*5f39d1b3SJooyung Han       // Aggregator Reduction.
6703*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6704*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6705*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6706*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
6707*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6708*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
6709*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
6710*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6711*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6712*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
6713*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6714*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6715*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6716*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6717*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc", "memory");
6718*5f39d1b3SJooyung Han }
6719*5f39d1b3SJooyung Han 
6720*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6721*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 6, ColumnMajorWithSum>::Pack(
6722*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6723*5f39d1b3SJooyung Han #ifdef DEBUG
6724*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6725*5f39d1b3SJooyung Han   std::cout
6726*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6727*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 2, 8, 6, ColumnMajorWithSum>::Pack()"
6728*5f39d1b3SJooyung Han       << std::endl
6729*5f39d1b3SJooyung Han       << std::flush;
6730*5f39d1b3SJooyung Han #endif
6731*5f39d1b3SJooyung Han #endif
6732*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6733*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6734*5f39d1b3SJooyung Han   asm volatile(
6735*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6736*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
6737*5f39d1b3SJooyung Han 
6738*5f39d1b3SJooyung Han       // Reduce count by leftovers.
6739*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
6740*5f39d1b3SJooyung Han       "beq 2f\n"
6741*5f39d1b3SJooyung Han 
6742*5f39d1b3SJooyung Han       "1:"
6743*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6744*5f39d1b3SJooyung Han 
6745*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x8
6746*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6747*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6748*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6749*5f39d1b3SJooyung Han       "vld1.16 {d0[3]}, [%[in]], %[stride]\n"
6750*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [%[in]], %[stride]\n"
6751*5f39d1b3SJooyung Han       "vld1.16 {d1[1]}, [%[in]], %[stride]\n"
6752*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [%[in]], %[stride]\n"
6753*5f39d1b3SJooyung Han       "vld1.16 {d1[3]}, [%[in]], %[stride]\n"
6754*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6755*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6756*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6757*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6758*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6759*5f39d1b3SJooyung Han 
6760*5f39d1b3SJooyung Han       "bne 1b\n"
6761*5f39d1b3SJooyung Han 
6762*5f39d1b3SJooyung Han       "2:"
6763*5f39d1b3SJooyung Han 
6764*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x6
6765*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
6766*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
6767*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6768*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6769*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6770*5f39d1b3SJooyung Han       "vld1.16 {d0[3]}, [%[in]], %[stride]\n"
6771*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [%[in]], %[stride]\n"
6772*5f39d1b3SJooyung Han       "vld1.16 {d1[1]}, [%[in]], %[stride]\n"
6773*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6774*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6775*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6776*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6777*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6778*5f39d1b3SJooyung Han 
6779*5f39d1b3SJooyung Han       // Aggregator Reduction.
6780*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6781*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6782*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6783*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
6784*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6785*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
6786*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
6787*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6788*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6789*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
6790*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6791*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6792*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6793*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6794*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc", "memory");
6795*5f39d1b3SJooyung Han }
6796*5f39d1b3SJooyung Han 
6797*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6798*5f39d1b3SJooyung Han inline void Stream<uint8_t, 2, 8, 7, ColumnMajorWithSum>::Pack(
6799*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6800*5f39d1b3SJooyung Han #ifdef DEBUG
6801*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6802*5f39d1b3SJooyung Han   std::cout
6803*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6804*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 2, 8, 7, ColumnMajorWithSum>::Pack()"
6805*5f39d1b3SJooyung Han       << std::endl
6806*5f39d1b3SJooyung Han       << std::flush;
6807*5f39d1b3SJooyung Han #endif
6808*5f39d1b3SJooyung Han #endif
6809*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6810*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6811*5f39d1b3SJooyung Han   asm volatile(
6812*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6813*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
6814*5f39d1b3SJooyung Han 
6815*5f39d1b3SJooyung Han       // Reduce count by leftovers.
6816*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
6817*5f39d1b3SJooyung Han       "beq 2f\n"
6818*5f39d1b3SJooyung Han 
6819*5f39d1b3SJooyung Han       "1:"
6820*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6821*5f39d1b3SJooyung Han 
6822*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x8
6823*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6824*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6825*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6826*5f39d1b3SJooyung Han       "vld1.16 {d0[3]}, [%[in]], %[stride]\n"
6827*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [%[in]], %[stride]\n"
6828*5f39d1b3SJooyung Han       "vld1.16 {d1[1]}, [%[in]], %[stride]\n"
6829*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [%[in]], %[stride]\n"
6830*5f39d1b3SJooyung Han       "vld1.16 {d1[3]}, [%[in]], %[stride]\n"
6831*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6832*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6833*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6834*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6835*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6836*5f39d1b3SJooyung Han 
6837*5f39d1b3SJooyung Han       "bne 1b\n"
6838*5f39d1b3SJooyung Han 
6839*5f39d1b3SJooyung Han       "2:"
6840*5f39d1b3SJooyung Han 
6841*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 2x7
6842*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
6843*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
6844*5f39d1b3SJooyung Han       "vld1.16 {d0[0]}, [%[in]], %[stride]\n"
6845*5f39d1b3SJooyung Han       "vld1.16 {d0[1]}, [%[in]], %[stride]\n"
6846*5f39d1b3SJooyung Han       "vld1.16 {d0[2]}, [%[in]], %[stride]\n"
6847*5f39d1b3SJooyung Han       "vld1.16 {d0[3]}, [%[in]], %[stride]\n"
6848*5f39d1b3SJooyung Han       "vld1.16 {d1[0]}, [%[in]], %[stride]\n"
6849*5f39d1b3SJooyung Han       "vld1.16 {d1[1]}, [%[in]], %[stride]\n"
6850*5f39d1b3SJooyung Han       "vld1.16 {d1[2]}, [%[in]], %[stride]\n"
6851*5f39d1b3SJooyung Han       "pld [%[in]]\n"
6852*5f39d1b3SJooyung Han       "vuzp.8 d0, d1\n"
6853*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6854*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6855*5f39d1b3SJooyung Han       "vst1.32 {d0, d1}, [%[out]:128]!\n"
6856*5f39d1b3SJooyung Han 
6857*5f39d1b3SJooyung Han       // Aggregator Reduction.
6858*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6859*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6860*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6861*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
6862*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6863*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
6864*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
6865*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6866*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6867*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
6868*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6869*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6870*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6871*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6872*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "cc", "memory");
6873*5f39d1b3SJooyung Han }
6874*5f39d1b3SJooyung Han 
6875*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6876*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 0, ColumnMajorWithSum>::Pack(
6877*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6878*5f39d1b3SJooyung Han #ifdef DEBUG
6879*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6880*5f39d1b3SJooyung Han   std::cout
6881*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6882*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 3, 8, 0, ColumnMajorWithSum>::Pack()"
6883*5f39d1b3SJooyung Han       << std::endl
6884*5f39d1b3SJooyung Han       << std::flush;
6885*5f39d1b3SJooyung Han #endif
6886*5f39d1b3SJooyung Han #endif
6887*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6888*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6889*5f39d1b3SJooyung Han   asm volatile(
6890*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6891*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
6892*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
6893*5f39d1b3SJooyung Han 
6894*5f39d1b3SJooyung Han       "1:"
6895*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6896*5f39d1b3SJooyung Han 
6897*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x8
6898*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
6899*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
6900*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
6901*5f39d1b3SJooyung Han       "vld3.8 {d0[3], d1[3], d2[3]}, [%[in]], %[stride]\n"
6902*5f39d1b3SJooyung Han       "vld3.8 {d0[4], d1[4], d2[4]}, [%[in]], %[stride]\n"
6903*5f39d1b3SJooyung Han       "vld3.8 {d0[5], d1[5], d2[5]}, [%[in]], %[stride]\n"
6904*5f39d1b3SJooyung Han       "vld3.8 {d0[6], d1[6], d2[6]}, [%[in]], %[stride]\n"
6905*5f39d1b3SJooyung Han       "vld3.8 {d0[7], d1[7], d2[7]}, [%[in]], %[stride]\n"
6906*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6907*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6908*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
6909*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
6910*5f39d1b3SJooyung Han 
6911*5f39d1b3SJooyung Han       "bne 1b\n"
6912*5f39d1b3SJooyung Han 
6913*5f39d1b3SJooyung Han       // Aggregator Reduction.
6914*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6915*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6916*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6917*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
6918*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
6919*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6920*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
6921*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
6922*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
6923*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
6924*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
6925*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
6926*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
6927*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
6928*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
6929*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
6930*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
6931*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "cc",
6932*5f39d1b3SJooyung Han         "memory");
6933*5f39d1b3SJooyung Han }
6934*5f39d1b3SJooyung Han 
6935*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)6936*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 1, ColumnMajorWithSum>::Pack(
6937*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
6938*5f39d1b3SJooyung Han #ifdef DEBUG
6939*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
6940*5f39d1b3SJooyung Han   std::cout
6941*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
6942*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 3, 8, 1, ColumnMajorWithSum>::Pack()"
6943*5f39d1b3SJooyung Han       << std::endl
6944*5f39d1b3SJooyung Han       << std::flush;
6945*5f39d1b3SJooyung Han #endif
6946*5f39d1b3SJooyung Han #endif
6947*5f39d1b3SJooyung Han   int params_count_copy = params.count;
6948*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
6949*5f39d1b3SJooyung Han   asm volatile(
6950*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
6951*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
6952*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
6953*5f39d1b3SJooyung Han 
6954*5f39d1b3SJooyung Han       // Reduce count by leftovers.
6955*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
6956*5f39d1b3SJooyung Han       "beq 2f\n"
6957*5f39d1b3SJooyung Han 
6958*5f39d1b3SJooyung Han       "1:"
6959*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
6960*5f39d1b3SJooyung Han 
6961*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x8
6962*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
6963*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
6964*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
6965*5f39d1b3SJooyung Han       "vld3.8 {d0[3], d1[3], d2[3]}, [%[in]], %[stride]\n"
6966*5f39d1b3SJooyung Han       "vld3.8 {d0[4], d1[4], d2[4]}, [%[in]], %[stride]\n"
6967*5f39d1b3SJooyung Han       "vld3.8 {d0[5], d1[5], d2[5]}, [%[in]], %[stride]\n"
6968*5f39d1b3SJooyung Han       "vld3.8 {d0[6], d1[6], d2[6]}, [%[in]], %[stride]\n"
6969*5f39d1b3SJooyung Han       "vld3.8 {d0[7], d1[7], d2[7]}, [%[in]], %[stride]\n"
6970*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6971*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6972*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
6973*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
6974*5f39d1b3SJooyung Han 
6975*5f39d1b3SJooyung Han       "bne 1b\n"
6976*5f39d1b3SJooyung Han 
6977*5f39d1b3SJooyung Han       "2:"
6978*5f39d1b3SJooyung Han 
6979*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x1
6980*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
6981*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
6982*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
6983*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
6984*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
6985*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
6986*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
6987*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
6988*5f39d1b3SJooyung Han 
6989*5f39d1b3SJooyung Han       // Aggregator Reduction.
6990*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
6991*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
6992*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
6993*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
6994*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
6995*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
6996*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
6997*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
6998*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
6999*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
7000*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
7001*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
7002*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
7003*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
7004*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
7005*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
7006*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
7007*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "cc",
7008*5f39d1b3SJooyung Han         "memory");
7009*5f39d1b3SJooyung Han }
7010*5f39d1b3SJooyung Han 
7011*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)7012*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 2, ColumnMajorWithSum>::Pack(
7013*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
7014*5f39d1b3SJooyung Han #ifdef DEBUG
7015*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
7016*5f39d1b3SJooyung Han   std::cout
7017*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
7018*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 3, 8, 2, ColumnMajorWithSum>::Pack()"
7019*5f39d1b3SJooyung Han       << std::endl
7020*5f39d1b3SJooyung Han       << std::flush;
7021*5f39d1b3SJooyung Han #endif
7022*5f39d1b3SJooyung Han #endif
7023*5f39d1b3SJooyung Han   int params_count_copy = params.count;
7024*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
7025*5f39d1b3SJooyung Han   asm volatile(
7026*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
7027*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
7028*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
7029*5f39d1b3SJooyung Han 
7030*5f39d1b3SJooyung Han       // Reduce count by leftovers.
7031*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
7032*5f39d1b3SJooyung Han       "beq 2f\n"
7033*5f39d1b3SJooyung Han 
7034*5f39d1b3SJooyung Han       "1:"
7035*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
7036*5f39d1b3SJooyung Han 
7037*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x8
7038*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
7039*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
7040*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
7041*5f39d1b3SJooyung Han       "vld3.8 {d0[3], d1[3], d2[3]}, [%[in]], %[stride]\n"
7042*5f39d1b3SJooyung Han       "vld3.8 {d0[4], d1[4], d2[4]}, [%[in]], %[stride]\n"
7043*5f39d1b3SJooyung Han       "vld3.8 {d0[5], d1[5], d2[5]}, [%[in]], %[stride]\n"
7044*5f39d1b3SJooyung Han       "vld3.8 {d0[6], d1[6], d2[6]}, [%[in]], %[stride]\n"
7045*5f39d1b3SJooyung Han       "vld3.8 {d0[7], d1[7], d2[7]}, [%[in]], %[stride]\n"
7046*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7047*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7048*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7049*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
7050*5f39d1b3SJooyung Han 
7051*5f39d1b3SJooyung Han       "bne 1b\n"
7052*5f39d1b3SJooyung Han 
7053*5f39d1b3SJooyung Han       "2:"
7054*5f39d1b3SJooyung Han 
7055*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x2
7056*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
7057*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
7058*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
7059*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
7060*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
7061*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7062*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7063*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7064*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
7065*5f39d1b3SJooyung Han 
7066*5f39d1b3SJooyung Han       // Aggregator Reduction.
7067*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
7068*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
7069*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
7070*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
7071*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
7072*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
7073*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
7074*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
7075*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
7076*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
7077*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
7078*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
7079*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
7080*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
7081*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
7082*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
7083*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
7084*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "cc",
7085*5f39d1b3SJooyung Han         "memory");
7086*5f39d1b3SJooyung Han }
7087*5f39d1b3SJooyung Han 
7088*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)7089*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 3, ColumnMajorWithSum>::Pack(
7090*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
7091*5f39d1b3SJooyung Han #ifdef DEBUG
7092*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
7093*5f39d1b3SJooyung Han   std::cout
7094*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
7095*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 3, 8, 3, ColumnMajorWithSum>::Pack()"
7096*5f39d1b3SJooyung Han       << std::endl
7097*5f39d1b3SJooyung Han       << std::flush;
7098*5f39d1b3SJooyung Han #endif
7099*5f39d1b3SJooyung Han #endif
7100*5f39d1b3SJooyung Han   int params_count_copy = params.count;
7101*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
7102*5f39d1b3SJooyung Han   asm volatile(
7103*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
7104*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
7105*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
7106*5f39d1b3SJooyung Han 
7107*5f39d1b3SJooyung Han       // Reduce count by leftovers.
7108*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
7109*5f39d1b3SJooyung Han       "beq 2f\n"
7110*5f39d1b3SJooyung Han 
7111*5f39d1b3SJooyung Han       "1:"
7112*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
7113*5f39d1b3SJooyung Han 
7114*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x8
7115*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
7116*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
7117*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
7118*5f39d1b3SJooyung Han       "vld3.8 {d0[3], d1[3], d2[3]}, [%[in]], %[stride]\n"
7119*5f39d1b3SJooyung Han       "vld3.8 {d0[4], d1[4], d2[4]}, [%[in]], %[stride]\n"
7120*5f39d1b3SJooyung Han       "vld3.8 {d0[5], d1[5], d2[5]}, [%[in]], %[stride]\n"
7121*5f39d1b3SJooyung Han       "vld3.8 {d0[6], d1[6], d2[6]}, [%[in]], %[stride]\n"
7122*5f39d1b3SJooyung Han       "vld3.8 {d0[7], d1[7], d2[7]}, [%[in]], %[stride]\n"
7123*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7124*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7125*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7126*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
7127*5f39d1b3SJooyung Han 
7128*5f39d1b3SJooyung Han       "bne 1b\n"
7129*5f39d1b3SJooyung Han 
7130*5f39d1b3SJooyung Han       "2:"
7131*5f39d1b3SJooyung Han 
7132*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x3
7133*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
7134*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
7135*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
7136*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
7137*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
7138*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
7139*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7140*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7141*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7142*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
7143*5f39d1b3SJooyung Han 
7144*5f39d1b3SJooyung Han       // Aggregator Reduction.
7145*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
7146*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
7147*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
7148*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
7149*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
7150*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
7151*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
7152*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
7153*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
7154*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
7155*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
7156*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
7157*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
7158*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
7159*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
7160*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
7161*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
7162*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "cc",
7163*5f39d1b3SJooyung Han         "memory");
7164*5f39d1b3SJooyung Han }
7165*5f39d1b3SJooyung Han 
7166*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)7167*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 4, ColumnMajorWithSum>::Pack(
7168*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
7169*5f39d1b3SJooyung Han #ifdef DEBUG
7170*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
7171*5f39d1b3SJooyung Han   std::cout
7172*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
7173*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 3, 8, 4, ColumnMajorWithSum>::Pack()"
7174*5f39d1b3SJooyung Han       << std::endl
7175*5f39d1b3SJooyung Han       << std::flush;
7176*5f39d1b3SJooyung Han #endif
7177*5f39d1b3SJooyung Han #endif
7178*5f39d1b3SJooyung Han   int params_count_copy = params.count;
7179*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
7180*5f39d1b3SJooyung Han   asm volatile(
7181*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
7182*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
7183*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
7184*5f39d1b3SJooyung Han 
7185*5f39d1b3SJooyung Han       // Reduce count by leftovers.
7186*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
7187*5f39d1b3SJooyung Han       "beq 2f\n"
7188*5f39d1b3SJooyung Han 
7189*5f39d1b3SJooyung Han       "1:"
7190*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
7191*5f39d1b3SJooyung Han 
7192*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x8
7193*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
7194*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
7195*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
7196*5f39d1b3SJooyung Han       "vld3.8 {d0[3], d1[3], d2[3]}, [%[in]], %[stride]\n"
7197*5f39d1b3SJooyung Han       "vld3.8 {d0[4], d1[4], d2[4]}, [%[in]], %[stride]\n"
7198*5f39d1b3SJooyung Han       "vld3.8 {d0[5], d1[5], d2[5]}, [%[in]], %[stride]\n"
7199*5f39d1b3SJooyung Han       "vld3.8 {d0[6], d1[6], d2[6]}, [%[in]], %[stride]\n"
7200*5f39d1b3SJooyung Han       "vld3.8 {d0[7], d1[7], d2[7]}, [%[in]], %[stride]\n"
7201*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7202*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7203*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7204*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
7205*5f39d1b3SJooyung Han 
7206*5f39d1b3SJooyung Han       "bne 1b\n"
7207*5f39d1b3SJooyung Han 
7208*5f39d1b3SJooyung Han       "2:"
7209*5f39d1b3SJooyung Han 
7210*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x4
7211*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
7212*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
7213*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
7214*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
7215*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
7216*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
7217*5f39d1b3SJooyung Han       "vld3.8 {d0[3], d1[3], d2[3]}, [%[in]], %[stride]\n"
7218*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7219*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7220*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7221*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
7222*5f39d1b3SJooyung Han 
7223*5f39d1b3SJooyung Han       // Aggregator Reduction.
7224*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
7225*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
7226*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
7227*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
7228*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
7229*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
7230*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
7231*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
7232*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
7233*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
7234*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
7235*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
7236*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
7237*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
7238*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
7239*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
7240*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
7241*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "cc",
7242*5f39d1b3SJooyung Han         "memory");
7243*5f39d1b3SJooyung Han }
7244*5f39d1b3SJooyung Han 
7245*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)7246*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 5, ColumnMajorWithSum>::Pack(
7247*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
7248*5f39d1b3SJooyung Han #ifdef DEBUG
7249*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
7250*5f39d1b3SJooyung Han   std::cout
7251*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
7252*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 3, 8, 5, ColumnMajorWithSum>::Pack()"
7253*5f39d1b3SJooyung Han       << std::endl
7254*5f39d1b3SJooyung Han       << std::flush;
7255*5f39d1b3SJooyung Han #endif
7256*5f39d1b3SJooyung Han #endif
7257*5f39d1b3SJooyung Han   int params_count_copy = params.count;
7258*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
7259*5f39d1b3SJooyung Han   asm volatile(
7260*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
7261*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
7262*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
7263*5f39d1b3SJooyung Han 
7264*5f39d1b3SJooyung Han       // Reduce count by leftovers.
7265*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
7266*5f39d1b3SJooyung Han       "beq 2f\n"
7267*5f39d1b3SJooyung Han 
7268*5f39d1b3SJooyung Han       "1:"
7269*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
7270*5f39d1b3SJooyung Han 
7271*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x8
7272*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
7273*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
7274*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
7275*5f39d1b3SJooyung Han       "vld3.8 {d0[3], d1[3], d2[3]}, [%[in]], %[stride]\n"
7276*5f39d1b3SJooyung Han       "vld3.8 {d0[4], d1[4], d2[4]}, [%[in]], %[stride]\n"
7277*5f39d1b3SJooyung Han       "vld3.8 {d0[5], d1[5], d2[5]}, [%[in]], %[stride]\n"
7278*5f39d1b3SJooyung Han       "vld3.8 {d0[6], d1[6], d2[6]}, [%[in]], %[stride]\n"
7279*5f39d1b3SJooyung Han       "vld3.8 {d0[7], d1[7], d2[7]}, [%[in]], %[stride]\n"
7280*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7281*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7282*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7283*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
7284*5f39d1b3SJooyung Han 
7285*5f39d1b3SJooyung Han       "bne 1b\n"
7286*5f39d1b3SJooyung Han 
7287*5f39d1b3SJooyung Han       "2:"
7288*5f39d1b3SJooyung Han 
7289*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x5
7290*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
7291*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
7292*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
7293*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
7294*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
7295*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
7296*5f39d1b3SJooyung Han       "vld3.8 {d0[3], d1[3], d2[3]}, [%[in]], %[stride]\n"
7297*5f39d1b3SJooyung Han       "vld3.8 {d0[4], d1[4], d2[4]}, [%[in]], %[stride]\n"
7298*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7299*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7300*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7301*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
7302*5f39d1b3SJooyung Han 
7303*5f39d1b3SJooyung Han       // Aggregator Reduction.
7304*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
7305*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
7306*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
7307*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
7308*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
7309*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
7310*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
7311*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
7312*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
7313*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
7314*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
7315*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
7316*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
7317*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
7318*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
7319*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
7320*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
7321*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "cc",
7322*5f39d1b3SJooyung Han         "memory");
7323*5f39d1b3SJooyung Han }
7324*5f39d1b3SJooyung Han 
7325*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)7326*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 6, ColumnMajorWithSum>::Pack(
7327*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
7328*5f39d1b3SJooyung Han #ifdef DEBUG
7329*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
7330*5f39d1b3SJooyung Han   std::cout
7331*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
7332*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 3, 8, 6, ColumnMajorWithSum>::Pack()"
7333*5f39d1b3SJooyung Han       << std::endl
7334*5f39d1b3SJooyung Han       << std::flush;
7335*5f39d1b3SJooyung Han #endif
7336*5f39d1b3SJooyung Han #endif
7337*5f39d1b3SJooyung Han   int params_count_copy = params.count;
7338*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
7339*5f39d1b3SJooyung Han   asm volatile(
7340*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
7341*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
7342*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
7343*5f39d1b3SJooyung Han 
7344*5f39d1b3SJooyung Han       // Reduce count by leftovers.
7345*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
7346*5f39d1b3SJooyung Han       "beq 2f\n"
7347*5f39d1b3SJooyung Han 
7348*5f39d1b3SJooyung Han       "1:"
7349*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
7350*5f39d1b3SJooyung Han 
7351*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x8
7352*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
7353*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
7354*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
7355*5f39d1b3SJooyung Han       "vld3.8 {d0[3], d1[3], d2[3]}, [%[in]], %[stride]\n"
7356*5f39d1b3SJooyung Han       "vld3.8 {d0[4], d1[4], d2[4]}, [%[in]], %[stride]\n"
7357*5f39d1b3SJooyung Han       "vld3.8 {d0[5], d1[5], d2[5]}, [%[in]], %[stride]\n"
7358*5f39d1b3SJooyung Han       "vld3.8 {d0[6], d1[6], d2[6]}, [%[in]], %[stride]\n"
7359*5f39d1b3SJooyung Han       "vld3.8 {d0[7], d1[7], d2[7]}, [%[in]], %[stride]\n"
7360*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7361*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7362*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7363*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
7364*5f39d1b3SJooyung Han 
7365*5f39d1b3SJooyung Han       "bne 1b\n"
7366*5f39d1b3SJooyung Han 
7367*5f39d1b3SJooyung Han       "2:"
7368*5f39d1b3SJooyung Han 
7369*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x6
7370*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
7371*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
7372*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
7373*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
7374*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
7375*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
7376*5f39d1b3SJooyung Han       "vld3.8 {d0[3], d1[3], d2[3]}, [%[in]], %[stride]\n"
7377*5f39d1b3SJooyung Han       "vld3.8 {d0[4], d1[4], d2[4]}, [%[in]], %[stride]\n"
7378*5f39d1b3SJooyung Han       "vld3.8 {d0[5], d1[5], d2[5]}, [%[in]], %[stride]\n"
7379*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7380*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7381*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7382*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
7383*5f39d1b3SJooyung Han 
7384*5f39d1b3SJooyung Han       // Aggregator Reduction.
7385*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
7386*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
7387*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
7388*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
7389*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
7390*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
7391*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
7392*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
7393*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
7394*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
7395*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
7396*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
7397*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
7398*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
7399*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
7400*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
7401*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
7402*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "cc",
7403*5f39d1b3SJooyung Han         "memory");
7404*5f39d1b3SJooyung Han }
7405*5f39d1b3SJooyung Han 
7406*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)7407*5f39d1b3SJooyung Han inline void Stream<uint8_t, 3, 8, 7, ColumnMajorWithSum>::Pack(
7408*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
7409*5f39d1b3SJooyung Han #ifdef DEBUG
7410*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
7411*5f39d1b3SJooyung Han   std::cout
7412*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
7413*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 3, 8, 7, ColumnMajorWithSum>::Pack()"
7414*5f39d1b3SJooyung Han       << std::endl
7415*5f39d1b3SJooyung Han       << std::flush;
7416*5f39d1b3SJooyung Han #endif
7417*5f39d1b3SJooyung Han #endif
7418*5f39d1b3SJooyung Han   int params_count_copy = params.count;
7419*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
7420*5f39d1b3SJooyung Han   asm volatile(
7421*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
7422*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
7423*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
7424*5f39d1b3SJooyung Han 
7425*5f39d1b3SJooyung Han       // Reduce count by leftovers.
7426*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
7427*5f39d1b3SJooyung Han       "beq 2f\n"
7428*5f39d1b3SJooyung Han 
7429*5f39d1b3SJooyung Han       "1:"
7430*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
7431*5f39d1b3SJooyung Han 
7432*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x8
7433*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
7434*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
7435*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
7436*5f39d1b3SJooyung Han       "vld3.8 {d0[3], d1[3], d2[3]}, [%[in]], %[stride]\n"
7437*5f39d1b3SJooyung Han       "vld3.8 {d0[4], d1[4], d2[4]}, [%[in]], %[stride]\n"
7438*5f39d1b3SJooyung Han       "vld3.8 {d0[5], d1[5], d2[5]}, [%[in]], %[stride]\n"
7439*5f39d1b3SJooyung Han       "vld3.8 {d0[6], d1[6], d2[6]}, [%[in]], %[stride]\n"
7440*5f39d1b3SJooyung Han       "vld3.8 {d0[7], d1[7], d2[7]}, [%[in]], %[stride]\n"
7441*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7442*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7443*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7444*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
7445*5f39d1b3SJooyung Han 
7446*5f39d1b3SJooyung Han       "bne 1b\n"
7447*5f39d1b3SJooyung Han 
7448*5f39d1b3SJooyung Han       "2:"
7449*5f39d1b3SJooyung Han 
7450*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 3x7
7451*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
7452*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
7453*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
7454*5f39d1b3SJooyung Han       "vld3.8 {d0[0], d1[0], d2[0]}, [%[in]], %[stride]\n"
7455*5f39d1b3SJooyung Han       "vld3.8 {d0[1], d1[1], d2[1]}, [%[in]], %[stride]\n"
7456*5f39d1b3SJooyung Han       "vld3.8 {d0[2], d1[2], d2[2]}, [%[in]], %[stride]\n"
7457*5f39d1b3SJooyung Han       "vld3.8 {d0[3], d1[3], d2[3]}, [%[in]], %[stride]\n"
7458*5f39d1b3SJooyung Han       "vld3.8 {d0[4], d1[4], d2[4]}, [%[in]], %[stride]\n"
7459*5f39d1b3SJooyung Han       "vld3.8 {d0[5], d1[5], d2[5]}, [%[in]], %[stride]\n"
7460*5f39d1b3SJooyung Han       "vld3.8 {d0[6], d1[6], d2[6]}, [%[in]], %[stride]\n"
7461*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7462*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7463*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7464*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2}, [%[out]:64]!\n"
7465*5f39d1b3SJooyung Han 
7466*5f39d1b3SJooyung Han       // Aggregator Reduction.
7467*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
7468*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
7469*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
7470*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
7471*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
7472*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
7473*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
7474*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
7475*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
7476*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d20\n"
7477*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
7478*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
7479*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:64]\n"
7480*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
7481*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
7482*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
7483*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
7484*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "cc",
7485*5f39d1b3SJooyung Han         "memory");
7486*5f39d1b3SJooyung Han }
7487*5f39d1b3SJooyung Han 
7488*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)7489*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 0, ColumnMajorWithSum>::Pack(
7490*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
7491*5f39d1b3SJooyung Han #ifdef DEBUG
7492*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
7493*5f39d1b3SJooyung Han   std::cout
7494*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
7495*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 4, 8, 0, ColumnMajorWithSum>::Pack()"
7496*5f39d1b3SJooyung Han       << std::endl
7497*5f39d1b3SJooyung Han       << std::flush;
7498*5f39d1b3SJooyung Han #endif
7499*5f39d1b3SJooyung Han #endif
7500*5f39d1b3SJooyung Han   int params_count_copy = params.count;
7501*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
7502*5f39d1b3SJooyung Han   asm volatile(
7503*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
7504*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
7505*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
7506*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
7507*5f39d1b3SJooyung Han 
7508*5f39d1b3SJooyung Han       "1:"
7509*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
7510*5f39d1b3SJooyung Han 
7511*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x8
7512*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
7513*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
7514*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
7515*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]], %[stride]\n"
7516*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]], %[stride]\n"
7517*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]], %[stride]\n"
7518*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]], %[stride]\n"
7519*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]], %[stride]\n"
7520*5f39d1b3SJooyung Han       "pld [%[in]]\n"
7521*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
7522*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
7523*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
7524*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
7525*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7526*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7527*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7528*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
7529*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
7530*5f39d1b3SJooyung Han 
7531*5f39d1b3SJooyung Han       "bne 1b\n"
7532*5f39d1b3SJooyung Han 
7533*5f39d1b3SJooyung Han       // Aggregator Reduction.
7534*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
7535*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
7536*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
7537*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
7538*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
7539*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
7540*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
7541*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
7542*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
7543*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
7544*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
7545*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
7546*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
7547*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
7548*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
7549*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
7550*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
7551*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
7552*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
7553*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
7554*5f39d1b3SJooyung Han         "d23", "cc", "memory");
7555*5f39d1b3SJooyung Han }
7556*5f39d1b3SJooyung Han 
7557*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)7558*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 1, ColumnMajorWithSum>::Pack(
7559*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
7560*5f39d1b3SJooyung Han #ifdef DEBUG
7561*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
7562*5f39d1b3SJooyung Han   std::cout
7563*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
7564*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 4, 8, 1, ColumnMajorWithSum>::Pack()"
7565*5f39d1b3SJooyung Han       << std::endl
7566*5f39d1b3SJooyung Han       << std::flush;
7567*5f39d1b3SJooyung Han #endif
7568*5f39d1b3SJooyung Han #endif
7569*5f39d1b3SJooyung Han   int params_count_copy = params.count;
7570*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
7571*5f39d1b3SJooyung Han   asm volatile(
7572*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
7573*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
7574*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
7575*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
7576*5f39d1b3SJooyung Han 
7577*5f39d1b3SJooyung Han       // Reduce count by leftovers.
7578*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
7579*5f39d1b3SJooyung Han       "beq 2f\n"
7580*5f39d1b3SJooyung Han 
7581*5f39d1b3SJooyung Han       "1:"
7582*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
7583*5f39d1b3SJooyung Han 
7584*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x8
7585*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
7586*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
7587*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
7588*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]], %[stride]\n"
7589*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]], %[stride]\n"
7590*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]], %[stride]\n"
7591*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]], %[stride]\n"
7592*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]], %[stride]\n"
7593*5f39d1b3SJooyung Han       "pld [%[in]]\n"
7594*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
7595*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
7596*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
7597*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
7598*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7599*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7600*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7601*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
7602*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
7603*5f39d1b3SJooyung Han 
7604*5f39d1b3SJooyung Han       "bne 1b\n"
7605*5f39d1b3SJooyung Han 
7606*5f39d1b3SJooyung Han       "2:"
7607*5f39d1b3SJooyung Han 
7608*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x1
7609*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
7610*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
7611*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
7612*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
7613*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
7614*5f39d1b3SJooyung Han       "pld [%[in]]\n"
7615*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
7616*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
7617*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
7618*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
7619*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7620*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7621*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7622*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
7623*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
7624*5f39d1b3SJooyung Han 
7625*5f39d1b3SJooyung Han       // Aggregator Reduction.
7626*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
7627*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
7628*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
7629*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
7630*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
7631*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
7632*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
7633*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
7634*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
7635*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
7636*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
7637*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
7638*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
7639*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
7640*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
7641*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
7642*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
7643*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
7644*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
7645*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
7646*5f39d1b3SJooyung Han         "d23", "cc", "memory");
7647*5f39d1b3SJooyung Han }
7648*5f39d1b3SJooyung Han 
7649*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)7650*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 2, ColumnMajorWithSum>::Pack(
7651*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
7652*5f39d1b3SJooyung Han #ifdef DEBUG
7653*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
7654*5f39d1b3SJooyung Han   std::cout
7655*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
7656*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 4, 8, 2, ColumnMajorWithSum>::Pack()"
7657*5f39d1b3SJooyung Han       << std::endl
7658*5f39d1b3SJooyung Han       << std::flush;
7659*5f39d1b3SJooyung Han #endif
7660*5f39d1b3SJooyung Han #endif
7661*5f39d1b3SJooyung Han   int params_count_copy = params.count;
7662*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
7663*5f39d1b3SJooyung Han   asm volatile(
7664*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
7665*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
7666*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
7667*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
7668*5f39d1b3SJooyung Han 
7669*5f39d1b3SJooyung Han       // Reduce count by leftovers.
7670*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
7671*5f39d1b3SJooyung Han       "beq 2f\n"
7672*5f39d1b3SJooyung Han 
7673*5f39d1b3SJooyung Han       "1:"
7674*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
7675*5f39d1b3SJooyung Han 
7676*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x8
7677*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
7678*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
7679*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
7680*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]], %[stride]\n"
7681*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]], %[stride]\n"
7682*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]], %[stride]\n"
7683*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]], %[stride]\n"
7684*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]], %[stride]\n"
7685*5f39d1b3SJooyung Han       "pld [%[in]]\n"
7686*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
7687*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
7688*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
7689*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
7690*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7691*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7692*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7693*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
7694*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
7695*5f39d1b3SJooyung Han 
7696*5f39d1b3SJooyung Han       "bne 1b\n"
7697*5f39d1b3SJooyung Han 
7698*5f39d1b3SJooyung Han       "2:"
7699*5f39d1b3SJooyung Han 
7700*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x2
7701*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
7702*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
7703*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
7704*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
7705*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
7706*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
7707*5f39d1b3SJooyung Han       "pld [%[in]]\n"
7708*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
7709*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
7710*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
7711*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
7712*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7713*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7714*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7715*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
7716*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
7717*5f39d1b3SJooyung Han 
7718*5f39d1b3SJooyung Han       // Aggregator Reduction.
7719*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
7720*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
7721*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
7722*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
7723*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
7724*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
7725*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
7726*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
7727*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
7728*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
7729*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
7730*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
7731*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
7732*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
7733*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
7734*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
7735*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
7736*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
7737*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
7738*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
7739*5f39d1b3SJooyung Han         "d23", "cc", "memory");
7740*5f39d1b3SJooyung Han }
7741*5f39d1b3SJooyung Han 
7742*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)7743*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 3, ColumnMajorWithSum>::Pack(
7744*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
7745*5f39d1b3SJooyung Han #ifdef DEBUG
7746*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
7747*5f39d1b3SJooyung Han   std::cout
7748*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
7749*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 4, 8, 3, ColumnMajorWithSum>::Pack()"
7750*5f39d1b3SJooyung Han       << std::endl
7751*5f39d1b3SJooyung Han       << std::flush;
7752*5f39d1b3SJooyung Han #endif
7753*5f39d1b3SJooyung Han #endif
7754*5f39d1b3SJooyung Han   int params_count_copy = params.count;
7755*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
7756*5f39d1b3SJooyung Han   asm volatile(
7757*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
7758*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
7759*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
7760*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
7761*5f39d1b3SJooyung Han 
7762*5f39d1b3SJooyung Han       // Reduce count by leftovers.
7763*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
7764*5f39d1b3SJooyung Han       "beq 2f\n"
7765*5f39d1b3SJooyung Han 
7766*5f39d1b3SJooyung Han       "1:"
7767*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
7768*5f39d1b3SJooyung Han 
7769*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x8
7770*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
7771*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
7772*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
7773*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]], %[stride]\n"
7774*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]], %[stride]\n"
7775*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]], %[stride]\n"
7776*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]], %[stride]\n"
7777*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]], %[stride]\n"
7778*5f39d1b3SJooyung Han       "pld [%[in]]\n"
7779*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
7780*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
7781*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
7782*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
7783*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7784*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7785*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7786*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
7787*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
7788*5f39d1b3SJooyung Han 
7789*5f39d1b3SJooyung Han       "bne 1b\n"
7790*5f39d1b3SJooyung Han 
7791*5f39d1b3SJooyung Han       "2:"
7792*5f39d1b3SJooyung Han 
7793*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x3
7794*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
7795*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
7796*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
7797*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
7798*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
7799*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
7800*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
7801*5f39d1b3SJooyung Han       "pld [%[in]]\n"
7802*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
7803*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
7804*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
7805*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
7806*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7807*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7808*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7809*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
7810*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
7811*5f39d1b3SJooyung Han 
7812*5f39d1b3SJooyung Han       // Aggregator Reduction.
7813*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
7814*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
7815*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
7816*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
7817*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
7818*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
7819*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
7820*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
7821*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
7822*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
7823*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
7824*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
7825*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
7826*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
7827*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
7828*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
7829*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
7830*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
7831*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
7832*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
7833*5f39d1b3SJooyung Han         "d23", "cc", "memory");
7834*5f39d1b3SJooyung Han }
7835*5f39d1b3SJooyung Han 
7836*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)7837*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 4, ColumnMajorWithSum>::Pack(
7838*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
7839*5f39d1b3SJooyung Han #ifdef DEBUG
7840*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
7841*5f39d1b3SJooyung Han   std::cout
7842*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
7843*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 4, 8, 4, ColumnMajorWithSum>::Pack()"
7844*5f39d1b3SJooyung Han       << std::endl
7845*5f39d1b3SJooyung Han       << std::flush;
7846*5f39d1b3SJooyung Han #endif
7847*5f39d1b3SJooyung Han #endif
7848*5f39d1b3SJooyung Han   int params_count_copy = params.count;
7849*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
7850*5f39d1b3SJooyung Han   asm volatile(
7851*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
7852*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
7853*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
7854*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
7855*5f39d1b3SJooyung Han 
7856*5f39d1b3SJooyung Han       // Reduce count by leftovers.
7857*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
7858*5f39d1b3SJooyung Han       "beq 2f\n"
7859*5f39d1b3SJooyung Han 
7860*5f39d1b3SJooyung Han       "1:"
7861*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
7862*5f39d1b3SJooyung Han 
7863*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x8
7864*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
7865*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
7866*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
7867*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]], %[stride]\n"
7868*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]], %[stride]\n"
7869*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]], %[stride]\n"
7870*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]], %[stride]\n"
7871*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]], %[stride]\n"
7872*5f39d1b3SJooyung Han       "pld [%[in]]\n"
7873*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
7874*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
7875*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
7876*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
7877*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7878*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7879*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7880*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
7881*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
7882*5f39d1b3SJooyung Han 
7883*5f39d1b3SJooyung Han       "bne 1b\n"
7884*5f39d1b3SJooyung Han 
7885*5f39d1b3SJooyung Han       "2:"
7886*5f39d1b3SJooyung Han 
7887*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x4
7888*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
7889*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
7890*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
7891*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
7892*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
7893*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
7894*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
7895*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]], %[stride]\n"
7896*5f39d1b3SJooyung Han       "pld [%[in]]\n"
7897*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
7898*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
7899*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
7900*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
7901*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7902*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7903*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7904*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
7905*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
7906*5f39d1b3SJooyung Han 
7907*5f39d1b3SJooyung Han       // Aggregator Reduction.
7908*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
7909*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
7910*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
7911*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
7912*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
7913*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
7914*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
7915*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
7916*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
7917*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
7918*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
7919*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
7920*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
7921*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
7922*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
7923*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
7924*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
7925*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
7926*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
7927*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
7928*5f39d1b3SJooyung Han         "d23", "cc", "memory");
7929*5f39d1b3SJooyung Han }
7930*5f39d1b3SJooyung Han 
7931*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)7932*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 5, ColumnMajorWithSum>::Pack(
7933*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
7934*5f39d1b3SJooyung Han #ifdef DEBUG
7935*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
7936*5f39d1b3SJooyung Han   std::cout
7937*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
7938*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 4, 8, 5, ColumnMajorWithSum>::Pack()"
7939*5f39d1b3SJooyung Han       << std::endl
7940*5f39d1b3SJooyung Han       << std::flush;
7941*5f39d1b3SJooyung Han #endif
7942*5f39d1b3SJooyung Han #endif
7943*5f39d1b3SJooyung Han   int params_count_copy = params.count;
7944*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
7945*5f39d1b3SJooyung Han   asm volatile(
7946*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
7947*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
7948*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
7949*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
7950*5f39d1b3SJooyung Han 
7951*5f39d1b3SJooyung Han       // Reduce count by leftovers.
7952*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
7953*5f39d1b3SJooyung Han       "beq 2f\n"
7954*5f39d1b3SJooyung Han 
7955*5f39d1b3SJooyung Han       "1:"
7956*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
7957*5f39d1b3SJooyung Han 
7958*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x8
7959*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
7960*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
7961*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
7962*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]], %[stride]\n"
7963*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]], %[stride]\n"
7964*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]], %[stride]\n"
7965*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]], %[stride]\n"
7966*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]], %[stride]\n"
7967*5f39d1b3SJooyung Han       "pld [%[in]]\n"
7968*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
7969*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
7970*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
7971*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
7972*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7973*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7974*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
7975*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
7976*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
7977*5f39d1b3SJooyung Han 
7978*5f39d1b3SJooyung Han       "bne 1b\n"
7979*5f39d1b3SJooyung Han 
7980*5f39d1b3SJooyung Han       "2:"
7981*5f39d1b3SJooyung Han 
7982*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x5
7983*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
7984*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
7985*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
7986*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
7987*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
7988*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
7989*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
7990*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]], %[stride]\n"
7991*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]], %[stride]\n"
7992*5f39d1b3SJooyung Han       "pld [%[in]]\n"
7993*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
7994*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
7995*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
7996*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
7997*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
7998*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
7999*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8000*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8001*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
8002*5f39d1b3SJooyung Han 
8003*5f39d1b3SJooyung Han       // Aggregator Reduction.
8004*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
8005*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
8006*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
8007*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
8008*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
8009*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
8010*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
8011*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
8012*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
8013*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
8014*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
8015*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
8016*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
8017*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
8018*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
8019*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
8020*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
8021*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
8022*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
8023*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
8024*5f39d1b3SJooyung Han         "d23", "cc", "memory");
8025*5f39d1b3SJooyung Han }
8026*5f39d1b3SJooyung Han 
8027*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)8028*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 6, ColumnMajorWithSum>::Pack(
8029*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
8030*5f39d1b3SJooyung Han #ifdef DEBUG
8031*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
8032*5f39d1b3SJooyung Han   std::cout
8033*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
8034*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 4, 8, 6, ColumnMajorWithSum>::Pack()"
8035*5f39d1b3SJooyung Han       << std::endl
8036*5f39d1b3SJooyung Han       << std::flush;
8037*5f39d1b3SJooyung Han #endif
8038*5f39d1b3SJooyung Han #endif
8039*5f39d1b3SJooyung Han   int params_count_copy = params.count;
8040*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
8041*5f39d1b3SJooyung Han   asm volatile(
8042*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
8043*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
8044*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
8045*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
8046*5f39d1b3SJooyung Han 
8047*5f39d1b3SJooyung Han       // Reduce count by leftovers.
8048*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
8049*5f39d1b3SJooyung Han       "beq 2f\n"
8050*5f39d1b3SJooyung Han 
8051*5f39d1b3SJooyung Han       "1:"
8052*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
8053*5f39d1b3SJooyung Han 
8054*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x8
8055*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
8056*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
8057*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
8058*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]], %[stride]\n"
8059*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]], %[stride]\n"
8060*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]], %[stride]\n"
8061*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]], %[stride]\n"
8062*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]], %[stride]\n"
8063*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8064*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8065*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8066*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8067*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8068*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8069*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8070*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8071*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8072*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
8073*5f39d1b3SJooyung Han 
8074*5f39d1b3SJooyung Han       "bne 1b\n"
8075*5f39d1b3SJooyung Han 
8076*5f39d1b3SJooyung Han       "2:"
8077*5f39d1b3SJooyung Han 
8078*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x6
8079*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
8080*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
8081*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
8082*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
8083*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
8084*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
8085*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
8086*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]], %[stride]\n"
8087*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]], %[stride]\n"
8088*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]], %[stride]\n"
8089*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8090*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8091*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8092*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8093*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8094*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8095*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8096*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8097*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8098*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
8099*5f39d1b3SJooyung Han 
8100*5f39d1b3SJooyung Han       // Aggregator Reduction.
8101*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
8102*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
8103*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
8104*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
8105*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
8106*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
8107*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
8108*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
8109*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
8110*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
8111*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
8112*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
8113*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
8114*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
8115*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
8116*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
8117*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
8118*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
8119*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
8120*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
8121*5f39d1b3SJooyung Han         "d23", "cc", "memory");
8122*5f39d1b3SJooyung Han }
8123*5f39d1b3SJooyung Han 
8124*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)8125*5f39d1b3SJooyung Han inline void Stream<uint8_t, 4, 8, 7, ColumnMajorWithSum>::Pack(
8126*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
8127*5f39d1b3SJooyung Han #ifdef DEBUG
8128*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
8129*5f39d1b3SJooyung Han   std::cout
8130*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
8131*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 4, 8, 7, ColumnMajorWithSum>::Pack()"
8132*5f39d1b3SJooyung Han       << std::endl
8133*5f39d1b3SJooyung Han       << std::flush;
8134*5f39d1b3SJooyung Han #endif
8135*5f39d1b3SJooyung Han #endif
8136*5f39d1b3SJooyung Han   int params_count_copy = params.count;
8137*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
8138*5f39d1b3SJooyung Han   asm volatile(
8139*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
8140*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
8141*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
8142*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
8143*5f39d1b3SJooyung Han 
8144*5f39d1b3SJooyung Han       // Reduce count by leftovers.
8145*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
8146*5f39d1b3SJooyung Han       "beq 2f\n"
8147*5f39d1b3SJooyung Han 
8148*5f39d1b3SJooyung Han       "1:"
8149*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
8150*5f39d1b3SJooyung Han 
8151*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x8
8152*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
8153*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
8154*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
8155*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]], %[stride]\n"
8156*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]], %[stride]\n"
8157*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]], %[stride]\n"
8158*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]], %[stride]\n"
8159*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]], %[stride]\n"
8160*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8161*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8162*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8163*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8164*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8165*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8166*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8167*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8168*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8169*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
8170*5f39d1b3SJooyung Han 
8171*5f39d1b3SJooyung Han       "bne 1b\n"
8172*5f39d1b3SJooyung Han 
8173*5f39d1b3SJooyung Han       "2:"
8174*5f39d1b3SJooyung Han 
8175*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 4x7
8176*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
8177*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
8178*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
8179*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
8180*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]], %[stride]\n"
8181*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]], %[stride]\n"
8182*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]], %[stride]\n"
8183*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]], %[stride]\n"
8184*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]], %[stride]\n"
8185*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]], %[stride]\n"
8186*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]], %[stride]\n"
8187*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8188*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8189*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8190*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8191*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8192*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8193*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8194*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8195*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8196*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
8197*5f39d1b3SJooyung Han 
8198*5f39d1b3SJooyung Han       // Aggregator Reduction.
8199*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
8200*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
8201*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
8202*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
8203*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
8204*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
8205*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
8206*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
8207*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
8208*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
8209*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
8210*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
8211*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
8212*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
8213*5f39d1b3SJooyung Han       "vst1.32 {d16, d17}, [%[out]:128]\n"
8214*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
8215*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
8216*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
8217*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
8218*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d16", "d17", "d18", "d19", "d20", "d21", "d22",
8219*5f39d1b3SJooyung Han         "d23", "cc", "memory");
8220*5f39d1b3SJooyung Han }
8221*5f39d1b3SJooyung Han 
8222*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)8223*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 0, ColumnMajorWithSum>::Pack(
8224*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
8225*5f39d1b3SJooyung Han #ifdef DEBUG
8226*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
8227*5f39d1b3SJooyung Han   std::cout
8228*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
8229*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 5, 8, 0, ColumnMajorWithSum>::Pack()"
8230*5f39d1b3SJooyung Han       << std::endl
8231*5f39d1b3SJooyung Han       << std::flush;
8232*5f39d1b3SJooyung Han #endif
8233*5f39d1b3SJooyung Han #endif
8234*5f39d1b3SJooyung Han   int params_count_copy = params.count;
8235*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
8236*5f39d1b3SJooyung Han   asm volatile(
8237*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
8238*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
8239*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
8240*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
8241*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
8242*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
8243*5f39d1b3SJooyung Han 
8244*5f39d1b3SJooyung Han       "1:"
8245*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
8246*5f39d1b3SJooyung Han 
8247*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x8
8248*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8249*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8250*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
8251*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
8252*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
8253*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
8254*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
8255*5f39d1b3SJooyung Han       "vld1.8 {d4[3]}, [%[in]], %[stride]\n"
8256*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
8257*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [%[in]], %[stride]\n"
8258*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
8259*5f39d1b3SJooyung Han       "vld1.8 {d4[5]}, [%[in]], %[stride]\n"
8260*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
8261*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [%[in]], %[stride]\n"
8262*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
8263*5f39d1b3SJooyung Han       "vld1.8 {d4[7]}, [%[in]], %[stride]\n"
8264*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8265*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8266*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8267*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8268*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8269*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8270*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8271*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8272*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8273*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8274*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8275*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8276*5f39d1b3SJooyung Han 
8277*5f39d1b3SJooyung Han       "bne 1b\n"
8278*5f39d1b3SJooyung Han 
8279*5f39d1b3SJooyung Han       // Aggregator Reduction.
8280*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
8281*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
8282*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
8283*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
8284*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
8285*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
8286*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
8287*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
8288*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
8289*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
8290*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
8291*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
8292*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
8293*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
8294*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
8295*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
8296*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
8297*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
8298*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
8299*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
8300*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
8301*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
8302*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
8303*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
8304*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d16", "d17", "d18", "d19", "d20", "d21",
8305*5f39d1b3SJooyung Han         "d22", "d23", "d24", "d25", "cc", "memory");
8306*5f39d1b3SJooyung Han }
8307*5f39d1b3SJooyung Han 
8308*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)8309*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 1, ColumnMajorWithSum>::Pack(
8310*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
8311*5f39d1b3SJooyung Han #ifdef DEBUG
8312*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
8313*5f39d1b3SJooyung Han   std::cout
8314*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
8315*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 5, 8, 1, ColumnMajorWithSum>::Pack()"
8316*5f39d1b3SJooyung Han       << std::endl
8317*5f39d1b3SJooyung Han       << std::flush;
8318*5f39d1b3SJooyung Han #endif
8319*5f39d1b3SJooyung Han #endif
8320*5f39d1b3SJooyung Han   int params_count_copy = params.count;
8321*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
8322*5f39d1b3SJooyung Han   asm volatile(
8323*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
8324*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
8325*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
8326*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
8327*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
8328*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
8329*5f39d1b3SJooyung Han 
8330*5f39d1b3SJooyung Han       // Reduce count by leftovers.
8331*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
8332*5f39d1b3SJooyung Han       "beq 2f\n"
8333*5f39d1b3SJooyung Han 
8334*5f39d1b3SJooyung Han       "1:"
8335*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
8336*5f39d1b3SJooyung Han 
8337*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x8
8338*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8339*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8340*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
8341*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
8342*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
8343*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
8344*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
8345*5f39d1b3SJooyung Han       "vld1.8 {d4[3]}, [%[in]], %[stride]\n"
8346*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
8347*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [%[in]], %[stride]\n"
8348*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
8349*5f39d1b3SJooyung Han       "vld1.8 {d4[5]}, [%[in]], %[stride]\n"
8350*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
8351*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [%[in]], %[stride]\n"
8352*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
8353*5f39d1b3SJooyung Han       "vld1.8 {d4[7]}, [%[in]], %[stride]\n"
8354*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8355*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8356*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8357*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8358*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8359*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8360*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8361*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8362*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8363*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8364*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8365*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8366*5f39d1b3SJooyung Han 
8367*5f39d1b3SJooyung Han       "bne 1b\n"
8368*5f39d1b3SJooyung Han 
8369*5f39d1b3SJooyung Han       "2:"
8370*5f39d1b3SJooyung Han 
8371*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x1
8372*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
8373*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
8374*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
8375*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
8376*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
8377*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8378*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8379*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8380*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8381*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8382*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8383*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8384*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8385*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8386*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8387*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8388*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8389*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8390*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8391*5f39d1b3SJooyung Han 
8392*5f39d1b3SJooyung Han       // Aggregator Reduction.
8393*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
8394*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
8395*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
8396*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
8397*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
8398*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
8399*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
8400*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
8401*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
8402*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
8403*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
8404*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
8405*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
8406*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
8407*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
8408*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
8409*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
8410*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
8411*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
8412*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
8413*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
8414*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
8415*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
8416*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
8417*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d16", "d17", "d18", "d19", "d20", "d21",
8418*5f39d1b3SJooyung Han         "d22", "d23", "d24", "d25", "cc", "memory");
8419*5f39d1b3SJooyung Han }
8420*5f39d1b3SJooyung Han 
8421*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)8422*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 2, ColumnMajorWithSum>::Pack(
8423*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
8424*5f39d1b3SJooyung Han #ifdef DEBUG
8425*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
8426*5f39d1b3SJooyung Han   std::cout
8427*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
8428*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 5, 8, 2, ColumnMajorWithSum>::Pack()"
8429*5f39d1b3SJooyung Han       << std::endl
8430*5f39d1b3SJooyung Han       << std::flush;
8431*5f39d1b3SJooyung Han #endif
8432*5f39d1b3SJooyung Han #endif
8433*5f39d1b3SJooyung Han   int params_count_copy = params.count;
8434*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
8435*5f39d1b3SJooyung Han   asm volatile(
8436*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
8437*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
8438*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
8439*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
8440*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
8441*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
8442*5f39d1b3SJooyung Han 
8443*5f39d1b3SJooyung Han       // Reduce count by leftovers.
8444*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
8445*5f39d1b3SJooyung Han       "beq 2f\n"
8446*5f39d1b3SJooyung Han 
8447*5f39d1b3SJooyung Han       "1:"
8448*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
8449*5f39d1b3SJooyung Han 
8450*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x8
8451*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8452*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8453*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
8454*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
8455*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
8456*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
8457*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
8458*5f39d1b3SJooyung Han       "vld1.8 {d4[3]}, [%[in]], %[stride]\n"
8459*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
8460*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [%[in]], %[stride]\n"
8461*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
8462*5f39d1b3SJooyung Han       "vld1.8 {d4[5]}, [%[in]], %[stride]\n"
8463*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
8464*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [%[in]], %[stride]\n"
8465*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
8466*5f39d1b3SJooyung Han       "vld1.8 {d4[7]}, [%[in]], %[stride]\n"
8467*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8468*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8469*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8470*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8471*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8472*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8473*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8474*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8475*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8476*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8477*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8478*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8479*5f39d1b3SJooyung Han 
8480*5f39d1b3SJooyung Han       "bne 1b\n"
8481*5f39d1b3SJooyung Han 
8482*5f39d1b3SJooyung Han       "2:"
8483*5f39d1b3SJooyung Han 
8484*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x2
8485*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
8486*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
8487*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
8488*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
8489*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
8490*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8491*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8492*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
8493*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
8494*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8495*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8496*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8497*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8498*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8499*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8500*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8501*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8502*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8503*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8504*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8505*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8506*5f39d1b3SJooyung Han 
8507*5f39d1b3SJooyung Han       // Aggregator Reduction.
8508*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
8509*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
8510*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
8511*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
8512*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
8513*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
8514*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
8515*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
8516*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
8517*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
8518*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
8519*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
8520*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
8521*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
8522*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
8523*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
8524*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
8525*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
8526*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
8527*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
8528*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
8529*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
8530*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
8531*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
8532*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d16", "d17", "d18", "d19", "d20", "d21",
8533*5f39d1b3SJooyung Han         "d22", "d23", "d24", "d25", "cc", "memory");
8534*5f39d1b3SJooyung Han }
8535*5f39d1b3SJooyung Han 
8536*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)8537*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 3, ColumnMajorWithSum>::Pack(
8538*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
8539*5f39d1b3SJooyung Han #ifdef DEBUG
8540*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
8541*5f39d1b3SJooyung Han   std::cout
8542*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
8543*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 5, 8, 3, ColumnMajorWithSum>::Pack()"
8544*5f39d1b3SJooyung Han       << std::endl
8545*5f39d1b3SJooyung Han       << std::flush;
8546*5f39d1b3SJooyung Han #endif
8547*5f39d1b3SJooyung Han #endif
8548*5f39d1b3SJooyung Han   int params_count_copy = params.count;
8549*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
8550*5f39d1b3SJooyung Han   asm volatile(
8551*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
8552*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
8553*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
8554*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
8555*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
8556*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
8557*5f39d1b3SJooyung Han 
8558*5f39d1b3SJooyung Han       // Reduce count by leftovers.
8559*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
8560*5f39d1b3SJooyung Han       "beq 2f\n"
8561*5f39d1b3SJooyung Han 
8562*5f39d1b3SJooyung Han       "1:"
8563*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
8564*5f39d1b3SJooyung Han 
8565*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x8
8566*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8567*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8568*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
8569*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
8570*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
8571*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
8572*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
8573*5f39d1b3SJooyung Han       "vld1.8 {d4[3]}, [%[in]], %[stride]\n"
8574*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
8575*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [%[in]], %[stride]\n"
8576*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
8577*5f39d1b3SJooyung Han       "vld1.8 {d4[5]}, [%[in]], %[stride]\n"
8578*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
8579*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [%[in]], %[stride]\n"
8580*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
8581*5f39d1b3SJooyung Han       "vld1.8 {d4[7]}, [%[in]], %[stride]\n"
8582*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8583*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8584*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8585*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8586*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8587*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8588*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8589*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8590*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8591*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8592*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8593*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8594*5f39d1b3SJooyung Han 
8595*5f39d1b3SJooyung Han       "bne 1b\n"
8596*5f39d1b3SJooyung Han 
8597*5f39d1b3SJooyung Han       "2:"
8598*5f39d1b3SJooyung Han 
8599*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x3
8600*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
8601*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
8602*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
8603*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
8604*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
8605*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8606*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8607*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
8608*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
8609*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
8610*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
8611*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8612*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8613*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8614*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8615*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8616*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8617*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8618*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8619*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8620*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8621*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8622*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8623*5f39d1b3SJooyung Han 
8624*5f39d1b3SJooyung Han       // Aggregator Reduction.
8625*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
8626*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
8627*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
8628*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
8629*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
8630*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
8631*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
8632*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
8633*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
8634*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
8635*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
8636*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
8637*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
8638*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
8639*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
8640*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
8641*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
8642*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
8643*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
8644*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
8645*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
8646*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
8647*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
8648*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
8649*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d16", "d17", "d18", "d19", "d20", "d21",
8650*5f39d1b3SJooyung Han         "d22", "d23", "d24", "d25", "cc", "memory");
8651*5f39d1b3SJooyung Han }
8652*5f39d1b3SJooyung Han 
8653*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)8654*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 4, ColumnMajorWithSum>::Pack(
8655*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
8656*5f39d1b3SJooyung Han #ifdef DEBUG
8657*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
8658*5f39d1b3SJooyung Han   std::cout
8659*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
8660*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 5, 8, 4, ColumnMajorWithSum>::Pack()"
8661*5f39d1b3SJooyung Han       << std::endl
8662*5f39d1b3SJooyung Han       << std::flush;
8663*5f39d1b3SJooyung Han #endif
8664*5f39d1b3SJooyung Han #endif
8665*5f39d1b3SJooyung Han   int params_count_copy = params.count;
8666*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
8667*5f39d1b3SJooyung Han   asm volatile(
8668*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
8669*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
8670*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
8671*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
8672*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
8673*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
8674*5f39d1b3SJooyung Han 
8675*5f39d1b3SJooyung Han       // Reduce count by leftovers.
8676*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
8677*5f39d1b3SJooyung Han       "beq 2f\n"
8678*5f39d1b3SJooyung Han 
8679*5f39d1b3SJooyung Han       "1:"
8680*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
8681*5f39d1b3SJooyung Han 
8682*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x8
8683*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8684*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8685*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
8686*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
8687*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
8688*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
8689*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
8690*5f39d1b3SJooyung Han       "vld1.8 {d4[3]}, [%[in]], %[stride]\n"
8691*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
8692*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [%[in]], %[stride]\n"
8693*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
8694*5f39d1b3SJooyung Han       "vld1.8 {d4[5]}, [%[in]], %[stride]\n"
8695*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
8696*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [%[in]], %[stride]\n"
8697*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
8698*5f39d1b3SJooyung Han       "vld1.8 {d4[7]}, [%[in]], %[stride]\n"
8699*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8700*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8701*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8702*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8703*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8704*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8705*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8706*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8707*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8708*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8709*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8710*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8711*5f39d1b3SJooyung Han 
8712*5f39d1b3SJooyung Han       "bne 1b\n"
8713*5f39d1b3SJooyung Han 
8714*5f39d1b3SJooyung Han       "2:"
8715*5f39d1b3SJooyung Han 
8716*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x4
8717*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
8718*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
8719*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
8720*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
8721*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
8722*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8723*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8724*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
8725*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
8726*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
8727*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
8728*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
8729*5f39d1b3SJooyung Han       "vld1.8 {d4[3]}, [%[in]], %[stride]\n"
8730*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8731*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8732*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8733*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8734*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8735*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8736*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8737*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8738*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8739*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8740*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8741*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8742*5f39d1b3SJooyung Han 
8743*5f39d1b3SJooyung Han       // Aggregator Reduction.
8744*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
8745*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
8746*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
8747*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
8748*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
8749*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
8750*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
8751*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
8752*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
8753*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
8754*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
8755*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
8756*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
8757*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
8758*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
8759*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
8760*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
8761*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
8762*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
8763*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
8764*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
8765*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
8766*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
8767*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
8768*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d16", "d17", "d18", "d19", "d20", "d21",
8769*5f39d1b3SJooyung Han         "d22", "d23", "d24", "d25", "cc", "memory");
8770*5f39d1b3SJooyung Han }
8771*5f39d1b3SJooyung Han 
8772*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)8773*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 5, ColumnMajorWithSum>::Pack(
8774*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
8775*5f39d1b3SJooyung Han #ifdef DEBUG
8776*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
8777*5f39d1b3SJooyung Han   std::cout
8778*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
8779*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 5, 8, 5, ColumnMajorWithSum>::Pack()"
8780*5f39d1b3SJooyung Han       << std::endl
8781*5f39d1b3SJooyung Han       << std::flush;
8782*5f39d1b3SJooyung Han #endif
8783*5f39d1b3SJooyung Han #endif
8784*5f39d1b3SJooyung Han   int params_count_copy = params.count;
8785*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
8786*5f39d1b3SJooyung Han   asm volatile(
8787*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
8788*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
8789*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
8790*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
8791*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
8792*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
8793*5f39d1b3SJooyung Han 
8794*5f39d1b3SJooyung Han       // Reduce count by leftovers.
8795*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
8796*5f39d1b3SJooyung Han       "beq 2f\n"
8797*5f39d1b3SJooyung Han 
8798*5f39d1b3SJooyung Han       "1:"
8799*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
8800*5f39d1b3SJooyung Han 
8801*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x8
8802*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8803*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8804*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
8805*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
8806*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
8807*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
8808*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
8809*5f39d1b3SJooyung Han       "vld1.8 {d4[3]}, [%[in]], %[stride]\n"
8810*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
8811*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [%[in]], %[stride]\n"
8812*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
8813*5f39d1b3SJooyung Han       "vld1.8 {d4[5]}, [%[in]], %[stride]\n"
8814*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
8815*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [%[in]], %[stride]\n"
8816*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
8817*5f39d1b3SJooyung Han       "vld1.8 {d4[7]}, [%[in]], %[stride]\n"
8818*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8819*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8820*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8821*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8822*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8823*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8824*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8825*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8826*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8827*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8828*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8829*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8830*5f39d1b3SJooyung Han 
8831*5f39d1b3SJooyung Han       "bne 1b\n"
8832*5f39d1b3SJooyung Han 
8833*5f39d1b3SJooyung Han       "2:"
8834*5f39d1b3SJooyung Han 
8835*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x5
8836*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
8837*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
8838*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
8839*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
8840*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
8841*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8842*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8843*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
8844*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
8845*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
8846*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
8847*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
8848*5f39d1b3SJooyung Han       "vld1.8 {d4[3]}, [%[in]], %[stride]\n"
8849*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
8850*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [%[in]], %[stride]\n"
8851*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8852*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8853*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8854*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8855*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8856*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8857*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8858*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8859*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8860*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8861*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8862*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8863*5f39d1b3SJooyung Han 
8864*5f39d1b3SJooyung Han       // Aggregator Reduction.
8865*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
8866*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
8867*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
8868*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
8869*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
8870*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
8871*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
8872*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
8873*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
8874*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
8875*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
8876*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
8877*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
8878*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
8879*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
8880*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
8881*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
8882*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
8883*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
8884*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
8885*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
8886*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
8887*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
8888*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
8889*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d16", "d17", "d18", "d19", "d20", "d21",
8890*5f39d1b3SJooyung Han         "d22", "d23", "d24", "d25", "cc", "memory");
8891*5f39d1b3SJooyung Han }
8892*5f39d1b3SJooyung Han 
8893*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)8894*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 6, ColumnMajorWithSum>::Pack(
8895*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
8896*5f39d1b3SJooyung Han #ifdef DEBUG
8897*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
8898*5f39d1b3SJooyung Han   std::cout
8899*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
8900*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 5, 8, 6, ColumnMajorWithSum>::Pack()"
8901*5f39d1b3SJooyung Han       << std::endl
8902*5f39d1b3SJooyung Han       << std::flush;
8903*5f39d1b3SJooyung Han #endif
8904*5f39d1b3SJooyung Han #endif
8905*5f39d1b3SJooyung Han   int params_count_copy = params.count;
8906*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
8907*5f39d1b3SJooyung Han   asm volatile(
8908*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
8909*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
8910*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
8911*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
8912*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
8913*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
8914*5f39d1b3SJooyung Han 
8915*5f39d1b3SJooyung Han       // Reduce count by leftovers.
8916*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
8917*5f39d1b3SJooyung Han       "beq 2f\n"
8918*5f39d1b3SJooyung Han 
8919*5f39d1b3SJooyung Han       "1:"
8920*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
8921*5f39d1b3SJooyung Han 
8922*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x8
8923*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8924*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8925*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
8926*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
8927*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
8928*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
8929*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
8930*5f39d1b3SJooyung Han       "vld1.8 {d4[3]}, [%[in]], %[stride]\n"
8931*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
8932*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [%[in]], %[stride]\n"
8933*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
8934*5f39d1b3SJooyung Han       "vld1.8 {d4[5]}, [%[in]], %[stride]\n"
8935*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
8936*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [%[in]], %[stride]\n"
8937*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
8938*5f39d1b3SJooyung Han       "vld1.8 {d4[7]}, [%[in]], %[stride]\n"
8939*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8940*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8941*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8942*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8943*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8944*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8945*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8946*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8947*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8948*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8949*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8950*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8951*5f39d1b3SJooyung Han 
8952*5f39d1b3SJooyung Han       "bne 1b\n"
8953*5f39d1b3SJooyung Han 
8954*5f39d1b3SJooyung Han       "2:"
8955*5f39d1b3SJooyung Han 
8956*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x6
8957*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
8958*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
8959*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
8960*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
8961*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
8962*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
8963*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
8964*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
8965*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
8966*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
8967*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
8968*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
8969*5f39d1b3SJooyung Han       "vld1.8 {d4[3]}, [%[in]], %[stride]\n"
8970*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
8971*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [%[in]], %[stride]\n"
8972*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
8973*5f39d1b3SJooyung Han       "vld1.8 {d4[5]}, [%[in]], %[stride]\n"
8974*5f39d1b3SJooyung Han       "pld [%[in]]\n"
8975*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
8976*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
8977*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
8978*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
8979*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
8980*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
8981*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
8982*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
8983*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
8984*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
8985*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
8986*5f39d1b3SJooyung Han 
8987*5f39d1b3SJooyung Han       // Aggregator Reduction.
8988*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
8989*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
8990*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
8991*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
8992*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
8993*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
8994*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
8995*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
8996*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
8997*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
8998*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
8999*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
9000*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
9001*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
9002*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
9003*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
9004*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
9005*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
9006*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
9007*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
9008*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
9009*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
9010*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
9011*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
9012*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d16", "d17", "d18", "d19", "d20", "d21",
9013*5f39d1b3SJooyung Han         "d22", "d23", "d24", "d25", "cc", "memory");
9014*5f39d1b3SJooyung Han }
9015*5f39d1b3SJooyung Han 
9016*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)9017*5f39d1b3SJooyung Han inline void Stream<uint8_t, 5, 8, 7, ColumnMajorWithSum>::Pack(
9018*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
9019*5f39d1b3SJooyung Han #ifdef DEBUG
9020*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
9021*5f39d1b3SJooyung Han   std::cout
9022*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
9023*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 5, 8, 7, ColumnMajorWithSum>::Pack()"
9024*5f39d1b3SJooyung Han       << std::endl
9025*5f39d1b3SJooyung Han       << std::flush;
9026*5f39d1b3SJooyung Han #endif
9027*5f39d1b3SJooyung Han #endif
9028*5f39d1b3SJooyung Han   int params_count_copy = params.count;
9029*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
9030*5f39d1b3SJooyung Han   asm volatile(
9031*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
9032*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
9033*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
9034*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
9035*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
9036*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
9037*5f39d1b3SJooyung Han 
9038*5f39d1b3SJooyung Han       // Reduce count by leftovers.
9039*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
9040*5f39d1b3SJooyung Han       "beq 2f\n"
9041*5f39d1b3SJooyung Han 
9042*5f39d1b3SJooyung Han       "1:"
9043*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
9044*5f39d1b3SJooyung Han 
9045*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x8
9046*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9047*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
9048*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9049*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
9050*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9051*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
9052*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
9053*5f39d1b3SJooyung Han       "vld1.8 {d4[3]}, [%[in]], %[stride]\n"
9054*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
9055*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [%[in]], %[stride]\n"
9056*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
9057*5f39d1b3SJooyung Han       "vld1.8 {d4[5]}, [%[in]], %[stride]\n"
9058*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
9059*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [%[in]], %[stride]\n"
9060*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
9061*5f39d1b3SJooyung Han       "vld1.8 {d4[7]}, [%[in]], %[stride]\n"
9062*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9063*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9064*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9065*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9066*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9067*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9068*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9069*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9070*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9071*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9072*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
9073*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
9074*5f39d1b3SJooyung Han 
9075*5f39d1b3SJooyung Han       "bne 1b\n"
9076*5f39d1b3SJooyung Han 
9077*5f39d1b3SJooyung Han       "2:"
9078*5f39d1b3SJooyung Han 
9079*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 5x7
9080*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
9081*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
9082*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
9083*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
9084*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
9085*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9086*5f39d1b3SJooyung Han       "vld1.8 {d4[0]}, [%[in]], %[stride]\n"
9087*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9088*5f39d1b3SJooyung Han       "vld1.8 {d4[1]}, [%[in]], %[stride]\n"
9089*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9090*5f39d1b3SJooyung Han       "vld1.8 {d4[2]}, [%[in]], %[stride]\n"
9091*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
9092*5f39d1b3SJooyung Han       "vld1.8 {d4[3]}, [%[in]], %[stride]\n"
9093*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
9094*5f39d1b3SJooyung Han       "vld1.8 {d4[4]}, [%[in]], %[stride]\n"
9095*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
9096*5f39d1b3SJooyung Han       "vld1.8 {d4[5]}, [%[in]], %[stride]\n"
9097*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
9098*5f39d1b3SJooyung Han       "vld1.8 {d4[6]}, [%[in]], %[stride]\n"
9099*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9100*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9101*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9102*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9103*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9104*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9105*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9106*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9107*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9108*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9109*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
9110*5f39d1b3SJooyung Han       "vst1.32 {d4}, [%[out]:64]!\n"
9111*5f39d1b3SJooyung Han 
9112*5f39d1b3SJooyung Han       // Aggregator Reduction.
9113*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
9114*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
9115*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
9116*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
9117*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
9118*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
9119*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
9120*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
9121*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
9122*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
9123*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
9124*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
9125*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
9126*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
9127*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d24\n"
9128*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
9129*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
9130*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
9131*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
9132*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
9133*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
9134*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
9135*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
9136*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
9137*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d16", "d17", "d18", "d19", "d20", "d21",
9138*5f39d1b3SJooyung Han         "d22", "d23", "d24", "d25", "cc", "memory");
9139*5f39d1b3SJooyung Han }
9140*5f39d1b3SJooyung Han 
9141*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)9142*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 0, ColumnMajorWithSum>::Pack(
9143*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
9144*5f39d1b3SJooyung Han #ifdef DEBUG
9145*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
9146*5f39d1b3SJooyung Han   std::cout
9147*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
9148*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 6, 8, 0, ColumnMajorWithSum>::Pack()"
9149*5f39d1b3SJooyung Han       << std::endl
9150*5f39d1b3SJooyung Han       << std::flush;
9151*5f39d1b3SJooyung Han #endif
9152*5f39d1b3SJooyung Han #endif
9153*5f39d1b3SJooyung Han   int params_count_copy = params.count;
9154*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
9155*5f39d1b3SJooyung Han   asm volatile(
9156*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
9157*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
9158*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
9159*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
9160*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
9161*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
9162*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
9163*5f39d1b3SJooyung Han 
9164*5f39d1b3SJooyung Han       "1:"
9165*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
9166*5f39d1b3SJooyung Han 
9167*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x8
9168*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9169*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9170*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9171*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
9172*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9173*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
9174*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
9175*5f39d1b3SJooyung Han       "vld1.16 {d4[3]}, [%[in]], %[stride]\n"
9176*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
9177*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [%[in]], %[stride]\n"
9178*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
9179*5f39d1b3SJooyung Han       "vld1.16 {d5[1]}, [%[in]], %[stride]\n"
9180*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
9181*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [%[in]], %[stride]\n"
9182*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
9183*5f39d1b3SJooyung Han       "vld1.16 {d5[3]}, [%[in]], %[stride]\n"
9184*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9185*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9186*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9187*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9188*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9189*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9190*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9191*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9192*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9193*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9194*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9195*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9196*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9197*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9198*5f39d1b3SJooyung Han 
9199*5f39d1b3SJooyung Han       "bne 1b\n"
9200*5f39d1b3SJooyung Han 
9201*5f39d1b3SJooyung Han       // Aggregator Reduction.
9202*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
9203*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
9204*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
9205*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
9206*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
9207*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
9208*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
9209*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
9210*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
9211*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
9212*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
9213*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
9214*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
9215*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
9216*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
9217*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
9218*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
9219*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
9220*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
9221*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
9222*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
9223*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
9224*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
9225*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
9226*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
9227*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
9228*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d16", "d17", "d18", "d19", "d20",
9229*5f39d1b3SJooyung Han         "d21", "d22", "d23", "d24", "d25", "d26", "d27", "cc", "memory");
9230*5f39d1b3SJooyung Han }
9231*5f39d1b3SJooyung Han 
9232*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)9233*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 1, ColumnMajorWithSum>::Pack(
9234*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
9235*5f39d1b3SJooyung Han #ifdef DEBUG
9236*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
9237*5f39d1b3SJooyung Han   std::cout
9238*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
9239*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 6, 8, 1, ColumnMajorWithSum>::Pack()"
9240*5f39d1b3SJooyung Han       << std::endl
9241*5f39d1b3SJooyung Han       << std::flush;
9242*5f39d1b3SJooyung Han #endif
9243*5f39d1b3SJooyung Han #endif
9244*5f39d1b3SJooyung Han   int params_count_copy = params.count;
9245*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
9246*5f39d1b3SJooyung Han   asm volatile(
9247*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
9248*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
9249*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
9250*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
9251*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
9252*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
9253*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
9254*5f39d1b3SJooyung Han 
9255*5f39d1b3SJooyung Han       // Reduce count by leftovers.
9256*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
9257*5f39d1b3SJooyung Han       "beq 2f\n"
9258*5f39d1b3SJooyung Han 
9259*5f39d1b3SJooyung Han       "1:"
9260*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
9261*5f39d1b3SJooyung Han 
9262*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x8
9263*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9264*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9265*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9266*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
9267*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9268*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
9269*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
9270*5f39d1b3SJooyung Han       "vld1.16 {d4[3]}, [%[in]], %[stride]\n"
9271*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
9272*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [%[in]], %[stride]\n"
9273*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
9274*5f39d1b3SJooyung Han       "vld1.16 {d5[1]}, [%[in]], %[stride]\n"
9275*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
9276*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [%[in]], %[stride]\n"
9277*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
9278*5f39d1b3SJooyung Han       "vld1.16 {d5[3]}, [%[in]], %[stride]\n"
9279*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9280*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9281*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9282*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9283*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9284*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9285*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9286*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9287*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9288*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9289*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9290*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9291*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9292*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9293*5f39d1b3SJooyung Han 
9294*5f39d1b3SJooyung Han       "bne 1b\n"
9295*5f39d1b3SJooyung Han 
9296*5f39d1b3SJooyung Han       "2:"
9297*5f39d1b3SJooyung Han 
9298*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x1
9299*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
9300*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
9301*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
9302*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
9303*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
9304*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
9305*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9306*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9307*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9308*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9309*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9310*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9311*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9312*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9313*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9314*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9315*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9316*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9317*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9318*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9319*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9320*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9321*5f39d1b3SJooyung Han 
9322*5f39d1b3SJooyung Han       // Aggregator Reduction.
9323*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
9324*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
9325*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
9326*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
9327*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
9328*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
9329*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
9330*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
9331*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
9332*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
9333*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
9334*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
9335*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
9336*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
9337*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
9338*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
9339*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
9340*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
9341*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
9342*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
9343*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
9344*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
9345*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
9346*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
9347*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
9348*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
9349*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d16", "d17", "d18", "d19", "d20",
9350*5f39d1b3SJooyung Han         "d21", "d22", "d23", "d24", "d25", "d26", "d27", "cc", "memory");
9351*5f39d1b3SJooyung Han }
9352*5f39d1b3SJooyung Han 
9353*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)9354*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 2, ColumnMajorWithSum>::Pack(
9355*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
9356*5f39d1b3SJooyung Han #ifdef DEBUG
9357*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
9358*5f39d1b3SJooyung Han   std::cout
9359*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
9360*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 6, 8, 2, ColumnMajorWithSum>::Pack()"
9361*5f39d1b3SJooyung Han       << std::endl
9362*5f39d1b3SJooyung Han       << std::flush;
9363*5f39d1b3SJooyung Han #endif
9364*5f39d1b3SJooyung Han #endif
9365*5f39d1b3SJooyung Han   int params_count_copy = params.count;
9366*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
9367*5f39d1b3SJooyung Han   asm volatile(
9368*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
9369*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
9370*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
9371*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
9372*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
9373*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
9374*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
9375*5f39d1b3SJooyung Han 
9376*5f39d1b3SJooyung Han       // Reduce count by leftovers.
9377*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
9378*5f39d1b3SJooyung Han       "beq 2f\n"
9379*5f39d1b3SJooyung Han 
9380*5f39d1b3SJooyung Han       "1:"
9381*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
9382*5f39d1b3SJooyung Han 
9383*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x8
9384*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9385*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9386*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9387*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
9388*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9389*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
9390*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
9391*5f39d1b3SJooyung Han       "vld1.16 {d4[3]}, [%[in]], %[stride]\n"
9392*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
9393*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [%[in]], %[stride]\n"
9394*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
9395*5f39d1b3SJooyung Han       "vld1.16 {d5[1]}, [%[in]], %[stride]\n"
9396*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
9397*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [%[in]], %[stride]\n"
9398*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
9399*5f39d1b3SJooyung Han       "vld1.16 {d5[3]}, [%[in]], %[stride]\n"
9400*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9401*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9402*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9403*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9404*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9405*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9406*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9407*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9408*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9409*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9410*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9411*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9412*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9413*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9414*5f39d1b3SJooyung Han 
9415*5f39d1b3SJooyung Han       "bne 1b\n"
9416*5f39d1b3SJooyung Han 
9417*5f39d1b3SJooyung Han       "2:"
9418*5f39d1b3SJooyung Han 
9419*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x2
9420*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
9421*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
9422*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
9423*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
9424*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
9425*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
9426*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9427*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9428*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9429*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
9430*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9431*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9432*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9433*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9434*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9435*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9436*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9437*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9438*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9439*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9440*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9441*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9442*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9443*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9444*5f39d1b3SJooyung Han 
9445*5f39d1b3SJooyung Han       // Aggregator Reduction.
9446*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
9447*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
9448*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
9449*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
9450*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
9451*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
9452*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
9453*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
9454*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
9455*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
9456*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
9457*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
9458*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
9459*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
9460*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
9461*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
9462*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
9463*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
9464*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
9465*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
9466*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
9467*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
9468*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
9469*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
9470*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
9471*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
9472*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d16", "d17", "d18", "d19", "d20",
9473*5f39d1b3SJooyung Han         "d21", "d22", "d23", "d24", "d25", "d26", "d27", "cc", "memory");
9474*5f39d1b3SJooyung Han }
9475*5f39d1b3SJooyung Han 
9476*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)9477*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 3, ColumnMajorWithSum>::Pack(
9478*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
9479*5f39d1b3SJooyung Han #ifdef DEBUG
9480*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
9481*5f39d1b3SJooyung Han   std::cout
9482*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
9483*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 6, 8, 3, ColumnMajorWithSum>::Pack()"
9484*5f39d1b3SJooyung Han       << std::endl
9485*5f39d1b3SJooyung Han       << std::flush;
9486*5f39d1b3SJooyung Han #endif
9487*5f39d1b3SJooyung Han #endif
9488*5f39d1b3SJooyung Han   int params_count_copy = params.count;
9489*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
9490*5f39d1b3SJooyung Han   asm volatile(
9491*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
9492*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
9493*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
9494*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
9495*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
9496*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
9497*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
9498*5f39d1b3SJooyung Han 
9499*5f39d1b3SJooyung Han       // Reduce count by leftovers.
9500*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
9501*5f39d1b3SJooyung Han       "beq 2f\n"
9502*5f39d1b3SJooyung Han 
9503*5f39d1b3SJooyung Han       "1:"
9504*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
9505*5f39d1b3SJooyung Han 
9506*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x8
9507*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9508*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9509*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9510*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
9511*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9512*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
9513*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
9514*5f39d1b3SJooyung Han       "vld1.16 {d4[3]}, [%[in]], %[stride]\n"
9515*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
9516*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [%[in]], %[stride]\n"
9517*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
9518*5f39d1b3SJooyung Han       "vld1.16 {d5[1]}, [%[in]], %[stride]\n"
9519*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
9520*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [%[in]], %[stride]\n"
9521*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
9522*5f39d1b3SJooyung Han       "vld1.16 {d5[3]}, [%[in]], %[stride]\n"
9523*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9524*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9525*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9526*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9527*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9528*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9529*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9530*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9531*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9532*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9533*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9534*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9535*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9536*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9537*5f39d1b3SJooyung Han 
9538*5f39d1b3SJooyung Han       "bne 1b\n"
9539*5f39d1b3SJooyung Han 
9540*5f39d1b3SJooyung Han       "2:"
9541*5f39d1b3SJooyung Han 
9542*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x3
9543*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
9544*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
9545*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
9546*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
9547*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
9548*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
9549*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9550*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9551*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9552*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
9553*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9554*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
9555*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9556*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9557*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9558*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9559*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9560*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9561*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9562*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9563*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9564*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9565*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9566*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9567*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9568*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9569*5f39d1b3SJooyung Han 
9570*5f39d1b3SJooyung Han       // Aggregator Reduction.
9571*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
9572*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
9573*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
9574*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
9575*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
9576*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
9577*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
9578*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
9579*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
9580*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
9581*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
9582*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
9583*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
9584*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
9585*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
9586*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
9587*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
9588*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
9589*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
9590*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
9591*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
9592*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
9593*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
9594*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
9595*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
9596*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
9597*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d16", "d17", "d18", "d19", "d20",
9598*5f39d1b3SJooyung Han         "d21", "d22", "d23", "d24", "d25", "d26", "d27", "cc", "memory");
9599*5f39d1b3SJooyung Han }
9600*5f39d1b3SJooyung Han 
9601*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)9602*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 4, ColumnMajorWithSum>::Pack(
9603*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
9604*5f39d1b3SJooyung Han #ifdef DEBUG
9605*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
9606*5f39d1b3SJooyung Han   std::cout
9607*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
9608*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 6, 8, 4, ColumnMajorWithSum>::Pack()"
9609*5f39d1b3SJooyung Han       << std::endl
9610*5f39d1b3SJooyung Han       << std::flush;
9611*5f39d1b3SJooyung Han #endif
9612*5f39d1b3SJooyung Han #endif
9613*5f39d1b3SJooyung Han   int params_count_copy = params.count;
9614*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
9615*5f39d1b3SJooyung Han   asm volatile(
9616*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
9617*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
9618*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
9619*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
9620*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
9621*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
9622*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
9623*5f39d1b3SJooyung Han 
9624*5f39d1b3SJooyung Han       // Reduce count by leftovers.
9625*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
9626*5f39d1b3SJooyung Han       "beq 2f\n"
9627*5f39d1b3SJooyung Han 
9628*5f39d1b3SJooyung Han       "1:"
9629*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
9630*5f39d1b3SJooyung Han 
9631*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x8
9632*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9633*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9634*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9635*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
9636*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9637*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
9638*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
9639*5f39d1b3SJooyung Han       "vld1.16 {d4[3]}, [%[in]], %[stride]\n"
9640*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
9641*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [%[in]], %[stride]\n"
9642*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
9643*5f39d1b3SJooyung Han       "vld1.16 {d5[1]}, [%[in]], %[stride]\n"
9644*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
9645*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [%[in]], %[stride]\n"
9646*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
9647*5f39d1b3SJooyung Han       "vld1.16 {d5[3]}, [%[in]], %[stride]\n"
9648*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9649*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9650*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9651*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9652*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9653*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9654*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9655*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9656*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9657*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9658*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9659*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9660*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9661*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9662*5f39d1b3SJooyung Han 
9663*5f39d1b3SJooyung Han       "bne 1b\n"
9664*5f39d1b3SJooyung Han 
9665*5f39d1b3SJooyung Han       "2:"
9666*5f39d1b3SJooyung Han 
9667*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x4
9668*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
9669*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
9670*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
9671*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
9672*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
9673*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
9674*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9675*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9676*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9677*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
9678*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9679*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
9680*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
9681*5f39d1b3SJooyung Han       "vld1.16 {d4[3]}, [%[in]], %[stride]\n"
9682*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9683*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9684*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9685*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9686*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9687*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9688*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9689*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9690*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9691*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9692*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9693*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9694*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9695*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9696*5f39d1b3SJooyung Han 
9697*5f39d1b3SJooyung Han       // Aggregator Reduction.
9698*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
9699*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
9700*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
9701*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
9702*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
9703*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
9704*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
9705*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
9706*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
9707*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
9708*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
9709*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
9710*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
9711*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
9712*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
9713*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
9714*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
9715*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
9716*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
9717*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
9718*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
9719*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
9720*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
9721*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
9722*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
9723*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
9724*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d16", "d17", "d18", "d19", "d20",
9725*5f39d1b3SJooyung Han         "d21", "d22", "d23", "d24", "d25", "d26", "d27", "cc", "memory");
9726*5f39d1b3SJooyung Han }
9727*5f39d1b3SJooyung Han 
9728*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)9729*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 5, ColumnMajorWithSum>::Pack(
9730*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
9731*5f39d1b3SJooyung Han #ifdef DEBUG
9732*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
9733*5f39d1b3SJooyung Han   std::cout
9734*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
9735*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 6, 8, 5, ColumnMajorWithSum>::Pack()"
9736*5f39d1b3SJooyung Han       << std::endl
9737*5f39d1b3SJooyung Han       << std::flush;
9738*5f39d1b3SJooyung Han #endif
9739*5f39d1b3SJooyung Han #endif
9740*5f39d1b3SJooyung Han   int params_count_copy = params.count;
9741*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
9742*5f39d1b3SJooyung Han   asm volatile(
9743*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
9744*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
9745*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
9746*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
9747*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
9748*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
9749*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
9750*5f39d1b3SJooyung Han 
9751*5f39d1b3SJooyung Han       // Reduce count by leftovers.
9752*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
9753*5f39d1b3SJooyung Han       "beq 2f\n"
9754*5f39d1b3SJooyung Han 
9755*5f39d1b3SJooyung Han       "1:"
9756*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
9757*5f39d1b3SJooyung Han 
9758*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x8
9759*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9760*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9761*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9762*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
9763*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9764*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
9765*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
9766*5f39d1b3SJooyung Han       "vld1.16 {d4[3]}, [%[in]], %[stride]\n"
9767*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
9768*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [%[in]], %[stride]\n"
9769*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
9770*5f39d1b3SJooyung Han       "vld1.16 {d5[1]}, [%[in]], %[stride]\n"
9771*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
9772*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [%[in]], %[stride]\n"
9773*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
9774*5f39d1b3SJooyung Han       "vld1.16 {d5[3]}, [%[in]], %[stride]\n"
9775*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9776*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9777*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9778*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9779*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9780*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9781*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9782*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9783*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9784*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9785*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9786*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9787*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9788*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9789*5f39d1b3SJooyung Han 
9790*5f39d1b3SJooyung Han       "bne 1b\n"
9791*5f39d1b3SJooyung Han 
9792*5f39d1b3SJooyung Han       "2:"
9793*5f39d1b3SJooyung Han 
9794*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x5
9795*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
9796*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
9797*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
9798*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
9799*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
9800*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
9801*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9802*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9803*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9804*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
9805*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9806*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
9807*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
9808*5f39d1b3SJooyung Han       "vld1.16 {d4[3]}, [%[in]], %[stride]\n"
9809*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
9810*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [%[in]], %[stride]\n"
9811*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9812*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9813*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9814*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9815*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9816*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9817*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9818*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9819*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9820*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9821*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9822*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9823*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9824*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9825*5f39d1b3SJooyung Han 
9826*5f39d1b3SJooyung Han       // Aggregator Reduction.
9827*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
9828*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
9829*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
9830*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
9831*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
9832*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
9833*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
9834*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
9835*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
9836*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
9837*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
9838*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
9839*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
9840*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
9841*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
9842*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
9843*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
9844*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
9845*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
9846*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
9847*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
9848*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
9849*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
9850*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
9851*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
9852*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
9853*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d16", "d17", "d18", "d19", "d20",
9854*5f39d1b3SJooyung Han         "d21", "d22", "d23", "d24", "d25", "d26", "d27", "cc", "memory");
9855*5f39d1b3SJooyung Han }
9856*5f39d1b3SJooyung Han 
9857*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)9858*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 6, ColumnMajorWithSum>::Pack(
9859*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
9860*5f39d1b3SJooyung Han #ifdef DEBUG
9861*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
9862*5f39d1b3SJooyung Han   std::cout
9863*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
9864*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 6, 8, 6, ColumnMajorWithSum>::Pack()"
9865*5f39d1b3SJooyung Han       << std::endl
9866*5f39d1b3SJooyung Han       << std::flush;
9867*5f39d1b3SJooyung Han #endif
9868*5f39d1b3SJooyung Han #endif
9869*5f39d1b3SJooyung Han   int params_count_copy = params.count;
9870*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
9871*5f39d1b3SJooyung Han   asm volatile(
9872*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
9873*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
9874*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
9875*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
9876*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
9877*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
9878*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
9879*5f39d1b3SJooyung Han 
9880*5f39d1b3SJooyung Han       // Reduce count by leftovers.
9881*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
9882*5f39d1b3SJooyung Han       "beq 2f\n"
9883*5f39d1b3SJooyung Han 
9884*5f39d1b3SJooyung Han       "1:"
9885*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
9886*5f39d1b3SJooyung Han 
9887*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x8
9888*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9889*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9890*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9891*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
9892*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9893*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
9894*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
9895*5f39d1b3SJooyung Han       "vld1.16 {d4[3]}, [%[in]], %[stride]\n"
9896*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
9897*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [%[in]], %[stride]\n"
9898*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
9899*5f39d1b3SJooyung Han       "vld1.16 {d5[1]}, [%[in]], %[stride]\n"
9900*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
9901*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [%[in]], %[stride]\n"
9902*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
9903*5f39d1b3SJooyung Han       "vld1.16 {d5[3]}, [%[in]], %[stride]\n"
9904*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9905*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9906*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9907*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9908*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9909*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9910*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9911*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9912*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9913*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9914*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9915*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9916*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9917*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9918*5f39d1b3SJooyung Han 
9919*5f39d1b3SJooyung Han       "bne 1b\n"
9920*5f39d1b3SJooyung Han 
9921*5f39d1b3SJooyung Han       "2:"
9922*5f39d1b3SJooyung Han 
9923*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x6
9924*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
9925*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
9926*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
9927*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
9928*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
9929*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
9930*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
9931*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
9932*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
9933*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
9934*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
9935*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
9936*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
9937*5f39d1b3SJooyung Han       "vld1.16 {d4[3]}, [%[in]], %[stride]\n"
9938*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
9939*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [%[in]], %[stride]\n"
9940*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
9941*5f39d1b3SJooyung Han       "vld1.16 {d5[1]}, [%[in]], %[stride]\n"
9942*5f39d1b3SJooyung Han       "pld [%[in]]\n"
9943*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
9944*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
9945*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
9946*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
9947*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
9948*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
9949*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
9950*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
9951*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
9952*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
9953*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
9954*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
9955*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
9956*5f39d1b3SJooyung Han 
9957*5f39d1b3SJooyung Han       // Aggregator Reduction.
9958*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
9959*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
9960*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
9961*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
9962*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
9963*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
9964*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
9965*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
9966*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
9967*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
9968*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
9969*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
9970*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
9971*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
9972*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
9973*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
9974*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
9975*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
9976*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
9977*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
9978*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
9979*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
9980*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
9981*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
9982*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
9983*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
9984*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d16", "d17", "d18", "d19", "d20",
9985*5f39d1b3SJooyung Han         "d21", "d22", "d23", "d24", "d25", "d26", "d27", "cc", "memory");
9986*5f39d1b3SJooyung Han }
9987*5f39d1b3SJooyung Han 
9988*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)9989*5f39d1b3SJooyung Han inline void Stream<uint8_t, 6, 8, 7, ColumnMajorWithSum>::Pack(
9990*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
9991*5f39d1b3SJooyung Han #ifdef DEBUG
9992*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
9993*5f39d1b3SJooyung Han   std::cout
9994*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
9995*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 6, 8, 7, ColumnMajorWithSum>::Pack()"
9996*5f39d1b3SJooyung Han       << std::endl
9997*5f39d1b3SJooyung Han       << std::flush;
9998*5f39d1b3SJooyung Han #endif
9999*5f39d1b3SJooyung Han #endif
10000*5f39d1b3SJooyung Han   int params_count_copy = params.count;
10001*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
10002*5f39d1b3SJooyung Han   asm volatile(
10003*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
10004*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
10005*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
10006*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
10007*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
10008*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
10009*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
10010*5f39d1b3SJooyung Han 
10011*5f39d1b3SJooyung Han       // Reduce count by leftovers.
10012*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
10013*5f39d1b3SJooyung Han       "beq 2f\n"
10014*5f39d1b3SJooyung Han 
10015*5f39d1b3SJooyung Han       "1:"
10016*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
10017*5f39d1b3SJooyung Han 
10018*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x8
10019*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10020*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
10021*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10022*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
10023*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10024*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
10025*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
10026*5f39d1b3SJooyung Han       "vld1.16 {d4[3]}, [%[in]], %[stride]\n"
10027*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
10028*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [%[in]], %[stride]\n"
10029*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
10030*5f39d1b3SJooyung Han       "vld1.16 {d5[1]}, [%[in]], %[stride]\n"
10031*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
10032*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [%[in]], %[stride]\n"
10033*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
10034*5f39d1b3SJooyung Han       "vld1.16 {d5[3]}, [%[in]], %[stride]\n"
10035*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10036*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10037*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10038*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
10039*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10040*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10041*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10042*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10043*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10044*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10045*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10046*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10047*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
10048*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
10049*5f39d1b3SJooyung Han 
10050*5f39d1b3SJooyung Han       "bne 1b\n"
10051*5f39d1b3SJooyung Han 
10052*5f39d1b3SJooyung Han       "2:"
10053*5f39d1b3SJooyung Han 
10054*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 6x7
10055*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
10056*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
10057*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
10058*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
10059*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
10060*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
10061*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10062*5f39d1b3SJooyung Han       "vld1.16 {d4[0]}, [%[in]], %[stride]\n"
10063*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10064*5f39d1b3SJooyung Han       "vld1.16 {d4[1]}, [%[in]], %[stride]\n"
10065*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10066*5f39d1b3SJooyung Han       "vld1.16 {d4[2]}, [%[in]], %[stride]\n"
10067*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
10068*5f39d1b3SJooyung Han       "vld1.16 {d4[3]}, [%[in]], %[stride]\n"
10069*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
10070*5f39d1b3SJooyung Han       "vld1.16 {d5[0]}, [%[in]], %[stride]\n"
10071*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
10072*5f39d1b3SJooyung Han       "vld1.16 {d5[1]}, [%[in]], %[stride]\n"
10073*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
10074*5f39d1b3SJooyung Han       "vld1.16 {d5[2]}, [%[in]], %[stride]\n"
10075*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10076*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10077*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10078*5f39d1b3SJooyung Han       "vuzp.8 d4, d5\n"
10079*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10080*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10081*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10082*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10083*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10084*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10085*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10086*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10087*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:128]!\n"
10088*5f39d1b3SJooyung Han       "vst1.32 {d4, d5}, [%[out]:128]!\n"
10089*5f39d1b3SJooyung Han 
10090*5f39d1b3SJooyung Han       // Aggregator Reduction.
10091*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
10092*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
10093*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
10094*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
10095*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
10096*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
10097*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
10098*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
10099*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
10100*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
10101*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
10102*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
10103*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
10104*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
10105*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
10106*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
10107*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
10108*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
10109*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
10110*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
10111*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
10112*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:128]\n"
10113*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
10114*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
10115*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
10116*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
10117*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d16", "d17", "d18", "d19", "d20",
10118*5f39d1b3SJooyung Han         "d21", "d22", "d23", "d24", "d25", "d26", "d27", "cc", "memory");
10119*5f39d1b3SJooyung Han }
10120*5f39d1b3SJooyung Han 
10121*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)10122*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 0, ColumnMajorWithSum>::Pack(
10123*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
10124*5f39d1b3SJooyung Han #ifdef DEBUG
10125*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
10126*5f39d1b3SJooyung Han   std::cout
10127*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
10128*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 7, 8, 0, ColumnMajorWithSum>::Pack()"
10129*5f39d1b3SJooyung Han       << std::endl
10130*5f39d1b3SJooyung Han       << std::flush;
10131*5f39d1b3SJooyung Han #endif
10132*5f39d1b3SJooyung Han #endif
10133*5f39d1b3SJooyung Han   int params_count_copy = params.count;
10134*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
10135*5f39d1b3SJooyung Han   asm volatile(
10136*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
10137*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
10138*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
10139*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
10140*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
10141*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
10142*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
10143*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
10144*5f39d1b3SJooyung Han 
10145*5f39d1b3SJooyung Han       "1:"
10146*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
10147*5f39d1b3SJooyung Han 
10148*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x8
10149*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10150*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10151*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10152*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
10153*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10154*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
10155*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
10156*5f39d1b3SJooyung Han       "vld3.8 {d4[3], d5[3], d6[3]}, [%[in]], %[stride]\n"
10157*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
10158*5f39d1b3SJooyung Han       "vld3.8 {d4[4], d5[4], d6[4]}, [%[in]], %[stride]\n"
10159*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
10160*5f39d1b3SJooyung Han       "vld3.8 {d4[5], d5[5], d6[5]}, [%[in]], %[stride]\n"
10161*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
10162*5f39d1b3SJooyung Han       "vld3.8 {d4[6], d5[6], d6[6]}, [%[in]], %[stride]\n"
10163*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
10164*5f39d1b3SJooyung Han       "vld3.8 {d4[7], d5[7], d6[7]}, [%[in]], %[stride]\n"
10165*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10166*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10167*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10168*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10169*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10170*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10171*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10172*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10173*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10174*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10175*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10176*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10177*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10178*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10179*5f39d1b3SJooyung Han 
10180*5f39d1b3SJooyung Han       "bne 1b\n"
10181*5f39d1b3SJooyung Han 
10182*5f39d1b3SJooyung Han       // Aggregator Reduction.
10183*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
10184*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
10185*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
10186*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
10187*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
10188*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
10189*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
10190*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
10191*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
10192*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
10193*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
10194*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
10195*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
10196*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
10197*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
10198*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
10199*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
10200*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
10201*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
10202*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
10203*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
10204*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
10205*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
10206*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
10207*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
10208*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
10209*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
10210*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
10211*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
10212*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d16", "d17", "d18", "d19",
10213*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29",
10214*5f39d1b3SJooyung Han         "cc", "memory");
10215*5f39d1b3SJooyung Han }
10216*5f39d1b3SJooyung Han 
10217*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)10218*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 1, ColumnMajorWithSum>::Pack(
10219*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
10220*5f39d1b3SJooyung Han #ifdef DEBUG
10221*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
10222*5f39d1b3SJooyung Han   std::cout
10223*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
10224*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 7, 8, 1, ColumnMajorWithSum>::Pack()"
10225*5f39d1b3SJooyung Han       << std::endl
10226*5f39d1b3SJooyung Han       << std::flush;
10227*5f39d1b3SJooyung Han #endif
10228*5f39d1b3SJooyung Han #endif
10229*5f39d1b3SJooyung Han   int params_count_copy = params.count;
10230*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
10231*5f39d1b3SJooyung Han   asm volatile(
10232*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
10233*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
10234*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
10235*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
10236*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
10237*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
10238*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
10239*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
10240*5f39d1b3SJooyung Han 
10241*5f39d1b3SJooyung Han       // Reduce count by leftovers.
10242*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
10243*5f39d1b3SJooyung Han       "beq 2f\n"
10244*5f39d1b3SJooyung Han 
10245*5f39d1b3SJooyung Han       "1:"
10246*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
10247*5f39d1b3SJooyung Han 
10248*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x8
10249*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10250*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10251*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10252*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
10253*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10254*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
10255*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
10256*5f39d1b3SJooyung Han       "vld3.8 {d4[3], d5[3], d6[3]}, [%[in]], %[stride]\n"
10257*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
10258*5f39d1b3SJooyung Han       "vld3.8 {d4[4], d5[4], d6[4]}, [%[in]], %[stride]\n"
10259*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
10260*5f39d1b3SJooyung Han       "vld3.8 {d4[5], d5[5], d6[5]}, [%[in]], %[stride]\n"
10261*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
10262*5f39d1b3SJooyung Han       "vld3.8 {d4[6], d5[6], d6[6]}, [%[in]], %[stride]\n"
10263*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
10264*5f39d1b3SJooyung Han       "vld3.8 {d4[7], d5[7], d6[7]}, [%[in]], %[stride]\n"
10265*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10266*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10267*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10268*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10269*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10270*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10271*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10272*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10273*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10274*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10275*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10276*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10277*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10278*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10279*5f39d1b3SJooyung Han 
10280*5f39d1b3SJooyung Han       "bne 1b\n"
10281*5f39d1b3SJooyung Han 
10282*5f39d1b3SJooyung Han       "2:"
10283*5f39d1b3SJooyung Han 
10284*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x1
10285*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
10286*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
10287*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
10288*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
10289*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
10290*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
10291*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
10292*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10293*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10294*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10295*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10296*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10297*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10298*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10299*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10300*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10301*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10302*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10303*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10304*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10305*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10306*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10307*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10308*5f39d1b3SJooyung Han 
10309*5f39d1b3SJooyung Han       // Aggregator Reduction.
10310*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
10311*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
10312*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
10313*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
10314*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
10315*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
10316*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
10317*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
10318*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
10319*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
10320*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
10321*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
10322*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
10323*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
10324*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
10325*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
10326*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
10327*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
10328*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
10329*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
10330*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
10331*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
10332*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
10333*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
10334*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
10335*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
10336*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
10337*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
10338*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
10339*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d16", "d17", "d18", "d19",
10340*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29",
10341*5f39d1b3SJooyung Han         "cc", "memory");
10342*5f39d1b3SJooyung Han }
10343*5f39d1b3SJooyung Han 
10344*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)10345*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 2, ColumnMajorWithSum>::Pack(
10346*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
10347*5f39d1b3SJooyung Han #ifdef DEBUG
10348*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
10349*5f39d1b3SJooyung Han   std::cout
10350*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
10351*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 7, 8, 2, ColumnMajorWithSum>::Pack()"
10352*5f39d1b3SJooyung Han       << std::endl
10353*5f39d1b3SJooyung Han       << std::flush;
10354*5f39d1b3SJooyung Han #endif
10355*5f39d1b3SJooyung Han #endif
10356*5f39d1b3SJooyung Han   int params_count_copy = params.count;
10357*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
10358*5f39d1b3SJooyung Han   asm volatile(
10359*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
10360*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
10361*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
10362*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
10363*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
10364*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
10365*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
10366*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
10367*5f39d1b3SJooyung Han 
10368*5f39d1b3SJooyung Han       // Reduce count by leftovers.
10369*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
10370*5f39d1b3SJooyung Han       "beq 2f\n"
10371*5f39d1b3SJooyung Han 
10372*5f39d1b3SJooyung Han       "1:"
10373*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
10374*5f39d1b3SJooyung Han 
10375*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x8
10376*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10377*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10378*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10379*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
10380*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10381*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
10382*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
10383*5f39d1b3SJooyung Han       "vld3.8 {d4[3], d5[3], d6[3]}, [%[in]], %[stride]\n"
10384*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
10385*5f39d1b3SJooyung Han       "vld3.8 {d4[4], d5[4], d6[4]}, [%[in]], %[stride]\n"
10386*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
10387*5f39d1b3SJooyung Han       "vld3.8 {d4[5], d5[5], d6[5]}, [%[in]], %[stride]\n"
10388*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
10389*5f39d1b3SJooyung Han       "vld3.8 {d4[6], d5[6], d6[6]}, [%[in]], %[stride]\n"
10390*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
10391*5f39d1b3SJooyung Han       "vld3.8 {d4[7], d5[7], d6[7]}, [%[in]], %[stride]\n"
10392*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10393*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10394*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10395*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10396*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10397*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10398*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10399*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10400*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10401*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10402*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10403*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10404*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10405*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10406*5f39d1b3SJooyung Han 
10407*5f39d1b3SJooyung Han       "bne 1b\n"
10408*5f39d1b3SJooyung Han 
10409*5f39d1b3SJooyung Han       "2:"
10410*5f39d1b3SJooyung Han 
10411*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x2
10412*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
10413*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
10414*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
10415*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
10416*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
10417*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
10418*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
10419*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10420*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10421*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10422*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
10423*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10424*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10425*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10426*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10427*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10428*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10429*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10430*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10431*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10432*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10433*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10434*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10435*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10436*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10437*5f39d1b3SJooyung Han 
10438*5f39d1b3SJooyung Han       // Aggregator Reduction.
10439*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
10440*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
10441*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
10442*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
10443*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
10444*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
10445*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
10446*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
10447*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
10448*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
10449*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
10450*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
10451*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
10452*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
10453*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
10454*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
10455*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
10456*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
10457*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
10458*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
10459*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
10460*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
10461*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
10462*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
10463*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
10464*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
10465*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
10466*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
10467*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
10468*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d16", "d17", "d18", "d19",
10469*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29",
10470*5f39d1b3SJooyung Han         "cc", "memory");
10471*5f39d1b3SJooyung Han }
10472*5f39d1b3SJooyung Han 
10473*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)10474*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 3, ColumnMajorWithSum>::Pack(
10475*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
10476*5f39d1b3SJooyung Han #ifdef DEBUG
10477*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
10478*5f39d1b3SJooyung Han   std::cout
10479*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
10480*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 7, 8, 3, ColumnMajorWithSum>::Pack()"
10481*5f39d1b3SJooyung Han       << std::endl
10482*5f39d1b3SJooyung Han       << std::flush;
10483*5f39d1b3SJooyung Han #endif
10484*5f39d1b3SJooyung Han #endif
10485*5f39d1b3SJooyung Han   int params_count_copy = params.count;
10486*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
10487*5f39d1b3SJooyung Han   asm volatile(
10488*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
10489*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
10490*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
10491*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
10492*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
10493*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
10494*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
10495*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
10496*5f39d1b3SJooyung Han 
10497*5f39d1b3SJooyung Han       // Reduce count by leftovers.
10498*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
10499*5f39d1b3SJooyung Han       "beq 2f\n"
10500*5f39d1b3SJooyung Han 
10501*5f39d1b3SJooyung Han       "1:"
10502*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
10503*5f39d1b3SJooyung Han 
10504*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x8
10505*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10506*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10507*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10508*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
10509*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10510*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
10511*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
10512*5f39d1b3SJooyung Han       "vld3.8 {d4[3], d5[3], d6[3]}, [%[in]], %[stride]\n"
10513*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
10514*5f39d1b3SJooyung Han       "vld3.8 {d4[4], d5[4], d6[4]}, [%[in]], %[stride]\n"
10515*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
10516*5f39d1b3SJooyung Han       "vld3.8 {d4[5], d5[5], d6[5]}, [%[in]], %[stride]\n"
10517*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
10518*5f39d1b3SJooyung Han       "vld3.8 {d4[6], d5[6], d6[6]}, [%[in]], %[stride]\n"
10519*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
10520*5f39d1b3SJooyung Han       "vld3.8 {d4[7], d5[7], d6[7]}, [%[in]], %[stride]\n"
10521*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10522*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10523*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10524*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10525*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10526*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10527*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10528*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10529*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10530*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10531*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10532*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10533*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10534*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10535*5f39d1b3SJooyung Han 
10536*5f39d1b3SJooyung Han       "bne 1b\n"
10537*5f39d1b3SJooyung Han 
10538*5f39d1b3SJooyung Han       "2:"
10539*5f39d1b3SJooyung Han 
10540*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x3
10541*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
10542*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
10543*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
10544*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
10545*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
10546*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
10547*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
10548*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10549*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10550*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10551*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
10552*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10553*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
10554*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10555*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10556*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10557*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10558*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10559*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10560*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10561*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10562*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10563*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10564*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10565*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10566*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10567*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10568*5f39d1b3SJooyung Han 
10569*5f39d1b3SJooyung Han       // Aggregator Reduction.
10570*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
10571*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
10572*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
10573*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
10574*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
10575*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
10576*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
10577*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
10578*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
10579*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
10580*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
10581*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
10582*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
10583*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
10584*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
10585*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
10586*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
10587*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
10588*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
10589*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
10590*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
10591*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
10592*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
10593*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
10594*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
10595*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
10596*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
10597*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
10598*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
10599*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d16", "d17", "d18", "d19",
10600*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29",
10601*5f39d1b3SJooyung Han         "cc", "memory");
10602*5f39d1b3SJooyung Han }
10603*5f39d1b3SJooyung Han 
10604*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)10605*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 4, ColumnMajorWithSum>::Pack(
10606*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
10607*5f39d1b3SJooyung Han #ifdef DEBUG
10608*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
10609*5f39d1b3SJooyung Han   std::cout
10610*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
10611*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 7, 8, 4, ColumnMajorWithSum>::Pack()"
10612*5f39d1b3SJooyung Han       << std::endl
10613*5f39d1b3SJooyung Han       << std::flush;
10614*5f39d1b3SJooyung Han #endif
10615*5f39d1b3SJooyung Han #endif
10616*5f39d1b3SJooyung Han   int params_count_copy = params.count;
10617*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
10618*5f39d1b3SJooyung Han   asm volatile(
10619*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
10620*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
10621*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
10622*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
10623*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
10624*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
10625*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
10626*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
10627*5f39d1b3SJooyung Han 
10628*5f39d1b3SJooyung Han       // Reduce count by leftovers.
10629*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
10630*5f39d1b3SJooyung Han       "beq 2f\n"
10631*5f39d1b3SJooyung Han 
10632*5f39d1b3SJooyung Han       "1:"
10633*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
10634*5f39d1b3SJooyung Han 
10635*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x8
10636*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10637*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10638*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10639*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
10640*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10641*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
10642*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
10643*5f39d1b3SJooyung Han       "vld3.8 {d4[3], d5[3], d6[3]}, [%[in]], %[stride]\n"
10644*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
10645*5f39d1b3SJooyung Han       "vld3.8 {d4[4], d5[4], d6[4]}, [%[in]], %[stride]\n"
10646*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
10647*5f39d1b3SJooyung Han       "vld3.8 {d4[5], d5[5], d6[5]}, [%[in]], %[stride]\n"
10648*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
10649*5f39d1b3SJooyung Han       "vld3.8 {d4[6], d5[6], d6[6]}, [%[in]], %[stride]\n"
10650*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
10651*5f39d1b3SJooyung Han       "vld3.8 {d4[7], d5[7], d6[7]}, [%[in]], %[stride]\n"
10652*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10653*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10654*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10655*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10656*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10657*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10658*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10659*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10660*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10661*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10662*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10663*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10664*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10665*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10666*5f39d1b3SJooyung Han 
10667*5f39d1b3SJooyung Han       "bne 1b\n"
10668*5f39d1b3SJooyung Han 
10669*5f39d1b3SJooyung Han       "2:"
10670*5f39d1b3SJooyung Han 
10671*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x4
10672*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
10673*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
10674*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
10675*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
10676*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
10677*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
10678*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
10679*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10680*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10681*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10682*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
10683*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10684*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
10685*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
10686*5f39d1b3SJooyung Han       "vld3.8 {d4[3], d5[3], d6[3]}, [%[in]], %[stride]\n"
10687*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10688*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10689*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10690*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10691*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10692*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10693*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10694*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10695*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10696*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10697*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10698*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10699*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10700*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10701*5f39d1b3SJooyung Han 
10702*5f39d1b3SJooyung Han       // Aggregator Reduction.
10703*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
10704*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
10705*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
10706*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
10707*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
10708*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
10709*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
10710*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
10711*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
10712*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
10713*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
10714*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
10715*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
10716*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
10717*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
10718*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
10719*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
10720*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
10721*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
10722*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
10723*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
10724*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
10725*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
10726*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
10727*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
10728*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
10729*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
10730*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
10731*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
10732*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d16", "d17", "d18", "d19",
10733*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29",
10734*5f39d1b3SJooyung Han         "cc", "memory");
10735*5f39d1b3SJooyung Han }
10736*5f39d1b3SJooyung Han 
10737*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)10738*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 5, ColumnMajorWithSum>::Pack(
10739*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
10740*5f39d1b3SJooyung Han #ifdef DEBUG
10741*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
10742*5f39d1b3SJooyung Han   std::cout
10743*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
10744*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 7, 8, 5, ColumnMajorWithSum>::Pack()"
10745*5f39d1b3SJooyung Han       << std::endl
10746*5f39d1b3SJooyung Han       << std::flush;
10747*5f39d1b3SJooyung Han #endif
10748*5f39d1b3SJooyung Han #endif
10749*5f39d1b3SJooyung Han   int params_count_copy = params.count;
10750*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
10751*5f39d1b3SJooyung Han   asm volatile(
10752*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
10753*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
10754*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
10755*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
10756*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
10757*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
10758*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
10759*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
10760*5f39d1b3SJooyung Han 
10761*5f39d1b3SJooyung Han       // Reduce count by leftovers.
10762*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
10763*5f39d1b3SJooyung Han       "beq 2f\n"
10764*5f39d1b3SJooyung Han 
10765*5f39d1b3SJooyung Han       "1:"
10766*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
10767*5f39d1b3SJooyung Han 
10768*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x8
10769*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10770*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10771*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10772*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
10773*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10774*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
10775*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
10776*5f39d1b3SJooyung Han       "vld3.8 {d4[3], d5[3], d6[3]}, [%[in]], %[stride]\n"
10777*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
10778*5f39d1b3SJooyung Han       "vld3.8 {d4[4], d5[4], d6[4]}, [%[in]], %[stride]\n"
10779*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
10780*5f39d1b3SJooyung Han       "vld3.8 {d4[5], d5[5], d6[5]}, [%[in]], %[stride]\n"
10781*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
10782*5f39d1b3SJooyung Han       "vld3.8 {d4[6], d5[6], d6[6]}, [%[in]], %[stride]\n"
10783*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
10784*5f39d1b3SJooyung Han       "vld3.8 {d4[7], d5[7], d6[7]}, [%[in]], %[stride]\n"
10785*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10786*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10787*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10788*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10789*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10790*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10791*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10792*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10793*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10794*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10795*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10796*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10797*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10798*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10799*5f39d1b3SJooyung Han 
10800*5f39d1b3SJooyung Han       "bne 1b\n"
10801*5f39d1b3SJooyung Han 
10802*5f39d1b3SJooyung Han       "2:"
10803*5f39d1b3SJooyung Han 
10804*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x5
10805*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
10806*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
10807*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
10808*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
10809*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
10810*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
10811*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
10812*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10813*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10814*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10815*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
10816*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10817*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
10818*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
10819*5f39d1b3SJooyung Han       "vld3.8 {d4[3], d5[3], d6[3]}, [%[in]], %[stride]\n"
10820*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
10821*5f39d1b3SJooyung Han       "vld3.8 {d4[4], d5[4], d6[4]}, [%[in]], %[stride]\n"
10822*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10823*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10824*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10825*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10826*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10827*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10828*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10829*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10830*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10831*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10832*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10833*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10834*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10835*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10836*5f39d1b3SJooyung Han 
10837*5f39d1b3SJooyung Han       // Aggregator Reduction.
10838*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
10839*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
10840*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
10841*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
10842*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
10843*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
10844*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
10845*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
10846*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
10847*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
10848*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
10849*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
10850*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
10851*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
10852*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
10853*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
10854*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
10855*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
10856*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
10857*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
10858*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
10859*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
10860*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
10861*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
10862*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
10863*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
10864*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
10865*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
10866*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
10867*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d16", "d17", "d18", "d19",
10868*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29",
10869*5f39d1b3SJooyung Han         "cc", "memory");
10870*5f39d1b3SJooyung Han }
10871*5f39d1b3SJooyung Han 
10872*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)10873*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 6, ColumnMajorWithSum>::Pack(
10874*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
10875*5f39d1b3SJooyung Han #ifdef DEBUG
10876*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
10877*5f39d1b3SJooyung Han   std::cout
10878*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
10879*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 7, 8, 6, ColumnMajorWithSum>::Pack()"
10880*5f39d1b3SJooyung Han       << std::endl
10881*5f39d1b3SJooyung Han       << std::flush;
10882*5f39d1b3SJooyung Han #endif
10883*5f39d1b3SJooyung Han #endif
10884*5f39d1b3SJooyung Han   int params_count_copy = params.count;
10885*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
10886*5f39d1b3SJooyung Han   asm volatile(
10887*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
10888*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
10889*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
10890*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
10891*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
10892*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
10893*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
10894*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
10895*5f39d1b3SJooyung Han 
10896*5f39d1b3SJooyung Han       // Reduce count by leftovers.
10897*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
10898*5f39d1b3SJooyung Han       "beq 2f\n"
10899*5f39d1b3SJooyung Han 
10900*5f39d1b3SJooyung Han       "1:"
10901*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
10902*5f39d1b3SJooyung Han 
10903*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x8
10904*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10905*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10906*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10907*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
10908*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10909*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
10910*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
10911*5f39d1b3SJooyung Han       "vld3.8 {d4[3], d5[3], d6[3]}, [%[in]], %[stride]\n"
10912*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
10913*5f39d1b3SJooyung Han       "vld3.8 {d4[4], d5[4], d6[4]}, [%[in]], %[stride]\n"
10914*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
10915*5f39d1b3SJooyung Han       "vld3.8 {d4[5], d5[5], d6[5]}, [%[in]], %[stride]\n"
10916*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
10917*5f39d1b3SJooyung Han       "vld3.8 {d4[6], d5[6], d6[6]}, [%[in]], %[stride]\n"
10918*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
10919*5f39d1b3SJooyung Han       "vld3.8 {d4[7], d5[7], d6[7]}, [%[in]], %[stride]\n"
10920*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10921*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10922*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10923*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10924*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10925*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10926*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10927*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10928*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10929*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10930*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10931*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10932*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10933*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10934*5f39d1b3SJooyung Han 
10935*5f39d1b3SJooyung Han       "bne 1b\n"
10936*5f39d1b3SJooyung Han 
10937*5f39d1b3SJooyung Han       "2:"
10938*5f39d1b3SJooyung Han 
10939*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x6
10940*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
10941*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
10942*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
10943*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
10944*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
10945*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
10946*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
10947*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
10948*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
10949*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
10950*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
10951*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
10952*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
10953*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
10954*5f39d1b3SJooyung Han       "vld3.8 {d4[3], d5[3], d6[3]}, [%[in]], %[stride]\n"
10955*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
10956*5f39d1b3SJooyung Han       "vld3.8 {d4[4], d5[4], d6[4]}, [%[in]], %[stride]\n"
10957*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
10958*5f39d1b3SJooyung Han       "vld3.8 {d4[5], d5[5], d6[5]}, [%[in]], %[stride]\n"
10959*5f39d1b3SJooyung Han       "pld [%[in]]\n"
10960*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
10961*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
10962*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
10963*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
10964*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
10965*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
10966*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
10967*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
10968*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
10969*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
10970*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
10971*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
10972*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
10973*5f39d1b3SJooyung Han 
10974*5f39d1b3SJooyung Han       // Aggregator Reduction.
10975*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
10976*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
10977*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
10978*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
10979*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
10980*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
10981*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
10982*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
10983*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
10984*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
10985*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
10986*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
10987*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
10988*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
10989*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
10990*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
10991*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
10992*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
10993*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
10994*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
10995*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
10996*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
10997*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
10998*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
10999*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
11000*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
11001*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
11002*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
11003*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
11004*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d16", "d17", "d18", "d19",
11005*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29",
11006*5f39d1b3SJooyung Han         "cc", "memory");
11007*5f39d1b3SJooyung Han }
11008*5f39d1b3SJooyung Han 
11009*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)11010*5f39d1b3SJooyung Han inline void Stream<uint8_t, 7, 8, 7, ColumnMajorWithSum>::Pack(
11011*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
11012*5f39d1b3SJooyung Han #ifdef DEBUG
11013*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
11014*5f39d1b3SJooyung Han   std::cout
11015*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
11016*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 7, 8, 7, ColumnMajorWithSum>::Pack()"
11017*5f39d1b3SJooyung Han       << std::endl
11018*5f39d1b3SJooyung Han       << std::flush;
11019*5f39d1b3SJooyung Han #endif
11020*5f39d1b3SJooyung Han #endif
11021*5f39d1b3SJooyung Han   int params_count_copy = params.count;
11022*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
11023*5f39d1b3SJooyung Han   asm volatile(
11024*5f39d1b3SJooyung Han       "sub %[stride], %[stride], #4\n"
11025*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
11026*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
11027*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
11028*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
11029*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
11030*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
11031*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
11032*5f39d1b3SJooyung Han 
11033*5f39d1b3SJooyung Han       // Reduce count by leftovers.
11034*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
11035*5f39d1b3SJooyung Han       "beq 2f\n"
11036*5f39d1b3SJooyung Han 
11037*5f39d1b3SJooyung Han       "1:"
11038*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
11039*5f39d1b3SJooyung Han 
11040*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x8
11041*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
11042*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
11043*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
11044*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
11045*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
11046*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
11047*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
11048*5f39d1b3SJooyung Han       "vld3.8 {d4[3], d5[3], d6[3]}, [%[in]], %[stride]\n"
11049*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
11050*5f39d1b3SJooyung Han       "vld3.8 {d4[4], d5[4], d6[4]}, [%[in]], %[stride]\n"
11051*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
11052*5f39d1b3SJooyung Han       "vld3.8 {d4[5], d5[5], d6[5]}, [%[in]], %[stride]\n"
11053*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
11054*5f39d1b3SJooyung Han       "vld3.8 {d4[6], d5[6], d6[6]}, [%[in]], %[stride]\n"
11055*5f39d1b3SJooyung Han       "vld1.32 {d3[1]}, [%[in]]!\n"
11056*5f39d1b3SJooyung Han       "vld3.8 {d4[7], d5[7], d6[7]}, [%[in]], %[stride]\n"
11057*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11058*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11059*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11060*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11061*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11062*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11063*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11064*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11065*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11066*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11067*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11068*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11069*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
11070*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
11071*5f39d1b3SJooyung Han 
11072*5f39d1b3SJooyung Han       "bne 1b\n"
11073*5f39d1b3SJooyung Han 
11074*5f39d1b3SJooyung Han       "2:"
11075*5f39d1b3SJooyung Han 
11076*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 7x7
11077*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
11078*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
11079*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
11080*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
11081*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
11082*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
11083*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
11084*5f39d1b3SJooyung Han       "vld1.32 {d0[0]}, [%[in]]!\n"
11085*5f39d1b3SJooyung Han       "vld3.8 {d4[0], d5[0], d6[0]}, [%[in]], %[stride]\n"
11086*5f39d1b3SJooyung Han       "vld1.32 {d1[0]}, [%[in]]!\n"
11087*5f39d1b3SJooyung Han       "vld3.8 {d4[1], d5[1], d6[1]}, [%[in]], %[stride]\n"
11088*5f39d1b3SJooyung Han       "vld1.32 {d2[0]}, [%[in]]!\n"
11089*5f39d1b3SJooyung Han       "vld3.8 {d4[2], d5[2], d6[2]}, [%[in]], %[stride]\n"
11090*5f39d1b3SJooyung Han       "vld1.32 {d3[0]}, [%[in]]!\n"
11091*5f39d1b3SJooyung Han       "vld3.8 {d4[3], d5[3], d6[3]}, [%[in]], %[stride]\n"
11092*5f39d1b3SJooyung Han       "vld1.32 {d0[1]}, [%[in]]!\n"
11093*5f39d1b3SJooyung Han       "vld3.8 {d4[4], d5[4], d6[4]}, [%[in]], %[stride]\n"
11094*5f39d1b3SJooyung Han       "vld1.32 {d1[1]}, [%[in]]!\n"
11095*5f39d1b3SJooyung Han       "vld3.8 {d4[5], d5[5], d6[5]}, [%[in]], %[stride]\n"
11096*5f39d1b3SJooyung Han       "vld1.32 {d2[1]}, [%[in]]!\n"
11097*5f39d1b3SJooyung Han       "vld3.8 {d4[6], d5[6], d6[6]}, [%[in]], %[stride]\n"
11098*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11099*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11100*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11101*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11102*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11103*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11104*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11105*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11106*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11107*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11108*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11109*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11110*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:64]!\n"
11111*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6}, [%[out]:64]!\n"
11112*5f39d1b3SJooyung Han 
11113*5f39d1b3SJooyung Han       // Aggregator Reduction.
11114*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
11115*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
11116*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
11117*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
11118*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
11119*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
11120*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
11121*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
11122*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
11123*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
11124*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
11125*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
11126*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
11127*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
11128*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
11129*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
11130*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
11131*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
11132*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
11133*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d28\n"
11134*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
11135*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
11136*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
11137*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
11138*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:64]\n"
11139*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
11140*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
11141*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
11142*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
11143*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d16", "d17", "d18", "d19",
11144*5f39d1b3SJooyung Han         "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28", "d29",
11145*5f39d1b3SJooyung Han         "cc", "memory");
11146*5f39d1b3SJooyung Han }
11147*5f39d1b3SJooyung Han 
11148*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)11149*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 0, ColumnMajorWithSum>::Pack(
11150*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
11151*5f39d1b3SJooyung Han #ifdef DEBUG
11152*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
11153*5f39d1b3SJooyung Han   std::cout
11154*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
11155*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 8, 8, 0, ColumnMajorWithSum>::Pack()"
11156*5f39d1b3SJooyung Han       << std::endl
11157*5f39d1b3SJooyung Han       << std::flush;
11158*5f39d1b3SJooyung Han #endif
11159*5f39d1b3SJooyung Han #endif
11160*5f39d1b3SJooyung Han   int params_count_copy = params.count;
11161*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
11162*5f39d1b3SJooyung Han   asm volatile(
11163*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
11164*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
11165*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
11166*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
11167*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
11168*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
11169*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
11170*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
11171*5f39d1b3SJooyung Han 
11172*5f39d1b3SJooyung Han       "1:"
11173*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
11174*5f39d1b3SJooyung Han 
11175*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x8
11176*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
11177*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
11178*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
11179*5f39d1b3SJooyung Han       "vld1.32 {d3}, [%[in]], %[stride]\n"
11180*5f39d1b3SJooyung Han       "vld1.32 {d4}, [%[in]], %[stride]\n"
11181*5f39d1b3SJooyung Han       "vld1.32 {d5}, [%[in]], %[stride]\n"
11182*5f39d1b3SJooyung Han       "vld1.32 {d6}, [%[in]], %[stride]\n"
11183*5f39d1b3SJooyung Han       "vld1.32 {d7}, [%[in]], %[stride]\n"
11184*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11185*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11186*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11187*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
11188*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
11189*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11190*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11191*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
11192*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
11193*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
11194*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
11195*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
11196*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
11197*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11198*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11199*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11200*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11201*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11202*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11203*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11204*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
11205*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
11206*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
11207*5f39d1b3SJooyung Han 
11208*5f39d1b3SJooyung Han       "bne 1b\n"
11209*5f39d1b3SJooyung Han 
11210*5f39d1b3SJooyung Han       // Aggregator Reduction.
11211*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
11212*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
11213*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
11214*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
11215*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
11216*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
11217*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
11218*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
11219*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
11220*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
11221*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
11222*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
11223*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
11224*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
11225*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
11226*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
11227*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
11228*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
11229*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
11230*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
11231*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
11232*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
11233*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
11234*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
11235*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
11236*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
11237*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
11238*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
11239*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
11240*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
11241*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
11242*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d16", "d17", "d18",
11243*5f39d1b3SJooyung Han         "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28",
11244*5f39d1b3SJooyung Han         "d29", "d30", "d31", "cc", "memory");
11245*5f39d1b3SJooyung Han }
11246*5f39d1b3SJooyung Han 
11247*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)11248*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 1, ColumnMajorWithSum>::Pack(
11249*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
11250*5f39d1b3SJooyung Han #ifdef DEBUG
11251*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
11252*5f39d1b3SJooyung Han   std::cout
11253*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
11254*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 8, 8, 1, ColumnMajorWithSum>::Pack()"
11255*5f39d1b3SJooyung Han       << std::endl
11256*5f39d1b3SJooyung Han       << std::flush;
11257*5f39d1b3SJooyung Han #endif
11258*5f39d1b3SJooyung Han #endif
11259*5f39d1b3SJooyung Han   int params_count_copy = params.count;
11260*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
11261*5f39d1b3SJooyung Han   asm volatile(
11262*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
11263*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
11264*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
11265*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
11266*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
11267*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
11268*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
11269*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
11270*5f39d1b3SJooyung Han 
11271*5f39d1b3SJooyung Han       // Reduce count by leftovers.
11272*5f39d1b3SJooyung Han       "subs %[count], %[count], #1\n"
11273*5f39d1b3SJooyung Han       "beq 2f\n"
11274*5f39d1b3SJooyung Han 
11275*5f39d1b3SJooyung Han       "1:"
11276*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
11277*5f39d1b3SJooyung Han 
11278*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x8
11279*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
11280*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
11281*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
11282*5f39d1b3SJooyung Han       "vld1.32 {d3}, [%[in]], %[stride]\n"
11283*5f39d1b3SJooyung Han       "vld1.32 {d4}, [%[in]], %[stride]\n"
11284*5f39d1b3SJooyung Han       "vld1.32 {d5}, [%[in]], %[stride]\n"
11285*5f39d1b3SJooyung Han       "vld1.32 {d6}, [%[in]], %[stride]\n"
11286*5f39d1b3SJooyung Han       "vld1.32 {d7}, [%[in]], %[stride]\n"
11287*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11288*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11289*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11290*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
11291*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
11292*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11293*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11294*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
11295*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
11296*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
11297*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
11298*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
11299*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
11300*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11301*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11302*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11303*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11304*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11305*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11306*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11307*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
11308*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
11309*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
11310*5f39d1b3SJooyung Han 
11311*5f39d1b3SJooyung Han       "bne 1b\n"
11312*5f39d1b3SJooyung Han 
11313*5f39d1b3SJooyung Han       "2:"
11314*5f39d1b3SJooyung Han 
11315*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x1
11316*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
11317*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
11318*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
11319*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
11320*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
11321*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
11322*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
11323*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
11324*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
11325*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11326*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11327*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11328*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
11329*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
11330*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11331*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11332*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
11333*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
11334*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
11335*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
11336*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
11337*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
11338*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11339*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11340*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11341*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11342*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11343*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11344*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11345*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
11346*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
11347*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
11348*5f39d1b3SJooyung Han 
11349*5f39d1b3SJooyung Han       // Aggregator Reduction.
11350*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
11351*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
11352*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
11353*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
11354*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
11355*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
11356*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
11357*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
11358*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
11359*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
11360*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
11361*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
11362*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
11363*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
11364*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
11365*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
11366*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
11367*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
11368*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
11369*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
11370*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
11371*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
11372*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
11373*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
11374*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
11375*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
11376*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
11377*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
11378*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
11379*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
11380*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
11381*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d16", "d17", "d18",
11382*5f39d1b3SJooyung Han         "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28",
11383*5f39d1b3SJooyung Han         "d29", "d30", "d31", "cc", "memory");
11384*5f39d1b3SJooyung Han }
11385*5f39d1b3SJooyung Han 
11386*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)11387*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 2, ColumnMajorWithSum>::Pack(
11388*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
11389*5f39d1b3SJooyung Han #ifdef DEBUG
11390*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
11391*5f39d1b3SJooyung Han   std::cout
11392*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
11393*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 8, 8, 2, ColumnMajorWithSum>::Pack()"
11394*5f39d1b3SJooyung Han       << std::endl
11395*5f39d1b3SJooyung Han       << std::flush;
11396*5f39d1b3SJooyung Han #endif
11397*5f39d1b3SJooyung Han #endif
11398*5f39d1b3SJooyung Han   int params_count_copy = params.count;
11399*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
11400*5f39d1b3SJooyung Han   asm volatile(
11401*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
11402*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
11403*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
11404*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
11405*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
11406*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
11407*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
11408*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
11409*5f39d1b3SJooyung Han 
11410*5f39d1b3SJooyung Han       // Reduce count by leftovers.
11411*5f39d1b3SJooyung Han       "subs %[count], %[count], #2\n"
11412*5f39d1b3SJooyung Han       "beq 2f\n"
11413*5f39d1b3SJooyung Han 
11414*5f39d1b3SJooyung Han       "1:"
11415*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
11416*5f39d1b3SJooyung Han 
11417*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x8
11418*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
11419*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
11420*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
11421*5f39d1b3SJooyung Han       "vld1.32 {d3}, [%[in]], %[stride]\n"
11422*5f39d1b3SJooyung Han       "vld1.32 {d4}, [%[in]], %[stride]\n"
11423*5f39d1b3SJooyung Han       "vld1.32 {d5}, [%[in]], %[stride]\n"
11424*5f39d1b3SJooyung Han       "vld1.32 {d6}, [%[in]], %[stride]\n"
11425*5f39d1b3SJooyung Han       "vld1.32 {d7}, [%[in]], %[stride]\n"
11426*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11427*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11428*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11429*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
11430*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
11431*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11432*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11433*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
11434*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
11435*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
11436*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
11437*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
11438*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
11439*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11440*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11441*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11442*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11443*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11444*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11445*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11446*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
11447*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
11448*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
11449*5f39d1b3SJooyung Han 
11450*5f39d1b3SJooyung Han       "bne 1b\n"
11451*5f39d1b3SJooyung Han 
11452*5f39d1b3SJooyung Han       "2:"
11453*5f39d1b3SJooyung Han 
11454*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x2
11455*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
11456*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
11457*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
11458*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
11459*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
11460*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
11461*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
11462*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
11463*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
11464*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
11465*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11466*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11467*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11468*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
11469*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
11470*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11471*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11472*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
11473*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
11474*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
11475*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
11476*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
11477*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
11478*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11479*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11480*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11481*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11482*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11483*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11484*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11485*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
11486*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
11487*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
11488*5f39d1b3SJooyung Han 
11489*5f39d1b3SJooyung Han       // Aggregator Reduction.
11490*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
11491*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
11492*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
11493*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
11494*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
11495*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
11496*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
11497*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
11498*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
11499*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
11500*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
11501*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
11502*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
11503*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
11504*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
11505*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
11506*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
11507*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
11508*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
11509*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
11510*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
11511*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
11512*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
11513*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
11514*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
11515*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
11516*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
11517*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
11518*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
11519*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
11520*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
11521*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d16", "d17", "d18",
11522*5f39d1b3SJooyung Han         "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28",
11523*5f39d1b3SJooyung Han         "d29", "d30", "d31", "cc", "memory");
11524*5f39d1b3SJooyung Han }
11525*5f39d1b3SJooyung Han 
11526*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)11527*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 3, ColumnMajorWithSum>::Pack(
11528*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
11529*5f39d1b3SJooyung Han #ifdef DEBUG
11530*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
11531*5f39d1b3SJooyung Han   std::cout
11532*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
11533*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 8, 8, 3, ColumnMajorWithSum>::Pack()"
11534*5f39d1b3SJooyung Han       << std::endl
11535*5f39d1b3SJooyung Han       << std::flush;
11536*5f39d1b3SJooyung Han #endif
11537*5f39d1b3SJooyung Han #endif
11538*5f39d1b3SJooyung Han   int params_count_copy = params.count;
11539*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
11540*5f39d1b3SJooyung Han   asm volatile(
11541*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
11542*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
11543*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
11544*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
11545*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
11546*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
11547*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
11548*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
11549*5f39d1b3SJooyung Han 
11550*5f39d1b3SJooyung Han       // Reduce count by leftovers.
11551*5f39d1b3SJooyung Han       "subs %[count], %[count], #3\n"
11552*5f39d1b3SJooyung Han       "beq 2f\n"
11553*5f39d1b3SJooyung Han 
11554*5f39d1b3SJooyung Han       "1:"
11555*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
11556*5f39d1b3SJooyung Han 
11557*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x8
11558*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
11559*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
11560*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
11561*5f39d1b3SJooyung Han       "vld1.32 {d3}, [%[in]], %[stride]\n"
11562*5f39d1b3SJooyung Han       "vld1.32 {d4}, [%[in]], %[stride]\n"
11563*5f39d1b3SJooyung Han       "vld1.32 {d5}, [%[in]], %[stride]\n"
11564*5f39d1b3SJooyung Han       "vld1.32 {d6}, [%[in]], %[stride]\n"
11565*5f39d1b3SJooyung Han       "vld1.32 {d7}, [%[in]], %[stride]\n"
11566*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11567*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11568*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11569*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
11570*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
11571*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11572*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11573*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
11574*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
11575*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
11576*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
11577*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
11578*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
11579*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11580*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11581*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11582*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11583*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11584*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11585*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11586*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
11587*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
11588*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
11589*5f39d1b3SJooyung Han 
11590*5f39d1b3SJooyung Han       "bne 1b\n"
11591*5f39d1b3SJooyung Han 
11592*5f39d1b3SJooyung Han       "2:"
11593*5f39d1b3SJooyung Han 
11594*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x3
11595*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
11596*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
11597*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
11598*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
11599*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
11600*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
11601*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
11602*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
11603*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
11604*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
11605*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
11606*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11607*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11608*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11609*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
11610*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
11611*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11612*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11613*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
11614*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
11615*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
11616*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
11617*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
11618*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
11619*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11620*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11621*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11622*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11623*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11624*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11625*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11626*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
11627*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
11628*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
11629*5f39d1b3SJooyung Han 
11630*5f39d1b3SJooyung Han       // Aggregator Reduction.
11631*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
11632*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
11633*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
11634*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
11635*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
11636*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
11637*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
11638*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
11639*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
11640*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
11641*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
11642*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
11643*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
11644*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
11645*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
11646*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
11647*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
11648*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
11649*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
11650*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
11651*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
11652*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
11653*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
11654*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
11655*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
11656*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
11657*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
11658*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
11659*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
11660*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
11661*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
11662*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d16", "d17", "d18",
11663*5f39d1b3SJooyung Han         "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28",
11664*5f39d1b3SJooyung Han         "d29", "d30", "d31", "cc", "memory");
11665*5f39d1b3SJooyung Han }
11666*5f39d1b3SJooyung Han 
11667*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)11668*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 4, ColumnMajorWithSum>::Pack(
11669*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
11670*5f39d1b3SJooyung Han #ifdef DEBUG
11671*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
11672*5f39d1b3SJooyung Han   std::cout
11673*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
11674*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 8, 8, 4, ColumnMajorWithSum>::Pack()"
11675*5f39d1b3SJooyung Han       << std::endl
11676*5f39d1b3SJooyung Han       << std::flush;
11677*5f39d1b3SJooyung Han #endif
11678*5f39d1b3SJooyung Han #endif
11679*5f39d1b3SJooyung Han   int params_count_copy = params.count;
11680*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
11681*5f39d1b3SJooyung Han   asm volatile(
11682*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
11683*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
11684*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
11685*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
11686*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
11687*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
11688*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
11689*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
11690*5f39d1b3SJooyung Han 
11691*5f39d1b3SJooyung Han       // Reduce count by leftovers.
11692*5f39d1b3SJooyung Han       "subs %[count], %[count], #4\n"
11693*5f39d1b3SJooyung Han       "beq 2f\n"
11694*5f39d1b3SJooyung Han 
11695*5f39d1b3SJooyung Han       "1:"
11696*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
11697*5f39d1b3SJooyung Han 
11698*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x8
11699*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
11700*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
11701*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
11702*5f39d1b3SJooyung Han       "vld1.32 {d3}, [%[in]], %[stride]\n"
11703*5f39d1b3SJooyung Han       "vld1.32 {d4}, [%[in]], %[stride]\n"
11704*5f39d1b3SJooyung Han       "vld1.32 {d5}, [%[in]], %[stride]\n"
11705*5f39d1b3SJooyung Han       "vld1.32 {d6}, [%[in]], %[stride]\n"
11706*5f39d1b3SJooyung Han       "vld1.32 {d7}, [%[in]], %[stride]\n"
11707*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11708*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11709*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11710*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
11711*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
11712*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11713*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11714*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
11715*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
11716*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
11717*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
11718*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
11719*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
11720*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11721*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11722*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11723*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11724*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11725*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11726*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11727*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
11728*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
11729*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
11730*5f39d1b3SJooyung Han 
11731*5f39d1b3SJooyung Han       "bne 1b\n"
11732*5f39d1b3SJooyung Han 
11733*5f39d1b3SJooyung Han       "2:"
11734*5f39d1b3SJooyung Han 
11735*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x4
11736*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
11737*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
11738*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
11739*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
11740*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
11741*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
11742*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
11743*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
11744*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
11745*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
11746*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
11747*5f39d1b3SJooyung Han       "vld1.32 {d3}, [%[in]], %[stride]\n"
11748*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11749*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11750*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11751*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
11752*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
11753*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11754*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11755*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
11756*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
11757*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
11758*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
11759*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
11760*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
11761*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11762*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11763*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11764*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11765*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11766*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11767*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11768*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
11769*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
11770*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
11771*5f39d1b3SJooyung Han 
11772*5f39d1b3SJooyung Han       // Aggregator Reduction.
11773*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
11774*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
11775*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
11776*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
11777*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
11778*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
11779*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
11780*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
11781*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
11782*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
11783*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
11784*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
11785*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
11786*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
11787*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
11788*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
11789*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
11790*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
11791*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
11792*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
11793*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
11794*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
11795*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
11796*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
11797*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
11798*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
11799*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
11800*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
11801*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
11802*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
11803*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
11804*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d16", "d17", "d18",
11805*5f39d1b3SJooyung Han         "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28",
11806*5f39d1b3SJooyung Han         "d29", "d30", "d31", "cc", "memory");
11807*5f39d1b3SJooyung Han }
11808*5f39d1b3SJooyung Han 
11809*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)11810*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 5, ColumnMajorWithSum>::Pack(
11811*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
11812*5f39d1b3SJooyung Han #ifdef DEBUG
11813*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
11814*5f39d1b3SJooyung Han   std::cout
11815*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
11816*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 8, 8, 5, ColumnMajorWithSum>::Pack()"
11817*5f39d1b3SJooyung Han       << std::endl
11818*5f39d1b3SJooyung Han       << std::flush;
11819*5f39d1b3SJooyung Han #endif
11820*5f39d1b3SJooyung Han #endif
11821*5f39d1b3SJooyung Han   int params_count_copy = params.count;
11822*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
11823*5f39d1b3SJooyung Han   asm volatile(
11824*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
11825*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
11826*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
11827*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
11828*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
11829*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
11830*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
11831*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
11832*5f39d1b3SJooyung Han 
11833*5f39d1b3SJooyung Han       // Reduce count by leftovers.
11834*5f39d1b3SJooyung Han       "subs %[count], %[count], #5\n"
11835*5f39d1b3SJooyung Han       "beq 2f\n"
11836*5f39d1b3SJooyung Han 
11837*5f39d1b3SJooyung Han       "1:"
11838*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
11839*5f39d1b3SJooyung Han 
11840*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x8
11841*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
11842*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
11843*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
11844*5f39d1b3SJooyung Han       "vld1.32 {d3}, [%[in]], %[stride]\n"
11845*5f39d1b3SJooyung Han       "vld1.32 {d4}, [%[in]], %[stride]\n"
11846*5f39d1b3SJooyung Han       "vld1.32 {d5}, [%[in]], %[stride]\n"
11847*5f39d1b3SJooyung Han       "vld1.32 {d6}, [%[in]], %[stride]\n"
11848*5f39d1b3SJooyung Han       "vld1.32 {d7}, [%[in]], %[stride]\n"
11849*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11850*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11851*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11852*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
11853*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
11854*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11855*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11856*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
11857*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
11858*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
11859*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
11860*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
11861*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
11862*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11863*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11864*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11865*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11866*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11867*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11868*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11869*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
11870*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
11871*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
11872*5f39d1b3SJooyung Han 
11873*5f39d1b3SJooyung Han       "bne 1b\n"
11874*5f39d1b3SJooyung Han 
11875*5f39d1b3SJooyung Han       "2:"
11876*5f39d1b3SJooyung Han 
11877*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x5
11878*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
11879*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
11880*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
11881*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
11882*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
11883*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
11884*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
11885*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
11886*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
11887*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
11888*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
11889*5f39d1b3SJooyung Han       "vld1.32 {d3}, [%[in]], %[stride]\n"
11890*5f39d1b3SJooyung Han       "vld1.32 {d4}, [%[in]], %[stride]\n"
11891*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11892*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11893*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11894*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
11895*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
11896*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11897*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11898*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
11899*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
11900*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
11901*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
11902*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
11903*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
11904*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
11905*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
11906*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
11907*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
11908*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
11909*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
11910*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
11911*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
11912*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
11913*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
11914*5f39d1b3SJooyung Han 
11915*5f39d1b3SJooyung Han       // Aggregator Reduction.
11916*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
11917*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
11918*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
11919*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
11920*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
11921*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
11922*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
11923*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
11924*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
11925*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
11926*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
11927*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
11928*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
11929*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
11930*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
11931*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
11932*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
11933*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
11934*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
11935*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
11936*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
11937*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
11938*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
11939*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
11940*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
11941*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
11942*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
11943*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
11944*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
11945*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
11946*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
11947*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d16", "d17", "d18",
11948*5f39d1b3SJooyung Han         "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28",
11949*5f39d1b3SJooyung Han         "d29", "d30", "d31", "cc", "memory");
11950*5f39d1b3SJooyung Han }
11951*5f39d1b3SJooyung Han 
11952*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)11953*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 6, ColumnMajorWithSum>::Pack(
11954*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
11955*5f39d1b3SJooyung Han #ifdef DEBUG
11956*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
11957*5f39d1b3SJooyung Han   std::cout
11958*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
11959*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 8, 8, 6, ColumnMajorWithSum>::Pack()"
11960*5f39d1b3SJooyung Han       << std::endl
11961*5f39d1b3SJooyung Han       << std::flush;
11962*5f39d1b3SJooyung Han #endif
11963*5f39d1b3SJooyung Han #endif
11964*5f39d1b3SJooyung Han   int params_count_copy = params.count;
11965*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
11966*5f39d1b3SJooyung Han   asm volatile(
11967*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
11968*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
11969*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
11970*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
11971*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
11972*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
11973*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
11974*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
11975*5f39d1b3SJooyung Han 
11976*5f39d1b3SJooyung Han       // Reduce count by leftovers.
11977*5f39d1b3SJooyung Han       "subs %[count], %[count], #6\n"
11978*5f39d1b3SJooyung Han       "beq 2f\n"
11979*5f39d1b3SJooyung Han 
11980*5f39d1b3SJooyung Han       "1:"
11981*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
11982*5f39d1b3SJooyung Han 
11983*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x8
11984*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
11985*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
11986*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
11987*5f39d1b3SJooyung Han       "vld1.32 {d3}, [%[in]], %[stride]\n"
11988*5f39d1b3SJooyung Han       "vld1.32 {d4}, [%[in]], %[stride]\n"
11989*5f39d1b3SJooyung Han       "vld1.32 {d5}, [%[in]], %[stride]\n"
11990*5f39d1b3SJooyung Han       "vld1.32 {d6}, [%[in]], %[stride]\n"
11991*5f39d1b3SJooyung Han       "vld1.32 {d7}, [%[in]], %[stride]\n"
11992*5f39d1b3SJooyung Han       "pld [%[in]]\n"
11993*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
11994*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
11995*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
11996*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
11997*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
11998*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
11999*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
12000*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
12001*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
12002*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
12003*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
12004*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
12005*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
12006*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
12007*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
12008*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
12009*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
12010*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
12011*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
12012*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
12013*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
12014*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
12015*5f39d1b3SJooyung Han 
12016*5f39d1b3SJooyung Han       "bne 1b\n"
12017*5f39d1b3SJooyung Han 
12018*5f39d1b3SJooyung Han       "2:"
12019*5f39d1b3SJooyung Han 
12020*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x6
12021*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
12022*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
12023*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
12024*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
12025*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
12026*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
12027*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
12028*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
12029*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
12030*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
12031*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
12032*5f39d1b3SJooyung Han       "vld1.32 {d3}, [%[in]], %[stride]\n"
12033*5f39d1b3SJooyung Han       "vld1.32 {d4}, [%[in]], %[stride]\n"
12034*5f39d1b3SJooyung Han       "vld1.32 {d5}, [%[in]], %[stride]\n"
12035*5f39d1b3SJooyung Han       "pld [%[in]]\n"
12036*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
12037*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
12038*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
12039*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
12040*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
12041*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
12042*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
12043*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
12044*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
12045*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
12046*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
12047*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
12048*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
12049*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
12050*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
12051*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
12052*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
12053*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
12054*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
12055*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
12056*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
12057*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
12058*5f39d1b3SJooyung Han 
12059*5f39d1b3SJooyung Han       // Aggregator Reduction.
12060*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
12061*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
12062*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
12063*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
12064*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
12065*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
12066*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
12067*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
12068*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
12069*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
12070*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
12071*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
12072*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
12073*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
12074*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
12075*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
12076*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
12077*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
12078*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
12079*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
12080*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
12081*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
12082*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
12083*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
12084*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
12085*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
12086*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
12087*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
12088*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
12089*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
12090*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
12091*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d16", "d17", "d18",
12092*5f39d1b3SJooyung Han         "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28",
12093*5f39d1b3SJooyung Han         "d29", "d30", "d31", "cc", "memory");
12094*5f39d1b3SJooyung Han }
12095*5f39d1b3SJooyung Han 
12096*5f39d1b3SJooyung Han template <>
Pack(const uint8_t * in,const ColumnMajorWithSum & params,uint8_t * out)12097*5f39d1b3SJooyung Han inline void Stream<uint8_t, 8, 8, 7, ColumnMajorWithSum>::Pack(
12098*5f39d1b3SJooyung Han     const uint8_t* in, const ColumnMajorWithSum& params, uint8_t* out) {
12099*5f39d1b3SJooyung Han #ifdef DEBUG
12100*5f39d1b3SJooyung Han #ifdef DEBUG_METAGEMM_VERBOSE
12101*5f39d1b3SJooyung Han   std::cout
12102*5f39d1b3SJooyung Han       << __FILE__ << "(" << __LINE__
12103*5f39d1b3SJooyung Han       << ") ColumnMajorWithSum<uint8_t, 8, 8, 7, ColumnMajorWithSum>::Pack()"
12104*5f39d1b3SJooyung Han       << std::endl
12105*5f39d1b3SJooyung Han       << std::flush;
12106*5f39d1b3SJooyung Han #endif
12107*5f39d1b3SJooyung Han #endif
12108*5f39d1b3SJooyung Han   int params_count_copy = params.count;
12109*5f39d1b3SJooyung Han   int params_stride_copy = params.stride;
12110*5f39d1b3SJooyung Han   asm volatile(
12111*5f39d1b3SJooyung Han       "vmov.i16 q8, #0\n"
12112*5f39d1b3SJooyung Han       "vmov.i16 q9, #0\n"
12113*5f39d1b3SJooyung Han       "vmov.i16 q10, #0\n"
12114*5f39d1b3SJooyung Han       "vmov.i16 q11, #0\n"
12115*5f39d1b3SJooyung Han       "vmov.i16 q12, #0\n"
12116*5f39d1b3SJooyung Han       "vmov.i16 q13, #0\n"
12117*5f39d1b3SJooyung Han       "vmov.i16 q14, #0\n"
12118*5f39d1b3SJooyung Han       "vmov.i16 q15, #0\n"
12119*5f39d1b3SJooyung Han 
12120*5f39d1b3SJooyung Han       // Reduce count by leftovers.
12121*5f39d1b3SJooyung Han       "subs %[count], %[count], #7\n"
12122*5f39d1b3SJooyung Han       "beq 2f\n"
12123*5f39d1b3SJooyung Han 
12124*5f39d1b3SJooyung Han       "1:"
12125*5f39d1b3SJooyung Han       "subs %[count], %[count], #8\n"
12126*5f39d1b3SJooyung Han 
12127*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x8
12128*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
12129*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
12130*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
12131*5f39d1b3SJooyung Han       "vld1.32 {d3}, [%[in]], %[stride]\n"
12132*5f39d1b3SJooyung Han       "vld1.32 {d4}, [%[in]], %[stride]\n"
12133*5f39d1b3SJooyung Han       "vld1.32 {d5}, [%[in]], %[stride]\n"
12134*5f39d1b3SJooyung Han       "vld1.32 {d6}, [%[in]], %[stride]\n"
12135*5f39d1b3SJooyung Han       "vld1.32 {d7}, [%[in]], %[stride]\n"
12136*5f39d1b3SJooyung Han       "pld [%[in]]\n"
12137*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
12138*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
12139*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
12140*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
12141*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
12142*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
12143*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
12144*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
12145*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
12146*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
12147*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
12148*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
12149*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
12150*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
12151*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
12152*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
12153*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
12154*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
12155*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
12156*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
12157*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
12158*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
12159*5f39d1b3SJooyung Han 
12160*5f39d1b3SJooyung Han       "bne 1b\n"
12161*5f39d1b3SJooyung Han 
12162*5f39d1b3SJooyung Han       "2:"
12163*5f39d1b3SJooyung Han 
12164*5f39d1b3SJooyung Han       // Load Aggregate Store - column major 8x7
12165*5f39d1b3SJooyung Han       "vmov.i8 d0, #0\n"
12166*5f39d1b3SJooyung Han       "vmov.i8 d1, #0\n"
12167*5f39d1b3SJooyung Han       "vmov.i8 d2, #0\n"
12168*5f39d1b3SJooyung Han       "vmov.i8 d3, #0\n"
12169*5f39d1b3SJooyung Han       "vmov.i8 d4, #0\n"
12170*5f39d1b3SJooyung Han       "vmov.i8 d5, #0\n"
12171*5f39d1b3SJooyung Han       "vmov.i8 d6, #0\n"
12172*5f39d1b3SJooyung Han       "vmov.i8 d7, #0\n"
12173*5f39d1b3SJooyung Han       "vld1.32 {d0}, [%[in]], %[stride]\n"
12174*5f39d1b3SJooyung Han       "vld1.32 {d1}, [%[in]], %[stride]\n"
12175*5f39d1b3SJooyung Han       "vld1.32 {d2}, [%[in]], %[stride]\n"
12176*5f39d1b3SJooyung Han       "vld1.32 {d3}, [%[in]], %[stride]\n"
12177*5f39d1b3SJooyung Han       "vld1.32 {d4}, [%[in]], %[stride]\n"
12178*5f39d1b3SJooyung Han       "vld1.32 {d5}, [%[in]], %[stride]\n"
12179*5f39d1b3SJooyung Han       "vld1.32 {d6}, [%[in]], %[stride]\n"
12180*5f39d1b3SJooyung Han       "pld [%[in]]\n"
12181*5f39d1b3SJooyung Han       "vtrn.8 d0, d1\n"
12182*5f39d1b3SJooyung Han       "vtrn.8 d2, d3\n"
12183*5f39d1b3SJooyung Han       "vtrn.8 d4, d5\n"
12184*5f39d1b3SJooyung Han       "vtrn.8 d6, d7\n"
12185*5f39d1b3SJooyung Han       "vtrn.16 d0, d2\n"
12186*5f39d1b3SJooyung Han       "vtrn.16 d1, d3\n"
12187*5f39d1b3SJooyung Han       "vtrn.16 d4, d6\n"
12188*5f39d1b3SJooyung Han       "vtrn.16 d5, d7\n"
12189*5f39d1b3SJooyung Han       "vtrn.32 d0, d4\n"
12190*5f39d1b3SJooyung Han       "vtrn.32 d1, d5\n"
12191*5f39d1b3SJooyung Han       "vtrn.32 d2, d6\n"
12192*5f39d1b3SJooyung Han       "vtrn.32 d3, d7\n"
12193*5f39d1b3SJooyung Han       "vaddw.u8 q8, q8, d0\n"
12194*5f39d1b3SJooyung Han       "vaddw.u8 q9, q9, d1\n"
12195*5f39d1b3SJooyung Han       "vaddw.u8 q10, q10, d2\n"
12196*5f39d1b3SJooyung Han       "vaddw.u8 q11, q11, d3\n"
12197*5f39d1b3SJooyung Han       "vaddw.u8 q12, q12, d4\n"
12198*5f39d1b3SJooyung Han       "vaddw.u8 q13, q13, d5\n"
12199*5f39d1b3SJooyung Han       "vaddw.u8 q14, q14, d6\n"
12200*5f39d1b3SJooyung Han       "vaddw.u8 q15, q15, d7\n"
12201*5f39d1b3SJooyung Han       "vst1.32 {d0, d1, d2, d3}, [%[out]:256]!\n"
12202*5f39d1b3SJooyung Han       "vst1.32 {d4, d5, d6, d7}, [%[out]:256]!\n"
12203*5f39d1b3SJooyung Han 
12204*5f39d1b3SJooyung Han       // Aggregator Reduction.
12205*5f39d1b3SJooyung Han       "vmov.32 d0[0], %[multiplicative_sum_offset]\n"
12206*5f39d1b3SJooyung Han       "vdup.32 q1, %[additive_sum_offset]\n"
12207*5f39d1b3SJooyung Han       "vpaddl.u16 q8, q8\n"
12208*5f39d1b3SJooyung Han       "vpaddl.u16 q9, q9\n"
12209*5f39d1b3SJooyung Han       "vpaddl.u16 q10, q10\n"
12210*5f39d1b3SJooyung Han       "vpaddl.u16 q11, q11\n"
12211*5f39d1b3SJooyung Han       "vpaddl.u16 q12, q12\n"
12212*5f39d1b3SJooyung Han       "vpaddl.u16 q13, q13\n"
12213*5f39d1b3SJooyung Han       "vpaddl.u16 q14, q14\n"
12214*5f39d1b3SJooyung Han       "vpaddl.u16 q15, q15\n"
12215*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d17\n"
12216*5f39d1b3SJooyung Han       "vpadd.u32 d18, d18, d19\n"
12217*5f39d1b3SJooyung Han       "vpadd.u32 d20, d20, d21\n"
12218*5f39d1b3SJooyung Han       "vpadd.u32 d22, d22, d23\n"
12219*5f39d1b3SJooyung Han       "vpadd.u32 d24, d24, d25\n"
12220*5f39d1b3SJooyung Han       "vpadd.u32 d26, d26, d27\n"
12221*5f39d1b3SJooyung Han       "vpadd.u32 d28, d28, d29\n"
12222*5f39d1b3SJooyung Han       "vpadd.u32 d30, d30, d31\n"
12223*5f39d1b3SJooyung Han       "vpadd.u32 d16, d16, d18\n"
12224*5f39d1b3SJooyung Han       "vpadd.u32 d17, d20, d22\n"
12225*5f39d1b3SJooyung Han       "vpadd.u32 d18, d24, d26\n"
12226*5f39d1b3SJooyung Han       "vpadd.u32 d19, d28, d30\n"
12227*5f39d1b3SJooyung Han       "vmul.i32 q8, q8, d0[0]\n"
12228*5f39d1b3SJooyung Han       "vmul.i32 q9, q9, d0[0]\n"
12229*5f39d1b3SJooyung Han       "vadd.i32 q8, q8, q1\n"
12230*5f39d1b3SJooyung Han       "vadd.i32 q9, q9, q1\n"
12231*5f39d1b3SJooyung Han       "vst1.32 {d16, d17, d18, d19}, [%[out]:256]\n"
12232*5f39d1b3SJooyung Han       : [count] "+r"(params_count_copy), [stride] "+r"(params_stride_copy),
12233*5f39d1b3SJooyung Han         [out] "+r"(out), [in] "+r"(in)
12234*5f39d1b3SJooyung Han       : [additive_sum_offset] "r"(params.additive_sum_offset),
12235*5f39d1b3SJooyung Han         [multiplicative_sum_offset] "r"(params.multiplicative_sum_offset)
12236*5f39d1b3SJooyung Han       : "d0", "d1", "d2", "d3", "d4", "d5", "d6", "d7", "d16", "d17", "d18",
12237*5f39d1b3SJooyung Han         "d19", "d20", "d21", "d22", "d23", "d24", "d25", "d26", "d27", "d28",
12238*5f39d1b3SJooyung Han         "d29", "d30", "d31", "cc", "memory");
12239*5f39d1b3SJooyung Han }
12240*5f39d1b3SJooyung Han 
12241*5f39d1b3SJooyung Han }  // namespace meta
12242*5f39d1b3SJooyung Han }  // namespace gemmlowp
12243*5f39d1b3SJooyung Han 
12244*5f39d1b3SJooyung Han #else
12245*5f39d1b3SJooyung Han #warning "Meta gemm for arm32 requires: GEMMLOWP_NEON_32!"
12246*5f39d1b3SJooyung Han #endif
12247*5f39d1b3SJooyung Han 
12248*5f39d1b3SJooyung Han #endif  // GEMMLOWP_META_STREAMS_ARM_32_H_
12249