altivec-faltivec-1.c
来自「Mac OS X 10.4.9 for x86 Source Code gcc」· C语言 代码 · 共 141 行
C
141 行
/* APPLE LOCAL file AltiVec *//* { dg-do compile { target powerpc*-*-* } } *//* For 64-bit we need 64-bit headers. *//* { dg-xfail-if "" { powerpc*-*-darwin* } { "-m64" } { "" } } *//* { dg-options "-mcpu=G3 -O3 -finline-limit=9999 -faltivec -Wa,-force_cpusubtype_ALL -fdump-ipa-cgraph -S" } *//* Inliner should not inline AltiVec(tm) functions when -faltivec is on. *//* <rdar://problem/3837835> Selective inlining of functions that use Altivec */#include <Carbon/Carbon.h>#include <stdio.h>#include <stdlib.h>#include <math.h>/* #include <altivec.h> */#define N 400#define N4 ((N+3)/4)#define N8 ((N+7)/8)typedef union { signed short sInt[8]; vector signed short vInt;} IntegerToVector;static signed long vIntDotProduct (vector signed short [], vector signed short [], long int);static int mainInt();static Ptr getMemory (size_t);static intmainInt(){ long int n = N, n8 = N8, m, i, j; signed long vDotProduct, sDotProduct; signed short *sx, *sy; vector signed short *x, *y; IntegerToVector *sX, *sY; sx = (short *) getMemory( 4*(n+3) ); if (sx == nil) return 0; sy = (short *) getMemory( 4*(n+3) ); if (sy == nil) return 0; x = (vector signed short *) getMemory( n8*16 ); if ( x == nil) return 0; y = (vector signed short *) getMemory( n8*16 ); if ( y == nil) return 0; sX = (IntegerToVector *) getMemory( n8*16 ); if (sX == nil) return 0; sY = (IntegerToVector *) getMemory( n8*16 ); if (sY == nil) return 0; for ( i = 0; i < n; i++ ) { sx[i] = ( signed short ) scalb(( M_PI * ( double ) ( i ) / ( double ) n ), 8) + 0.5; sy[i] = ( signed short ) scalb(( M_PI * ( double ) ( n - i ) / ( double ) n ), 8) + 0.5; } m = n % 8; if (m != 0) for (i = n; i < n + 8 - m; i++) { sx[i] = 0.0; sy[i] = 0.0; } for ( i = 0; i < n8; i++ ) for ( j = 0; j < 8; j++ ) { sX[i].sInt[j] = sx[i*8+j]; sY[i].sInt[j] = sy[i*8+j]; } for ( i = 0; i < n8; i++ ) { x[i] = sX[i].vInt; y[i] = sY[i].vInt; } vDotProduct = vIntDotProduct ( x, y, n8 ); printf ( "\nVector dot product = %10d\n", (int) vDotProduct ); return 0;}static PtrgetMemory ( size_t amount ){ Ptr ptr; ptr = malloc(amount); if (ptr == nil) printf ("\nUnable to allocate sufficient memory."); return (ptr);}signed longvIntDotProduct ( vector signed short x[], vector signed short y[], long int n ){ typedef union { signed long xElem[4]; vector signed int vWord; } WordToVector; long int i; vector signed int partialProduct, zero = ( vector signed int ) { 0,0,0,0 }; WordToVector sum; partialProduct = zero; for ( i = 0; i < n ; i++ ) partialProduct = vec_msums ( x[i], y[i], partialProduct ); sum.vWord = vec_sums( partialProduct, zero); return sum.xElem[3];}intmain(){ mainInt(); exit(0);}/* { dg-final { global compiler_flags; if ![string match "*-m64 *" $compiler_flags] { scan-tree-dump-times "callee has AltiVec" 2 "cgraph" } } } *//* { dg-final { global compiler_flags; if ![string match "*-m64 *" $compiler_flags] { scan-assembler-not "vIntDotProduct" } } } *//* { dg-final { global compiler_flags; if ![string match "*-m64 *" $compiler_flags] { scan-assembler "mainInt" } } } */
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?