Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

added inverse functions asin/acos/atan/atan2, radians and pi. #8

Merged
merged 1 commit into from
Dec 28, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,22 @@ project(veclibm C)
include(CTest)

set(PROJECT_SOURCES
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_acosD.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_acosDI.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_acospiD.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_acospiDI.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_asinD.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_asinDI.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_asinpiD.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_asinpiDI.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atanD.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atanDI.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atanpiD.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atanpiDI.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atan2D.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atan2DI.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atan2piD.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_atan2piDI.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_expD_tbl.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_expD.c
${CMAKE_CURRENT_SOURCE_DIR}/src/rvvlm_expDI.c
Expand Down
101 changes: 94 additions & 7 deletions include/rvvlm.h
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@ union sui64_fp64 {
(pick_a), (vlen)), \
(vlen))

#define PSTEP_I(COEFF_j, X, POLY, vlen) \
__riscv_vsadd(__riscv_vsmul((POLY), (X), 1, (vlen)), (COEFF_j), (vlen))

#define PSTEPN_I(COEFF_j, X, POLY, vlen) \
__riscv_vrsub(__riscv_vsmul((POLY), (X), 1, (vlen)), (COEFF_j), (vlen))

#define FAST2SUM(X, Y, S, s, vlen) \
do { \
S = __riscv_vfadd((X), (Y), (vlen)); \
Expand Down Expand Up @@ -109,13 +115,6 @@ union sui64_fp64 {
(Q) = __riscv_vfadd((Q), _q, (vlen)); \
} while (0)

#define IDENTIFY2(__vclass, __stencil, __signature, __identity_mask, __vlen) \
do { \
__signature = __riscv_vand(__vclass, __stencil, __vlen); \
__identity_mask = \
__riscv_vmsgtu(__riscv_vand(__vclass, __stencil, __vlen), 0, __vlen) \
} while (0)

#define IDENTIFY(vclass, stencil, identity_mask, vlen) \
identity_mask = \
__riscv_vmsgtu(__riscv_vand((vclass), (stencil), (vlen)), 0, (vlen));
Expand All @@ -138,6 +137,58 @@ union sui64_fp64 {
// algorithms or styles. The following configure the name of each of these
// variations, thus allowing one to be set to the standard libm name.

// FP64 acos function configuration
#define RVVLM_ACOSD_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ACOSD_FIXEDPT rvvlm_acos

#define RVVLM_ACOSDI_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ACOSDI_FIXEDPT rvvlm_acosI

#define RVVLM_ACOSPID_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ACOSPID_FIXEDPT rvvlm_acospi

#define RVVLM_ACOSPIDI_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ACOSPIDI_FIXEDPT rvvlm_acospiI

// FP64 asin function configuration
#define RVVLM_ASIND_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ASIND_FIXEDPT rvvlm_asin

#define RVVLM_ASINDI_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ASINDI_FIXEDPT rvvlm_asinI

#define RVVLM_ASINPID_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ASINPID_FIXEDPT rvvlm_asinpi

#define RVVLM_ASINPIDI_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ASINPIDI_FIXEDPT rvvlm_asinpiI

// FP64 atan function configuration
#define RVVLM_ATAND_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ATAND_FIXEDPT rvvlm_atan

#define RVVLM_ATANDI_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ATANDI_FIXEDPT rvvlm_atanI

#define RVVLM_ATANPID_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ATANPID_FIXEDPT rvvlm_atanpi

#define RVVLM_ATANPIDI_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ATANPIDI_FIXEDPT rvvlm_atanpiI

// FP64 atan2 function configuration
#define RVVLM_ATAN2D_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ATAN2D_FIXEDPT rvvlm_atan2

#define RVVLM_ATAN2DI_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ATAN2DI_FIXEDPT rvvlm_atan2I

#define RVVLM_ATAN2PID_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ATAN2PID_FIXEDPT rvvlm_atan2pi

#define RVVLM_ATAN2PIDI_VSET_CONFIG "rvvlm_fp64m2.h"
#define RVVLM_ATAN2PIDI_FIXEDPT rvvlm_atan2piI

// FP64 exp function configuration
#define RVVLM_EXPD_VSET_CONFIG "rvvlm_fp64m4.h"
#define RVVLM_EXPD_STD rvvlm_expD_std
Expand Down Expand Up @@ -294,6 +345,42 @@ extern double logtbl_4_powD_128_hi_lo[256];
extern double dbl_2ovpi_tbl[28];

// Define the functions in the vector math library
void RVVLM_ACOSD_FIXEDPT(size_t x_len, const double *x, double *y);
void RVVLM_ACOSDI_FIXEDPT(size_t x_len, const double *x, size_t stride_x,
double *y, size_t stride_y);

void RVVLM_ACOSPID_FIXEDPT(size_t x_len, const double *x, double *y);
void RVVLM_ACOSPIDI_FIXEDPT(size_t x_len, const double *x, size_t stride_x,
double *y, size_t stride_y);

void RVVLM_ASIND_FIXEDPT(size_t x_len, const double *x, double *y);
void RVVLM_ASINDI_FIXEDPT(size_t x_len, const double *x, size_t stride_x,
double *y, size_t stride_y);

void RVVLM_ASINPID_FIXEDPT(size_t x_len, const double *x, double *y);
void RVVLM_ASINPIDI_FIXEDPT(size_t x_len, const double *x, size_t stride_x,
double *y, size_t stride_y);

void RVVLM_ATAND_FIXEDPT(size_t x_len, const double *x, double *y);
void RVVLM_ATANDI_FIXEDPT(size_t x_len, const double *x, size_t stride_x,
double *y, size_t stride_y);

void RVVLM_ATANPID_FIXEDPT(size_t x_len, const double *x, double *y);
void RVVLM_ATANPIDI_FIXEDPT(size_t x_len, const double *x, size_t stride_x,
double *y, size_t stride_y);

void RVVLM_ATAN2D_FIXEDPT(size_t xy_len, const double *y, const double *x,
double *z);
void RVVLM_ATAN2DI_FIXEDPT(size_t xy_len, const double *y, size_t stride_y,
const double *x, size_t stride_x, double *z,
size_t stride_z);

void RVVLM_ATAN2PID_FIXEDPT(size_t xy_len, const double *y, const double *x,
double *z);
void RVVLM_ATAN2PIDI_FIXEDPT(size_t xy_len, const double *y, size_t stride_y,
const double *x, size_t stride_x, double *z,
size_t stride_z);

void RVVLM_EXPD_STD(size_t x_len, const double *x, double *y);
void RVVLM_EXPDI_STD(size_t x_len, const double *x, size_t stride_x, double *y,
size_t stride_y);
Expand Down
Loading