1 /*===---- velintrin_approx.h - VEL intrinsics helper for VE ----------------===
3 * Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 * See https://llvm.org/LICENSE.txt for license information.
5 * SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 *===-----------------------------------------------------------------------===
9 #ifndef __VEL_INTRIN_APPROX_H__
10 #define __VEL_INTRIN_APPROX_H__
12 static inline __vr
_vel_approx_vfdivs_vvvl(__vr v0
, __vr v1
, int l
) {
15 v5
= _vel_vrcps_vvl(v1
, l
);
17 v4
= _vel_vfnmsbs_vsvvl(s0
, v1
, v5
, l
);
18 v3
= _vel_vfmads_vvvvl(v5
, v5
, v4
, l
);
19 v2
= _vel_vfmuls_vvvl(v0
, v3
, l
);
20 v4
= _vel_vfnmsbs_vvvvl(v0
, v2
, v1
, l
);
21 v2
= _vel_vfmads_vvvvl(v2
, v5
, v4
, l
);
22 v0
= _vel_vfnmsbs_vvvvl(v0
, v2
, v1
, l
);
23 v0
= _vel_vfmads_vvvvl(v2
, v3
, v0
, l
);
27 static inline __vr
_vel_approx_pvfdiv_vvvl(__vr v0
, __vr v1
, int l
) {
30 v5
= _vel_pvrcp_vvl(v1
, l
);
32 v4
= _vel_pvfnmsb_vsvvl(s0
, v1
, v5
, l
);
33 v3
= _vel_pvfmad_vvvvl(v5
, v5
, v4
, l
);
34 v2
= _vel_pvfmul_vvvl(v0
, v3
, l
);
35 v4
= _vel_pvfnmsb_vvvvl(v0
, v2
, v1
, l
);
36 v2
= _vel_pvfmad_vvvvl(v2
, v5
, v4
, l
);
37 v0
= _vel_pvfnmsb_vvvvl(v0
, v2
, v1
, l
);
38 v0
= _vel_pvfmad_vvvvl(v2
, v3
, v0
, l
);
42 static inline __vr
_vel_approx_vfdivs_vsvl(float s0
, __vr v0
, int l
) {
45 v4
= _vel_vrcps_vvl(v0
, l
);
47 v2
= _vel_vfnmsbs_vsvvl(s1
, v0
, v4
, l
);
48 v2
= _vel_vfmads_vvvvl(v4
, v4
, v2
, l
);
49 v1
= _vel_vfmuls_vsvl(s0
, v2
, l
);
50 v3
= _vel_vfnmsbs_vsvvl(s0
, v1
, v0
, l
);
51 v1
= _vel_vfmads_vvvvl(v1
, v4
, v3
, l
);
52 v3
= _vel_vfnmsbs_vsvvl(s0
, v1
, v0
, l
);
53 v0
= _vel_vfmads_vvvvl(v1
, v2
, v3
, l
);
57 static inline __vr
_vel_approx_vfdivs_vvsl(__vr v0
, float s0
, int l
) {
61 v1
= _vel_vfmuls_vsvl(s1
, v0
, l
);
62 v2
= _vel_vfnmsbs_vvsvl(v0
, s0
, v1
, l
);
63 v0
= _vel_vfmads_vvsvl(v1
, s1
, v2
, l
);
67 static inline __vr
_vel_approx_vfdivd_vsvl(double s0
, __vr v0
, int l
) {
69 v2
= _vel_vrcpd_vvl(v0
, l
);
71 v3
= _vel_vfnmsbd_vsvvl(s1
, v0
, v2
, l
);
72 v2
= _vel_vfmadd_vvvvl(v2
, v2
, v3
, l
);
73 v1
= _vel_vfnmsbd_vsvvl(s1
, v0
, v2
, l
);
74 v1
= _vel_vfmadd_vvvvl(v2
, v2
, v1
, l
);
75 v1
= _vel_vaddul_vsvl(1, v1
, l
);
76 v3
= _vel_vfnmsbd_vsvvl(s1
, v0
, v1
, l
);
77 v3
= _vel_vfmadd_vvvvl(v1
, v1
, v3
, l
);
78 v1
= _vel_vfmuld_vsvl(s0
, v3
, l
);
79 v0
= _vel_vfnmsbd_vsvvl(s0
, v1
, v0
, l
);
80 v0
= _vel_vfmadd_vvvvl(v1
, v3
, v0
, l
);
84 static inline __vr
_vel_approx_vfsqrtd_vvl(__vr v0
, int l
) {
87 v2
= _vel_vrsqrtdnex_vvl(v0
, l
);
88 v1
= _vel_vfmuld_vvvl(v0
, v2
, l
);
91 v3
= _vel_vfnmsbd_vsvvl(s0
, v1
, v2
, l
);
92 v3
= _vel_vfmuld_vsvl(s1
, v3
, l
);
93 v2
= _vel_vfmadd_vvvvl(v2
, v2
, v3
, l
);
94 v1
= _vel_vfmuld_vvvl(v0
, v2
, l
);
95 v3
= _vel_vfnmsbd_vsvvl(s0
, v1
, v2
, l
);
96 v3
= _vel_vfmuld_vsvl(s1
, v3
, l
);
97 v0
= _vel_vfmadd_vvvvl(v1
, v1
, v3
, l
);
101 static inline __vr
_vel_approx_vfsqrts_vvl(__vr v0
, int l
) {
104 v0
= _vel_vcvtds_vvl(v0
, l
);
105 v2
= _vel_vrsqrtdnex_vvl(v0
, l
);
106 v1
= _vel_vfmuld_vvvl(v0
, v2
, l
);
109 v3
= _vel_vfnmsbd_vsvvl(s0
, v1
, v2
, l
);
110 v3
= _vel_vfmuld_vsvl(s1
, v3
, l
);
111 v2
= _vel_vfmadd_vvvvl(v2
, v2
, v3
, l
);
112 v1
= _vel_vfmuld_vvvl(v0
, v2
, l
);
113 v3
= _vel_vfnmsbd_vsvvl(s0
, v1
, v2
, l
);
114 v3
= _vel_vfmuld_vsvl(s1
, v3
, l
);
115 v0
= _vel_vfmadd_vvvvl(v1
, v1
, v3
, l
);
116 v0
= _vel_vcvtsd_vvl(v0
, l
);