1*bed243d3SAndroid Build Coastguard Worker /*===---- velintrin_approx.h - VEL intrinsics helper for VE ----------------===
2*bed243d3SAndroid Build Coastguard Worker *
3*bed243d3SAndroid Build Coastguard Worker * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*bed243d3SAndroid Build Coastguard Worker * See https://llvm.org/LICENSE.txt for license information.
5*bed243d3SAndroid Build Coastguard Worker * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*bed243d3SAndroid Build Coastguard Worker *
7*bed243d3SAndroid Build Coastguard Worker *===-----------------------------------------------------------------------===
8*bed243d3SAndroid Build Coastguard Worker */
9*bed243d3SAndroid Build Coastguard Worker #ifndef __VEL_INTRIN_APPROX_H__
10*bed243d3SAndroid Build Coastguard Worker #define __VEL_INTRIN_APPROX_H__
11*bed243d3SAndroid Build Coastguard Worker
_vel_approx_vfdivs_vvvl(__vr v0,__vr v1,int l)12*bed243d3SAndroid Build Coastguard Worker static inline __vr _vel_approx_vfdivs_vvvl(__vr v0, __vr v1, int l) {
13*bed243d3SAndroid Build Coastguard Worker float s0;
14*bed243d3SAndroid Build Coastguard Worker __vr v2, v3, v4, v5;
15*bed243d3SAndroid Build Coastguard Worker v5 = _vel_vrcps_vvl(v1, l);
16*bed243d3SAndroid Build Coastguard Worker s0 = 1.0;
17*bed243d3SAndroid Build Coastguard Worker v4 = _vel_vfnmsbs_vsvvl(s0, v1, v5, l);
18*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfmads_vvvvl(v5, v5, v4, l);
19*bed243d3SAndroid Build Coastguard Worker v2 = _vel_vfmuls_vvvl(v0, v3, l);
20*bed243d3SAndroid Build Coastguard Worker v4 = _vel_vfnmsbs_vvvvl(v0, v2, v1, l);
21*bed243d3SAndroid Build Coastguard Worker v2 = _vel_vfmads_vvvvl(v2, v5, v4, l);
22*bed243d3SAndroid Build Coastguard Worker v0 = _vel_vfnmsbs_vvvvl(v0, v2, v1, l);
23*bed243d3SAndroid Build Coastguard Worker v0 = _vel_vfmads_vvvvl(v2, v3, v0, l);
24*bed243d3SAndroid Build Coastguard Worker return v0;
25*bed243d3SAndroid Build Coastguard Worker }
26*bed243d3SAndroid Build Coastguard Worker
_vel_approx_pvfdiv_vvvl(__vr v0,__vr v1,int l)27*bed243d3SAndroid Build Coastguard Worker static inline __vr _vel_approx_pvfdiv_vvvl(__vr v0, __vr v1, int l) {
28*bed243d3SAndroid Build Coastguard Worker float s0;
29*bed243d3SAndroid Build Coastguard Worker __vr v2, v3, v4, v5;
30*bed243d3SAndroid Build Coastguard Worker v5 = _vel_pvrcp_vvl(v1, l);
31*bed243d3SAndroid Build Coastguard Worker s0 = 1.0;
32*bed243d3SAndroid Build Coastguard Worker v4 = _vel_pvfnmsb_vsvvl(s0, v1, v5, l);
33*bed243d3SAndroid Build Coastguard Worker v3 = _vel_pvfmad_vvvvl(v5, v5, v4, l);
34*bed243d3SAndroid Build Coastguard Worker v2 = _vel_pvfmul_vvvl(v0, v3, l);
35*bed243d3SAndroid Build Coastguard Worker v4 = _vel_pvfnmsb_vvvvl(v0, v2, v1, l);
36*bed243d3SAndroid Build Coastguard Worker v2 = _vel_pvfmad_vvvvl(v2, v5, v4, l);
37*bed243d3SAndroid Build Coastguard Worker v0 = _vel_pvfnmsb_vvvvl(v0, v2, v1, l);
38*bed243d3SAndroid Build Coastguard Worker v0 = _vel_pvfmad_vvvvl(v2, v3, v0, l);
39*bed243d3SAndroid Build Coastguard Worker return v0;
40*bed243d3SAndroid Build Coastguard Worker }
41*bed243d3SAndroid Build Coastguard Worker
_vel_approx_vfdivs_vsvl(float s0,__vr v0,int l)42*bed243d3SAndroid Build Coastguard Worker static inline __vr _vel_approx_vfdivs_vsvl(float s0, __vr v0, int l) {
43*bed243d3SAndroid Build Coastguard Worker float s1;
44*bed243d3SAndroid Build Coastguard Worker __vr v1, v2, v3, v4;
45*bed243d3SAndroid Build Coastguard Worker v4 = _vel_vrcps_vvl(v0, l);
46*bed243d3SAndroid Build Coastguard Worker s1 = 1.0;
47*bed243d3SAndroid Build Coastguard Worker v2 = _vel_vfnmsbs_vsvvl(s1, v0, v4, l);
48*bed243d3SAndroid Build Coastguard Worker v2 = _vel_vfmads_vvvvl(v4, v4, v2, l);
49*bed243d3SAndroid Build Coastguard Worker v1 = _vel_vfmuls_vsvl(s0, v2, l);
50*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfnmsbs_vsvvl(s0, v1, v0, l);
51*bed243d3SAndroid Build Coastguard Worker v1 = _vel_vfmads_vvvvl(v1, v4, v3, l);
52*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfnmsbs_vsvvl(s0, v1, v0, l);
53*bed243d3SAndroid Build Coastguard Worker v0 = _vel_vfmads_vvvvl(v1, v2, v3, l);
54*bed243d3SAndroid Build Coastguard Worker return v0;
55*bed243d3SAndroid Build Coastguard Worker }
56*bed243d3SAndroid Build Coastguard Worker
_vel_approx_vfdivs_vvsl(__vr v0,float s0,int l)57*bed243d3SAndroid Build Coastguard Worker static inline __vr _vel_approx_vfdivs_vvsl(__vr v0, float s0, int l) {
58*bed243d3SAndroid Build Coastguard Worker float s1;
59*bed243d3SAndroid Build Coastguard Worker __vr v1, v2;
60*bed243d3SAndroid Build Coastguard Worker s1 = 1.0f / s0;
61*bed243d3SAndroid Build Coastguard Worker v1 = _vel_vfmuls_vsvl(s1, v0, l);
62*bed243d3SAndroid Build Coastguard Worker v2 = _vel_vfnmsbs_vvsvl(v0, s0, v1, l);
63*bed243d3SAndroid Build Coastguard Worker v0 = _vel_vfmads_vvsvl(v1, s1, v2, l);
64*bed243d3SAndroid Build Coastguard Worker return v0;
65*bed243d3SAndroid Build Coastguard Worker }
66*bed243d3SAndroid Build Coastguard Worker
_vel_approx_vfdivd_vsvl(double s0,__vr v0,int l)67*bed243d3SAndroid Build Coastguard Worker static inline __vr _vel_approx_vfdivd_vsvl(double s0, __vr v0, int l) {
68*bed243d3SAndroid Build Coastguard Worker __vr v1, v2, v3;
69*bed243d3SAndroid Build Coastguard Worker v2 = _vel_vrcpd_vvl(v0, l);
70*bed243d3SAndroid Build Coastguard Worker double s1 = 1.0;
71*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfnmsbd_vsvvl(s1, v0, v2, l);
72*bed243d3SAndroid Build Coastguard Worker v2 = _vel_vfmadd_vvvvl(v2, v2, v3, l);
73*bed243d3SAndroid Build Coastguard Worker v1 = _vel_vfnmsbd_vsvvl(s1, v0, v2, l);
74*bed243d3SAndroid Build Coastguard Worker v1 = _vel_vfmadd_vvvvl(v2, v2, v1, l);
75*bed243d3SAndroid Build Coastguard Worker v1 = _vel_vaddul_vsvl(1, v1, l);
76*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfnmsbd_vsvvl(s1, v0, v1, l);
77*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfmadd_vvvvl(v1, v1, v3, l);
78*bed243d3SAndroid Build Coastguard Worker v1 = _vel_vfmuld_vsvl(s0, v3, l);
79*bed243d3SAndroid Build Coastguard Worker v0 = _vel_vfnmsbd_vsvvl(s0, v1, v0, l);
80*bed243d3SAndroid Build Coastguard Worker v0 = _vel_vfmadd_vvvvl(v1, v3, v0, l);
81*bed243d3SAndroid Build Coastguard Worker return v0;
82*bed243d3SAndroid Build Coastguard Worker }
83*bed243d3SAndroid Build Coastguard Worker
_vel_approx_vfsqrtd_vvl(__vr v0,int l)84*bed243d3SAndroid Build Coastguard Worker static inline __vr _vel_approx_vfsqrtd_vvl(__vr v0, int l) {
85*bed243d3SAndroid Build Coastguard Worker double s0, s1;
86*bed243d3SAndroid Build Coastguard Worker __vr v1, v2, v3;
87*bed243d3SAndroid Build Coastguard Worker v2 = _vel_vrsqrtdnex_vvl(v0, l);
88*bed243d3SAndroid Build Coastguard Worker v1 = _vel_vfmuld_vvvl(v0, v2, l);
89*bed243d3SAndroid Build Coastguard Worker s0 = 1.0;
90*bed243d3SAndroid Build Coastguard Worker s1 = 0.5;
91*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfnmsbd_vsvvl(s0, v1, v2, l);
92*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfmuld_vsvl(s1, v3, l);
93*bed243d3SAndroid Build Coastguard Worker v2 = _vel_vfmadd_vvvvl(v2, v2, v3, l);
94*bed243d3SAndroid Build Coastguard Worker v1 = _vel_vfmuld_vvvl(v0, v2, l);
95*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfnmsbd_vsvvl(s0, v1, v2, l);
96*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfmuld_vsvl(s1, v3, l);
97*bed243d3SAndroid Build Coastguard Worker v0 = _vel_vfmadd_vvvvl(v1, v1, v3, l);
98*bed243d3SAndroid Build Coastguard Worker return v0;
99*bed243d3SAndroid Build Coastguard Worker }
100*bed243d3SAndroid Build Coastguard Worker
_vel_approx_vfsqrts_vvl(__vr v0,int l)101*bed243d3SAndroid Build Coastguard Worker static inline __vr _vel_approx_vfsqrts_vvl(__vr v0, int l) {
102*bed243d3SAndroid Build Coastguard Worker float s0, s1;
103*bed243d3SAndroid Build Coastguard Worker __vr v1, v2, v3;
104*bed243d3SAndroid Build Coastguard Worker v0 = _vel_vcvtds_vvl(v0, l);
105*bed243d3SAndroid Build Coastguard Worker v2 = _vel_vrsqrtdnex_vvl(v0, l);
106*bed243d3SAndroid Build Coastguard Worker v1 = _vel_vfmuld_vvvl(v0, v2, l);
107*bed243d3SAndroid Build Coastguard Worker s0 = 1.0;
108*bed243d3SAndroid Build Coastguard Worker s1 = 0.5;
109*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfnmsbd_vsvvl(s0, v1, v2, l);
110*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfmuld_vsvl(s1, v3, l);
111*bed243d3SAndroid Build Coastguard Worker v2 = _vel_vfmadd_vvvvl(v2, v2, v3, l);
112*bed243d3SAndroid Build Coastguard Worker v1 = _vel_vfmuld_vvvl(v0, v2, l);
113*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfnmsbd_vsvvl(s0, v1, v2, l);
114*bed243d3SAndroid Build Coastguard Worker v3 = _vel_vfmuld_vsvl(s1, v3, l);
115*bed243d3SAndroid Build Coastguard Worker v0 = _vel_vfmadd_vvvvl(v1, v1, v3, l);
116*bed243d3SAndroid Build Coastguard Worker v0 = _vel_vcvtsd_vvl(v0, l);
117*bed243d3SAndroid Build Coastguard Worker return v0;
118*bed243d3SAndroid Build Coastguard Worker }
119*bed243d3SAndroid Build Coastguard Worker
120*bed243d3SAndroid Build Coastguard Worker #endif
121