xref: /aosp_15_r20/external/gemmlowp/meta/generators/meta_neon.py (revision 5f39d1b313f0528e11bae88b3029b54b9e1033e7)
1*5f39d1b3SJooyung Han"""Generates the meta gemm/gemv library header."""
2*5f39d1b3SJooyung Han
3*5f39d1b3SJooyung Hanimport cc_emitter
4*5f39d1b3SJooyung Hanimport gemm_NxMxK_neon
5*5f39d1b3SJooyung Hanimport gemv_1xMxK_neon
6*5f39d1b3SJooyung Hanimport mul_1x8_Mx8_neon
7*5f39d1b3SJooyung Hanimport mul_Nx8_Mx8_neon
8*5f39d1b3SJooyung Hanimport neon_emitter
9*5f39d1b3SJooyung Hanimport qnt_Nx8_neon
10*5f39d1b3SJooyung Hanimport zip_Nx8_neon
11*5f39d1b3SJooyung Han
12*5f39d1b3SJooyung Han_HEADER_COPYRIGHT = """// Copyright 2015 Google Inc. All Rights Reserved.
13*5f39d1b3SJooyung Han//
14*5f39d1b3SJooyung Han// Licensed under the Apache License, Version 2.0 (the "License");
15*5f39d1b3SJooyung Han// you may not use this file except in compliance with the License.
16*5f39d1b3SJooyung Han// You may obtain a copy of the License at
17*5f39d1b3SJooyung Han//
18*5f39d1b3SJooyung Han//     http://www.apache.org/licenses/LICENSE-2.0
19*5f39d1b3SJooyung Han//
20*5f39d1b3SJooyung Han// Unless required by applicable law or agreed to in writing, software
21*5f39d1b3SJooyung Han// distributed under the License is distributed on an "AS IS" BASIS,
22*5f39d1b3SJooyung Han// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23*5f39d1b3SJooyung Han// See the License for the specific language governing permissions and
24*5f39d1b3SJooyung Han// limitations under the License.
25*5f39d1b3SJooyung Han//
26*5f39d1b3SJooyung Han// single_thread_gemm.h: programatically generated GEMM library header.
27*5f39d1b3SJooyung Han"""
28*5f39d1b3SJooyung Han
29*5f39d1b3SJooyung Han
30*5f39d1b3SJooyung Handef GenerateInternalFunctions(emitter):
31*5f39d1b3SJooyung Han  """Generate all the functions hidden in the internal namespace."""
32*5f39d1b3SJooyung Han  zip_Nx8_neon.GenerateFunctions(neon_emitter.NeonEmitter())
33*5f39d1b3SJooyung Han  emitter.EmitNewline()
34*5f39d1b3SJooyung Han
35*5f39d1b3SJooyung Han  mul_Nx8_Mx8_neon.GenerateFunctions(neon_emitter.NeonEmitter(), 'int32', False,
36*5f39d1b3SJooyung Han                                     True)
37*5f39d1b3SJooyung Han  emitter.EmitNewline()
38*5f39d1b3SJooyung Han
39*5f39d1b3SJooyung Han  mul_Nx8_Mx8_neon.GenerateFunctions(neon_emitter.NeonEmitter(), 'int32', True,
40*5f39d1b3SJooyung Han                                     True)
41*5f39d1b3SJooyung Han  emitter.EmitNewline()
42*5f39d1b3SJooyung Han
43*5f39d1b3SJooyung Han  mul_Nx8_Mx8_neon.GenerateFunctions(neon_emitter.NeonEmitter(), 'float', True,
44*5f39d1b3SJooyung Han                                     True)
45*5f39d1b3SJooyung Han  emitter.EmitNewline()
46*5f39d1b3SJooyung Han
47*5f39d1b3SJooyung Han  mul_1x8_Mx8_neon.GenerateFunctions(neon_emitter.NeonEmitter(), 'int32', False,
48*5f39d1b3SJooyung Han                                     True)
49*5f39d1b3SJooyung Han  emitter.EmitNewline()
50*5f39d1b3SJooyung Han
51*5f39d1b3SJooyung Han  mul_1x8_Mx8_neon.GenerateFunctions(neon_emitter.NeonEmitter(), 'int32', True,
52*5f39d1b3SJooyung Han                                     True)
53*5f39d1b3SJooyung Han  emitter.EmitNewline()
54*5f39d1b3SJooyung Han
55*5f39d1b3SJooyung Han  mul_1x8_Mx8_neon.GenerateFunctions(neon_emitter.NeonEmitter(), 'float', True,
56*5f39d1b3SJooyung Han                                     True)
57*5f39d1b3SJooyung Han  emitter.EmitNewline()
58*5f39d1b3SJooyung Han
59*5f39d1b3SJooyung Han  qnt_Nx8_neon.GenerateFunctions(neon_emitter.NeonEmitter(), emitter)
60*5f39d1b3SJooyung Han  emitter.EmitNewline()
61*5f39d1b3SJooyung Han
62*5f39d1b3SJooyung Han  gemm_NxMxK_neon.GenerateInternalFunctions(emitter)
63*5f39d1b3SJooyung Han  emitter.EmitNewline()
64*5f39d1b3SJooyung Han
65*5f39d1b3SJooyung Han  gemv_1xMxK_neon.GenerateInternalFunctions(emitter)
66*5f39d1b3SJooyung Han  emitter.EmitNewline()
67*5f39d1b3SJooyung Han
68*5f39d1b3SJooyung Han
69*5f39d1b3SJooyung Handef GeneratePublicFunctions(emitter):
70*5f39d1b3SJooyung Han  gemm_NxMxK_neon.GeneratePublicFunctions(emitter)
71*5f39d1b3SJooyung Han  emitter.EmitNewline()
72*5f39d1b3SJooyung Han
73*5f39d1b3SJooyung Han  gemv_1xMxK_neon.GeneratePublicFunctions(emitter)
74*5f39d1b3SJooyung Han  emitter.EmitNewline()
75*5f39d1b3SJooyung Han
76*5f39d1b3SJooyung Han
77*5f39d1b3SJooyung Handef Main():
78*5f39d1b3SJooyung Han  """Generate the single threaded meta gemm library."""
79*5f39d1b3SJooyung Han  emitter = cc_emitter.CCEmitter()
80*5f39d1b3SJooyung Han
81*5f39d1b3SJooyung Han  emitter.EmitCodeNoSemicolon(_HEADER_COPYRIGHT)
82*5f39d1b3SJooyung Han  emitter.EmitHeaderBegin('gemmlowp_meta_single_thread_gemm')
83*5f39d1b3SJooyung Han
84*5f39d1b3SJooyung Han  emitter.EmitPreprocessor1('ifdef', 'GEMMLOWP_NEON_32')
85*5f39d1b3SJooyung Han  emitter.EmitNewline()
86*5f39d1b3SJooyung Han
87*5f39d1b3SJooyung Han  emitter.EmitInclude('<cassert>')
88*5f39d1b3SJooyung Han  emitter.EmitNewline()
89*5f39d1b3SJooyung Han
90*5f39d1b3SJooyung Han  emitter.EmitNamespaceBegin('gemmlowp')
91*5f39d1b3SJooyung Han  emitter.EmitNamespaceBegin('meta')
92*5f39d1b3SJooyung Han  emitter.EmitNamespaceBegin('internal')
93*5f39d1b3SJooyung Han  emitter.EmitNewline()
94*5f39d1b3SJooyung Han
95*5f39d1b3SJooyung Han  GenerateInternalFunctions(emitter)
96*5f39d1b3SJooyung Han
97*5f39d1b3SJooyung Han  emitter.EmitNamespaceEnd()
98*5f39d1b3SJooyung Han  emitter.EmitNewline()
99*5f39d1b3SJooyung Han
100*5f39d1b3SJooyung Han  GeneratePublicFunctions(emitter)
101*5f39d1b3SJooyung Han
102*5f39d1b3SJooyung Han  emitter.EmitNamespaceEnd()
103*5f39d1b3SJooyung Han  emitter.EmitNamespaceEnd()
104*5f39d1b3SJooyung Han  emitter.EmitNewline()
105*5f39d1b3SJooyung Han
106*5f39d1b3SJooyung Han  emitter.EmitPreprocessor('else')
107*5f39d1b3SJooyung Han  emitter.EmitPreprocessor1('warning',
108*5f39d1b3SJooyung Han                            '"Meta gemm fast-path requires GEMMLOWP_NEON_32!"')
109*5f39d1b3SJooyung Han  emitter.EmitPreprocessor('endif')
110*5f39d1b3SJooyung Han  emitter.EmitNewline()
111*5f39d1b3SJooyung Han
112*5f39d1b3SJooyung Han  emitter.EmitHeaderEnd()
113*5f39d1b3SJooyung Han
114*5f39d1b3SJooyung Han
115*5f39d1b3SJooyung Hanif __name__ == '__main__':
116*5f39d1b3SJooyung Han  Main()
117