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