121 lines · c
1/*===---- velintrin_approx.h - VEL intrinsics helper for VE ----------------===2 *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-exception6 *7 *===-----------------------------------------------------------------------===8 */9#ifndef __VEL_INTRIN_APPROX_H__10#define __VEL_INTRIN_APPROX_H__11 12static inline __vr _vel_approx_vfdivs_vvvl(__vr v0, __vr v1, int l) {13 float s0;14 __vr v2, v3, v4, v5;15 v5 = _vel_vrcps_vvl(v1, l);16 s0 = 1.0;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);24 return v0;25}26 27static inline __vr _vel_approx_pvfdiv_vvvl(__vr v0, __vr v1, int l) {28 float s0;29 __vr v2, v3, v4, v5;30 v5 = _vel_pvrcp_vvl(v1, l);31 s0 = 1.0;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);39 return v0;40}41 42static inline __vr _vel_approx_vfdivs_vsvl(float s0, __vr v0, int l) {43 float s1;44 __vr v1, v2, v3, v4;45 v4 = _vel_vrcps_vvl(v0, l);46 s1 = 1.0;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);54 return v0;55}56 57static inline __vr _vel_approx_vfdivs_vvsl(__vr v0, float s0, int l) {58 float s1;59 __vr v1, v2;60 s1 = 1.0f / s0;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);64 return v0;65}66 67static inline __vr _vel_approx_vfdivd_vsvl(double s0, __vr v0, int l) {68 __vr v1, v2, v3;69 v2 = _vel_vrcpd_vvl(v0, l);70 double s1 = 1.0;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);81 return v0;82}83 84static inline __vr _vel_approx_vfsqrtd_vvl(__vr v0, int l) {85 double s0, s1;86 __vr v1, v2, v3;87 v2 = _vel_vrsqrtdnex_vvl(v0, l);88 v1 = _vel_vfmuld_vvvl(v0, v2, l);89 s0 = 1.0;90 s1 = 0.5;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);98 return v0;99}100 101static inline __vr _vel_approx_vfsqrts_vvl(__vr v0, int l) {102 float s0, s1;103 __vr v1, v2, v3;104 v0 = _vel_vcvtds_vvl(v0, l);105 v2 = _vel_vrsqrtdnex_vvl(v0, l);106 v1 = _vel_vfmuld_vvvl(v0, v2, l);107 s0 = 1.0;108 s1 = 0.5;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);117 return v0;118}119 120#endif121