Skip to content

Commit d562849

Browse files
added FP64 exponential integral function expint1
1 parent 1f8d20f commit d562849

10 files changed

+760
-9
lines changed

CMakeLists.txt

+2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,8 @@ set(PROJECT_SOURCES
6363
src/rvvlm_exp10DI.c
6464
src/rvvlm_expm1D.c
6565
src/rvvlm_expm1DI.c
66+
src/rvvlm_expint1D.c
67+
src/rvvlm_expint1DI.c
6668
src/rvvlm_logD_tbl.c
6769
src/rvvlm_logD.c
6870
src/rvvlm_logDI.c

include/rvvlm.h

+45-9
Original file line numberDiff line numberDiff line change
@@ -129,14 +129,31 @@ union sui64_fp64 {
129129

130130
#define KNUTH2SUM(X, Y, S, s, vlen) \
131131
do { \
132-
S = __riscv_vfadd((X), (Y), (vlen)); \
132+
(S) = __riscv_vfadd((X), (Y), (vlen)); \
133133
VFLOAT X_hat = __riscv_vfsub((S), (Y), (vlen)); \
134-
s = __riscv_vfadd( \
134+
(s) = __riscv_vfadd( \
135135
__riscv_vfsub((X), X_hat, (vlen)), \
136136
__riscv_vfsub((Y), __riscv_vfsub((S), X_hat, (vlen)), (vlen)), \
137137
(vlen)); \
138138
} while (0)
139139

140+
#define FIX2FLT(X, scale, y_hi, y_lo, vlen) \
141+
do { \
142+
(y_hi) = __riscv_vfcvt_f((X), (vlen)); \
143+
(y_lo) = __riscv_vfcvt_f( \
144+
__riscv_vsub((X), __riscv_vfcvt_x((y_hi), (vlen)), (vlen)), (vlen)); \
145+
(y_hi) = __riscv_vfmul((y_hi), (scale), (vlen)); \
146+
(y_lo) = __riscv_vfmul((y_lo), (scale), (vlen)); \
147+
} while (0)
148+
149+
#define FLT2FIX(x_hi, x_lo, scale, Y, vlen) \
150+
do { \
151+
(Y) = __riscv_vfcvt_x(__riscv_vfmul((x_hi), (scale), (vlen)), (vlen)); \
152+
(Y) = __riscv_vadd( \
153+
(Y), __riscv_vfcvt_x(__riscv_vfmul((x_lo), (scale), (vlen)), (vlen)), \
154+
(vlen)); \
155+
} while (0)
156+
140157
#define PROD_X1Y1(x, y, prod_hi, prod_lo, vlen) \
141158
do { \
142159
(prod_hi) = __riscv_vfmul((x), (y), (vlen)); \
@@ -158,6 +175,14 @@ union sui64_fp64 {
158175
(prod_lo) = __riscv_vfmacc((prod_lo), (x_lo), (y_hi), (vlen)); \
159176
} while (0)
160177

178+
#define SQR_X2(x_hi, x_lo, prod_hi, prod_lo, vlen) \
179+
do { \
180+
(prod_hi) = __riscv_vfmul((x_hi), (x_hi), (vlen)); \
181+
(prod_lo) = __riscv_vfmsub((x_hi), (x_hi), (prod_hi), (vlen)); \
182+
(prod_lo) = __riscv_vfmacc((prod_lo), (x_hi), (x_lo), (vlen)); \
183+
(prod_lo) = __riscv_vfmacc((prod_lo), (x_lo), (x_hi), (vlen)); \
184+
} while (0)
185+
161186
#define DIV_N1D2(numer, denom, delta_d, Q, q, vlen) \
162187
do { \
163188
Q = __riscv_vfdiv((numer), (denom), (vlen)); \
@@ -233,13 +258,13 @@ union sui64_fp64 {
233258

234259
#define FAST_LDEXP(num, exp, vlen) \
235260
do { \
236-
VINT n1 = __riscv_vsra((exp), 1, (vlen)); \
237-
VINT n2 = __riscv_vsub((exp), n1, (vlen)); \
238-
n1 = __riscv_vsll(n1, MAN_LEN, (vlen)); \
239-
num = I_AS_F(__riscv_vadd(F_AS_I((num)), n1, (vlen))); \
240-
n2 = __riscv_vadd(n2, EXP_BIAS, (vlen)); \
241-
n2 = __riscv_vsll(n2, MAN_LEN, (vlen)); \
242-
num = __riscv_vfmul((num), I_AS_F(n2), (vlen)); \
261+
VINT _n1 = __riscv_vsra((exp), 1, (vlen)); \
262+
VINT _n2 = __riscv_vsub((exp), _n1, (vlen)); \
263+
_n1 = __riscv_vsll(_n1, MAN_LEN, (vlen)); \
264+
(num) = I_AS_F(__riscv_vadd(F_AS_I((num)), _n1, (vlen))); \
265+
_n2 = __riscv_vadd(_n2, EXP_BIAS, (vlen)); \
266+
_n2 = __riscv_vsll(_n2, MAN_LEN, (vlen)); \
267+
(num) = __riscv_vfmul((num), I_AS_F(_n2), (vlen)); \
243268
} while (0)
244269

245270
// Some of the functions have multiple implementations using different
@@ -414,6 +439,13 @@ union sui64_fp64 {
414439
#define RVVLM_EXPM1DI_VSET_CONFIG "rvvlm_fp64m2.h"
415440
#define RVVLM_EXPM1DI_STD_EPSIM rvvlm_expm1I
416441

442+
// FP64 expint1 function configuration
443+
#define RVVLM_EXPINT1D_VSET_CONFIG "rvvlm_fp64m1.h"
444+
#define RVVLM_EXPINT1D_STD rvvlm_expint1
445+
446+
#define RVVLM_EXPINT1DI_VSET_CONFIG "rvvlm_fp64m1.h"
447+
#define RVVLM_EXPINT1DI_STD rvvlm_expint1I
448+
417449
// FP64 log function configuration
418450
#define RVVLM_LOGD_VSET_CONFIG "rvvlm_fp64m2.h"
419451
#define RVVLM_LOGD_TBL128 rvvlm_logD_tbl128
@@ -671,6 +703,10 @@ void RVVLM_EXPM1D_STD_EPSIM(size_t x_len, const double *x, double *y);
671703
void RVVLM_EXPM1DI_STD_EPSIM(size_t x_len, const double *x, size_t stride_x,
672704
double *y, size_t stride_y);
673705

706+
void RVVLM_EXPINT1D_STD(size_t x_len, const double *x, double *y);
707+
void RVVLM_EXPINT1DI_STD(size_t x_len, const double *x, size_t stride_x,
708+
double *y, size_t stride_y);
709+
674710
void RVVLM_LOGD_TBL128(size_t x_len, const double *x, double *y);
675711
void RVVLM_LOGDI_TBL128(size_t x_len, const double *x, size_t stride_x,
676712
double *y, size_t stride_y);

0 commit comments

Comments
 (0)