xref: /aosp_15_r20/external/pffft/simd/pf_altivec_float.h (revision 3f1979aa0d7ad34fcf3763de7b7b8f8cd67e5bdd)
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