gnu / gcc / d769c5040874bf9546f2524f3f1d2a894165f92a / . / gcc / testsuite / gcc.dg / vmx / newton-1.c

/* { dg-do compile } */ | |

#include <altivec.h> | |

#define SPLAT76 ((vector unsigned char)\ | |

{0,1,2,3,0,1,2,3,0,1,2,3,0,1,2,3}) | |

#define SPLAT54 ((vector unsigned char)\ | |

{4,5,6,7,4,5,6,7,4,5,6,7,4,5,6,7}) | |

#define SPLAT32 ((vector unsigned char)\ | |

{8,9,10,11,8,9,10,11,8,9,10,11,8,9,10,11}) | |

#define SPLAT10 ((vector unsigned char)\ | |

{12,13,14,15,12,13,14,15,12,13,14,15,12,13,14,15}) | |

#define INTERLEAVE ((vector unsigned char)\ | |

{0,1,16,17,4,5,20,21,8,9,24,25,12,13,28,29}) | |

long real_32_manytaps (long ntaps, vector signed short *c, long ndat, | |

vector signed short *x, vector signed short *y) | |

{ | |

long i, j, op, ndatavec, ncoefvec; | |

vector signed short x0, x1; | |

vector signed short coef; | |

vector signed short cr10, cr32, cr54, cr76; | |

vector signed int y_even, y_odd; | |

vector signed short *x1p; | |

op = 0; | |

ndatavec = ndat >> 3; | |

ncoefvec = ntaps >> 3; | |

for (i = 0; i < ndatavec; i += 1) { | |

x0 = x[i]; | |

y_even = ((vector signed int){0x8000,0x8000,0x8000,0x8000}); | |

y_odd = ((vector signed int){0x8000,0x8000,0x8000,0x8000}); | |

j = 0; | |

x1p = x + 1 + i; | |

do { | |

coef = c[j]; | |

x1 = x1p[j]; | |

cr10 = vec_perm(coef, coef, SPLAT10); | |

y_odd = vec_msums(cr10, x1, y_odd); | |

y_even = vec_msums(cr10, vec_sld(x0, x1, 14), y_even); | |

cr32 = vec_perm(coef, coef, SPLAT32); | |

y_odd = vec_msums(cr32, vec_sld(x0, x1, 12), y_odd); | |

y_even = vec_msums(cr32, vec_sld(x0, x1, 10), y_even); | |

cr54 = vec_perm(coef, coef, SPLAT54); | |

y_odd = vec_msums(cr54, vec_sld(x0, x1, 8), y_odd); | |

y_even = vec_msums(cr54, vec_sld(x0, x1, 6), y_even); | |

cr76 = vec_perm(coef, coef, SPLAT76); | |

y_odd = vec_msums(cr76, vec_sld(x0, x1, 4), y_odd); | |

y_even = vec_msums(cr76, vec_sld(x0, x1, 2), y_even); | |

x0 = x1; | |

} while (++j < ncoefvec); | |

y[op++] = (vector signed short) vec_perm(y_even, y_odd, INTERLEAVE); | |

} | |

return op*8; | |

} |