1*3f1979aaSAndroid Build Coastguard Worker
2*3f1979aaSAndroid Build Coastguard Worker /* Copyright (c) 2013 Julien Pommier ( [email protected] )
3*3f1979aaSAndroid Build Coastguard Worker
4*3f1979aaSAndroid Build Coastguard Worker Redistribution and use of the Software in source and binary forms,
5*3f1979aaSAndroid Build Coastguard Worker with or without modification, is permitted provided that the
6*3f1979aaSAndroid Build Coastguard Worker following conditions are met:
7*3f1979aaSAndroid Build Coastguard Worker
8*3f1979aaSAndroid Build Coastguard Worker - Neither the names of NCAR's Computational and Information Systems
9*3f1979aaSAndroid Build Coastguard Worker Laboratory, the University Corporation for Atmospheric Research,
10*3f1979aaSAndroid Build Coastguard Worker nor the names of its sponsors or contributors may be used to
11*3f1979aaSAndroid Build Coastguard Worker endorse or promote products derived from this Software without
12*3f1979aaSAndroid Build Coastguard Worker specific prior written permission.
13*3f1979aaSAndroid Build Coastguard Worker
14*3f1979aaSAndroid Build Coastguard Worker - Redistributions of source code must retain the above copyright
15*3f1979aaSAndroid Build Coastguard Worker notices, this list of conditions, and the disclaimer below.
16*3f1979aaSAndroid Build Coastguard Worker
17*3f1979aaSAndroid Build Coastguard Worker - Redistributions in binary form must reproduce the above copyright
18*3f1979aaSAndroid Build Coastguard Worker notice, this list of conditions, and the disclaimer below in the
19*3f1979aaSAndroid Build Coastguard Worker documentation and/or other materials provided with the
20*3f1979aaSAndroid Build Coastguard Worker distribution.
21*3f1979aaSAndroid Build Coastguard Worker
22*3f1979aaSAndroid Build Coastguard Worker THIS SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
23*3f1979aaSAndroid Build Coastguard Worker EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO THE WARRANTIES OF
24*3f1979aaSAndroid Build Coastguard Worker MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
25*3f1979aaSAndroid Build Coastguard Worker NONINFRINGEMENT. IN NO EVENT SHALL THE CONTRIBUTORS OR COPYRIGHT
26*3f1979aaSAndroid Build Coastguard Worker HOLDERS BE LIABLE FOR ANY CLAIM, INDIRECT, INCIDENTAL, SPECIAL,
27*3f1979aaSAndroid Build Coastguard Worker EXEMPLARY, OR CONSEQUENTIAL DAMAGES OR OTHER LIABILITY, WHETHER IN AN
28*3f1979aaSAndroid Build Coastguard Worker ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
29*3f1979aaSAndroid Build Coastguard Worker CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS WITH THE
30*3f1979aaSAndroid Build Coastguard Worker SOFTWARE.
31*3f1979aaSAndroid Build Coastguard Worker */
32*3f1979aaSAndroid Build Coastguard Worker
33*3f1979aaSAndroid Build Coastguard Worker #ifndef PF_ALTIVEC_FLT_H
34*3f1979aaSAndroid Build Coastguard Worker #define PF_ALTIVEC_FLT_H
35*3f1979aaSAndroid Build Coastguard Worker
36*3f1979aaSAndroid Build Coastguard Worker /*
37*3f1979aaSAndroid Build Coastguard Worker Altivec support macros
38*3f1979aaSAndroid Build Coastguard Worker */
39*3f1979aaSAndroid Build Coastguard Worker #if !defined(PFFFT_SIMD_DISABLE) && (defined(__ppc__) || defined(__ppc64__))
40*3f1979aaSAndroid Build Coastguard Worker #pragma message( __FILE__ ": ALTIVEC float macros are defined" )
41*3f1979aaSAndroid Build Coastguard Worker typedef vector float v4sf;
42*3f1979aaSAndroid Build Coastguard Worker
43*3f1979aaSAndroid Build Coastguard Worker # define SIMD_SZ 4
44*3f1979aaSAndroid Build Coastguard Worker
45*3f1979aaSAndroid Build Coastguard Worker typedef union v4sf_union {
46*3f1979aaSAndroid Build Coastguard Worker v4sf v;
47*3f1979aaSAndroid Build Coastguard Worker float f[SIMD_SZ];
48*3f1979aaSAndroid Build Coastguard Worker } v4sf_union;
49*3f1979aaSAndroid Build Coastguard Worker
50*3f1979aaSAndroid Build Coastguard Worker # define VREQUIRES_ALIGN 1 /* not sure, if really required */
51*3f1979aaSAndroid Build Coastguard Worker # define VARCH "ALTIVEC"
52*3f1979aaSAndroid Build Coastguard Worker # define VZERO() ((vector float) vec_splat_u8(0))
53*3f1979aaSAndroid Build Coastguard Worker # define VMUL(a,b) vec_madd(a,b, VZERO())
54*3f1979aaSAndroid Build Coastguard Worker # define VADD(a,b) vec_add(a,b)
55*3f1979aaSAndroid Build Coastguard Worker # define VMADD(a,b,c) vec_madd(a,b,c)
56*3f1979aaSAndroid Build Coastguard Worker # define VSUB(a,b) vec_sub(a,b)
ld_ps1(const float * p)57*3f1979aaSAndroid Build Coastguard Worker inline v4sf ld_ps1(const float *p) { v4sf v=vec_lde(0,p); return vec_splat(vec_perm(v, v, vec_lvsl(0, p)), 0); }
58*3f1979aaSAndroid Build Coastguard Worker # define LD_PS1(p) ld_ps1(&p)
59*3f1979aaSAndroid Build Coastguard Worker # define INTERLEAVE2(in1, in2, out1, out2) { v4sf tmp__ = vec_mergeh(in1, in2); out2 = vec_mergel(in1, in2); out1 = tmp__; }
60*3f1979aaSAndroid Build Coastguard Worker # define UNINTERLEAVE2(in1, in2, out1, out2) { \
61*3f1979aaSAndroid Build Coastguard Worker vector unsigned char vperm1 = (vector unsigned char)(0,1,2,3,8,9,10,11,16,17,18,19,24,25,26,27); \
62*3f1979aaSAndroid Build Coastguard Worker vector unsigned char vperm2 = (vector unsigned char)(4,5,6,7,12,13,14,15,20,21,22,23,28,29,30,31); \
63*3f1979aaSAndroid Build Coastguard Worker v4sf tmp__ = vec_perm(in1, in2, vperm1); out2 = vec_perm(in1, in2, vperm2); out1 = tmp__; \
64*3f1979aaSAndroid Build Coastguard Worker }
65*3f1979aaSAndroid Build Coastguard Worker # define VTRANSPOSE4(x0,x1,x2,x3) { \
66*3f1979aaSAndroid Build Coastguard Worker v4sf y0 = vec_mergeh(x0, x2); \
67*3f1979aaSAndroid Build Coastguard Worker v4sf y1 = vec_mergel(x0, x2); \
68*3f1979aaSAndroid Build Coastguard Worker v4sf y2 = vec_mergeh(x1, x3); \
69*3f1979aaSAndroid Build Coastguard Worker v4sf y3 = vec_mergel(x1, x3); \
70*3f1979aaSAndroid Build Coastguard Worker x0 = vec_mergeh(y0, y2); \
71*3f1979aaSAndroid Build Coastguard Worker x1 = vec_mergel(y0, y2); \
72*3f1979aaSAndroid Build Coastguard Worker x2 = vec_mergeh(y1, y3); \
73*3f1979aaSAndroid Build Coastguard Worker x3 = vec_mergel(y1, y3); \
74*3f1979aaSAndroid Build Coastguard Worker }
75*3f1979aaSAndroid Build Coastguard Worker # define VSWAPHL(a,b) vec_perm(a,b, (vector unsigned char)(16,17,18,19,20,21,22,23,8,9,10,11,12,13,14,15))
76*3f1979aaSAndroid Build Coastguard Worker # define VALIGNED(ptr) ((((uintptr_t)(ptr)) & 0xF) == 0)
77*3f1979aaSAndroid Build Coastguard Worker
78*3f1979aaSAndroid Build Coastguard Worker #endif
79*3f1979aaSAndroid Build Coastguard Worker
80*3f1979aaSAndroid Build Coastguard Worker #endif /* PF_SSE1_FLT_H */
81*3f1979aaSAndroid Build Coastguard Worker
82