brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.5 KiB · 89d270f Raw
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