emit_typ.c
来自「基于Blas CLapck的.用过的人知道是干啥的」· C语言 代码 · 共 159 行
C
159 行
/* * Automatically Tuned Linear Algebra Software v3.8.0 * (C) Copyright 1997 R. Clint Whaley * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions, and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the ATLAS group or the names of its contributers may * not be used to endorse or promote products derived from this * software without specific written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */#include <stdio.h>#include <stdlib.h>#include <assert.h>#include <string.h>#include <ctype.h>int GetPower2(int n){ int pwr2, i; if (n == 1) return(0); for (pwr2=0, i=1; i < n; i <<= 1, pwr2++); if (i != n) pwr2 = 0; return(pwr2);}#define ShiftThresh 2char *GetDiv(int N, char *inc){ static char ln[256]; int pwr2 = GetPower2(N); if (N == 1) sprintf(ln, "%s", inc); else if (pwr2) sprintf(ln, "((%s) >> %d)", inc, pwr2); else sprintf(ln, "((%s) / %d)", inc, N); return(ln);}char *GetInc(int N, char *inc){ static char ln0[256]; char ln[256]; char *p=ln; int i, n=N, iPLUS=0; if (n == 0) { ln[0] = '0'; ln[1] = '\0'; } while(n > 1) { for (i=0; n >= (1<<i); i++); if ( (1 << i) > n) i--; if (iPLUS++) *p++ = '+'; sprintf(p, "((%s) << %d)", inc, i); p += strlen(p); n -= (1 << i); } if (n == 1) { if (iPLUS++) *p++ = '+'; sprintf(p, "%s", inc); } if (iPLUS > ShiftThresh) sprintf(ln0, "(%d*(%s))", N, inc); else if (iPLUS) sprintf(ln0, "(%s)", ln); else sprintf(ln0, "%s", ln); return(ln0);}void PrintTypeHead(FILE *fpout){ int pwr2; fprintf(fpout, "#ifndef ATLAS_TYPE_H\n"); fprintf(fpout, "#define ATLAS_TYPE_H\n\n"); fprintf(fpout, "#define ATL_isize %d\n", (int) sizeof(int)); fprintf(fpout, "#define ATL_ssize %d\n", (int) sizeof(float)); fprintf(fpout, "#define ATL_dsize %d\n", (int) sizeof(double)); fprintf(fpout, "#define ATL_csize %d\n", (int) 2*sizeof(float)); fprintf(fpout, "#define ATL_zsize %d\n", (int) 2*sizeof(double)); fprintf(fpout, "#define ATL_%cMulBySize(N_) %s\n", 'i', GetInc(sizeof(int), "(N_)")); fprintf(fpout, "#define ATL_%cMulBySize(N_) %s\n", 's', GetInc(sizeof(float), "(N_)")); fprintf(fpout, "#define ATL_%cMulBySize(N_) %s\n", 'd', GetInc(sizeof(double), "(N_)")); fprintf(fpout, "#define ATL_%cMulBySize(N_) %s\n", 'c', GetInc(2*sizeof(float), "(N_)")); fprintf(fpout, "#define ATL_%cMulBySize(N_) %s\n", 'z', GetInc(2*sizeof(double), "(N_)")); pwr2 = GetPower2(sizeof(int)); if (pwr2) fprintf(fpout, "#define ATL_iDivBySize(N_) ((N_) >> %d)\n", pwr2); else fprintf(fpout, "#define ATL_iDivBySize(N_) ((N_) / sizeof(int))\n"); pwr2 = GetPower2(sizeof(float)); if (pwr2) { fprintf(fpout, "#define ATL_%cDivBySize(N_) ((N_) >> %d)\n", 's', pwr2); fprintf(fpout, "#define ATL_%cDivBySize(N_) ((N_) >> %d)\n", 'c', pwr2+1); } else { fprintf(fpout, "#define ATL_sDivBySize(N_) ((N_) / sizeof(float))\n"); fprintf(fpout, "#define ATL_cDivBySize(N_) ((N_) / %d)\n", 2*sizeof(float)); } pwr2 = GetPower2(sizeof(double)); if (pwr2) { fprintf(fpout, "#define ATL_%cDivBySize(N_) ((N_) >> %d)\n", 'd', pwr2); fprintf(fpout, "#define ATL_%cDivBySize(N_) ((N_) >> %d)\n", 'z', pwr2+1); } else { fprintf(fpout, "#define ATL_dDivBySize(N_) ((N_) / sizeof(double))\n"); fprintf(fpout, "#define ATL_zDivBySize(N_) ((N_) / %d)\n", 2*sizeof(double)); } fprintf(fpout, "\n#endif\n");}main(int nargs, char *args[]){ FILE *fpout=NULL; if (nargs == 1) fpout = stdout; else if (nargs != 2) { fprintf(stderr, "usage: %s <file out>\n", args[0]); exit(-1); } if (fpout == NULL) { fpout = fopen(args[1], "w"); assert(fpout != NULL); } PrintTypeHead(fpout); if (fpout != stdout) fclose(fpout); exit(0);}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?