blob: e2cd9797a6b070acf2cb8c8d29b5aca6a13d974e [file] [log] [blame]
Frank Barchard8b0f0262019-11-27 23:18:40 -08001// Copyright 2019 Google LLC
2//
3// This source code is licensed under the BSD-style license found in the
4// LICENSE file in the root directory of this source tree.
5
6#include <xnnpack/assembly.h>
7
8.syntax unified
9
10// void xnn_f32_gemm_ukernel_4x8__aarch32_neon_ld64(
Frank Barchard72d6afb2019-11-30 19:21:26 -080011// size_t mr, r0
12// size_t nc, r1
Frank Barchard61cad892019-12-02 13:06:15 -080013// size_t kc, r2 -> r7
Frank Barchard72d6afb2019-11-30 19:21:26 -080014// const uint8_t*restrict a, r3
Frank Barchard61cad892019-12-02 13:06:15 -080015// size_t a_stride, sp + 96 -> (r5)
16// const void*restrict w, sp + 100 -> r9
17// uint8_t*restrict c, sp + 104 -> r14
18// size_t cm_stride, sp + 108 -> (r6)
19// size_t cn_stride, sp + 112 -> r5
20// const union xnn_f32_output_params params[restrict static 1]) sp + 116 -> (r5)
Frank Barchard8b0f0262019-11-27 23:18:40 -080021
22
23// inner loop registers
24
Frank Barchard61cad892019-12-02 13:06:15 -080025// A0 r3 d0
26// A1 r12 d1
27// A2 r10 d2
28// A3 r0 d3
Frank Barchard8b0f0262019-11-27 23:18:40 -080029
Frank Barchard72d6afb2019-11-30 19:21:26 -080030// B r9 d8, d9, d10, d11
31// B d12, d13, d14, d15
Frank Barchard8b0f0262019-11-27 23:18:40 -080032
Frank Barchard61cad892019-12-02 13:06:15 -080033// C0 r14 d16-d17 q8 d18-d19 q9
Frank Barchard72d6afb2019-11-30 19:21:26 -080034// C1 r4 d20-d21 q10 d22-d23 q11
Frank Barchard61cad892019-12-02 13:06:15 -080035// C2 r8 d24-d25 q12 d26-d27 q13
36// C3 r6 d28-d29 q14 d30-d31 q15
Frank Barchard72d6afb2019-11-30 19:21:26 -080037
Frank Barchard61cad892019-12-02 13:06:15 -080038// Clamp (r5) d4 d5 d6 d7
39// Unused r11
Frank Barchard8b0f0262019-11-27 23:18:40 -080040
41BEGIN_FUNCTION xnn_f32_gemm_ukernel_4x8__aarch32_neon_ld64
42 .arm
43#ifndef __APPLE__
44 .arch armv7-a
45 .fpu neon
46#endif
Frank Barchard61cad892019-12-02 13:06:15 -080047 // Push 96 bytes
48 PUSH {r4, r5, r6, r7, r8, r9, r10, r14} // 32
49 VPUSH {d8-d15} // +64 = 96
Frank Barchard72d6afb2019-11-30 19:21:26 -080050
51 // Clamp A and C pointers
Frank Barchard72d6afb2019-11-30 19:21:26 -080052
Frank Barchard61cad892019-12-02 13:06:15 -080053 LDR r5, [sp, 96] // a_stride
54 LDR r14, [sp, 104] // c
55 LDR r6, [sp, 108] // cm_stride
56
57 CMP r0, 2 // if mr >= 2
58 ADDHS r12, r3, r5 // a1 = a0 + a_stride
59 ADDHS r4, r14, r6 // c1 = c0 + cm_stride
60 MOVLO r12, r3 // a1
61 MOVLO r4, r14 // c1
62 // if mr > 2
63 ADDHI r10, r12, r5 // a2 = a1 + a_stride
64 ADDHI r8, r4, r6 // c2 = c1 + cm_stride
65 MOVLS r10, r12 // a2
66 MOVLS r8, r4 // c2
67
68 CMP r0, 4 // if mr >=4
69 ADDHS r0, r10, r5 // a3 = a2 + a_stride
70 ADDHS r6, r8, r6 // c3 = c2 + cm_stride
71 MOVLO r0, r10 // a3
72 MOVLO r6, r8 // c3
73
74 // Load params pointer
75 LDR r5, [sp, 116] // clamping_params
76 LDR r9, [sp, 100] // W
77
78 // Load clamping_params values
79 VLD1.32 {d4[]-d5[]}, [r5]!
80 VLD1.32 {d6[]-d7[]}, [r5]
81
82 LDR r5, [sp, 112] // cn_stride
Frank Barchard8b0f0262019-11-27 23:18:40 -080083
841:
Frank Barchard72d6afb2019-11-30 19:21:26 -080085 # Load initial bias from w into accumulators
Frank Barchard61cad892019-12-02 13:06:15 -080086 VLDM r9!, {d16-d19} // Bias
87 SUBS r7, r2, 8
88 VMOV q10, q8
89 VMOV q11, q9
90 VMOV q12, q8
91 VMOV q13, q9
92 VMOV q14, q8
93 VMOV q15, q9
94 BLO 3f // less than 2 channels?
Frank Barchard8b0f0262019-11-27 23:18:40 -080095
Frank Barchard72d6afb2019-11-30 19:21:26 -080096 // Main loop - 2 floats of A (8 bytes)
972:
Frank Barchard61cad892019-12-02 13:06:15 -080098 VLD1.32 {d0}, [r3]! // A0
Frank Barchard72d6afb2019-11-30 19:21:26 -080099 VLDM r9!, {d8-d11} // B0
Frank Barchard61cad892019-12-02 13:06:15 -0800100 VLD1.32 {d1}, [r12]! // A1
101 VLD1.32 {d2}, [r10]! // A2
102 VLD1.32 {d3}, [ r0]! // A3
103
104 VMLA.F32 q8, q4, d0[0]
105 VMLA.F32 q9, q5, d0[0]
106 VMLA.F32 q10, q4, d1[0]
107 VMLA.F32 q11, q5, d1[0]
Frank Barchard72d6afb2019-11-30 19:21:26 -0800108 VLDM r9!, {d12-d15} // B1
Frank Barchard61cad892019-12-02 13:06:15 -0800109 VMLA.F32 q12, q4, d2[0]
110 VMLA.F32 q13, q5, d2[0]
111 VMLA.F32 q14, q4, d3[0]
112 VMLA.F32 q15, q5, d3[0]
113 VMLA.F32 q8, q6, d0[1]
114 VMLA.F32 q9, q7, d0[1]
115 VMLA.F32 q10, q6, d1[1]
116 VMLA.F32 q11, q7, d1[1]
117 VMLA.F32 q12, q6, d2[1]
118 VMLA.F32 q13, q7, d2[1]
Frank Barchard72d6afb2019-11-30 19:21:26 -0800119 SUBS r7, r7, 8
Frank Barchard61cad892019-12-02 13:06:15 -0800120 VMLA.F32 q14, q6, d3[1]
121 VMLA.F32 q15, q7, d3[1]
122 BHS 2b
Frank Barchard8b0f0262019-11-27 23:18:40 -0800123
Frank Barchard8b0f0262019-11-27 23:18:40 -08001243:
Frank Barchard61cad892019-12-02 13:06:15 -0800125 // Is there a remainder?- 1 floats of A (4 bytes)
126 TST r7, 4
127 BNE 7f
Frank Barchard8b0f0262019-11-27 23:18:40 -0800128
Frank Barchard61cad892019-12-02 13:06:15 -08001294:
130 // Clamp
131 VMIN.F32 q8, q8, q2
132 VMIN.F32 q9, q9, q2
133 VMIN.F32 q10, q10, q2
134 VMIN.F32 q11, q11, q2
135 VMIN.F32 q12, q12, q2
136 VMIN.F32 q13, q13, q2
137 VMIN.F32 q14, q14, q2
138 VMIN.F32 q15, q15, q2
139 VMAX.F32 q8, q8, q3
140 VMAX.F32 q9, q9, q3
141 VMAX.F32 q10, q10, q3
142 VMAX.F32 q11, q11, q3
143 VMAX.F32 q12, q12, q3
144 VMAX.F32 q13, q13, q3
145 VMAX.F32 q14, q14, q3
146 VMAX.F32 q15, q15, q3
Frank Barchard72d6afb2019-11-30 19:21:26 -0800147
Frank Barchard61cad892019-12-02 13:06:15 -0800148 // Store full 4 x 8
Frank Barchard72d6afb2019-11-30 19:21:26 -0800149
150 CMP r1, 8
151 BLO 8f
152
Frank Barchard8b0f0262019-11-27 23:18:40 -0800153 SUBS r1, r1, 8 // Loop counter
Frank Barchard61cad892019-12-02 13:06:15 -0800154 VST1.32 {d16-d19}, [r14], r5
155 SUB r0, r0, r2
Frank Barchard72d6afb2019-11-30 19:21:26 -0800156 VST1.32 {d20-d23}, [r4], r5
Frank Barchard61cad892019-12-02 13:06:15 -0800157 SUB r10, r10, r2
158 VST1.32 {d24-d27}, [r8], r5
159 SUB r12, r12, r2
160 VST1.32 {d28-d31}, [r6], r5
161 SUB r3, r3, r2
Frank Barchard8b0f0262019-11-27 23:18:40 -0800162 BNE 1b
163
Frank Barchard8b0f0262019-11-27 23:18:40 -08001646:
Frank Barchard61cad892019-12-02 13:06:15 -0800165 VPOP {d8-d15}
166 POP {r4, r5, r6, r7, r8, r9, r10, pc}
Frank Barchard8b0f0262019-11-27 23:18:40 -0800167
Frank Barchard8b0f0262019-11-27 23:18:40 -08001687:
Frank Barchard61cad892019-12-02 13:06:15 -0800169 // Remainder- 1 floats of A (4 bytes)
170 VLDM r3!, {s0} // A0
171 VLDM r9!, {d8-d11} // B0
172 VLDM r12!, {s2} // A1
173 VLDM r10!, {s4} // A2
174 VLDM r0!, {s6} // A3
175 VMLA.F32 q8, q4, d0[0]
176 VMLA.F32 q9, q5, d0[0]
177 VMLA.F32 q10, q4, d1[0]
178 VMLA.F32 q11, q5, d1[0]
179 VMLA.F32 q12, q4, d2[0]
180 VMLA.F32 q13, q5, d2[0]
181 VMLA.F32 q14, q4, d3[0]
182 VMLA.F32 q15, q5, d3[0]
183 B 4b
Frank Barchard8b0f0262019-11-27 23:18:40 -0800184
Frank Barchard61cad892019-12-02 13:06:15 -0800185// Store odd width
Frank Barchard8b0f0262019-11-27 23:18:40 -0800186
1879:
Frank Barchard61cad892019-12-02 13:06:15 -0800188 VST1.32 {d16-d17}, [r14]!
Frank Barchard72d6afb2019-11-30 19:21:26 -0800189 VST1.32 {d20-d21}, [r4]!
Frank Barchard61cad892019-12-02 13:06:15 -0800190 VST1.32 {d24-d25}, [r8]!
191 VST1.32 {d28-d29}, [r6]!
Frank Barchard72d6afb2019-11-30 19:21:26 -0800192 TST r1, 2
193 BNE 11f
Frank Barchard8b0f0262019-11-27 23:18:40 -0800194
19510:
Frank Barchard72d6afb2019-11-30 19:21:26 -0800196 VMOV d19, d18
197 VMOV d23, d22
198 VMOV d27, d26
199 VMOV d31, d30
200 TST r1, 1
Frank Barchard61cad892019-12-02 13:06:15 -0800201 BEQ 6b
Frank Barchard72d6afb2019-11-30 19:21:26 -0800202 B 12f
Frank Barchard8b0f0262019-11-27 23:18:40 -0800203
Frank Barchard61cad892019-12-02 13:06:15 -08002048:
205 TST r1, 4
206 BNE 9b
207 VMOV q9, q8
208 VMOV q11, q10
209 VMOV q13, q12
210 VMOV q15, q14
211 TST r1, 2
212 BEQ 10b
213
Frank Barchard8b0f0262019-11-27 23:18:40 -080021411:
Frank Barchard61cad892019-12-02 13:06:15 -0800215 VST1.32 {d18}, [r14]!
Frank Barchard72d6afb2019-11-30 19:21:26 -0800216 VST1.32 {d22}, [r4]!
Frank Barchard61cad892019-12-02 13:06:15 -0800217 VST1.32 {d26}, [r8]!
218 VST1.32 {d30}, [r6]!
Frank Barchard72d6afb2019-11-30 19:21:26 -0800219 TST r1, 1
Frank Barchard61cad892019-12-02 13:06:15 -0800220 BEQ 6b
Frank Barchard8b0f0262019-11-27 23:18:40 -0800221
22212:
Frank Barchard61cad892019-12-02 13:06:15 -0800223 VST1.32 {d19[0]}, [r14]
Frank Barchard72d6afb2019-11-30 19:21:26 -0800224 VST1.32 {d23[0]}, [r4]
Frank Barchard61cad892019-12-02 13:06:15 -0800225 VST1.32 {d27[0]}, [r8]
226 VST1.32 {d31[0]}, [r6]
227 B 6b
Frank Barchard8b0f0262019-11-27 23:18:40 -0800228
229END_FUNCTION xnn_f32_gemm_ukernel_4x8__aarch32_neon_ld64
230
231#ifdef __ELF__
232.section ".note.GNU-stack","",%progbits
233#endif
234
235
236