-
Notifications
You must be signed in to change notification settings - Fork 17
/
complex_return_style_adapters.c
123 lines (109 loc) · 5.01 KB
/
complex_return_style_adapters.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#include <complex.h>
#include "libblastrampoline_internal.h"
/*
* Some libraries use an argument-passing convention for returning complex numbers.
* We create wrappers to work around this behavior and provide a consistent ABI
* across all libraries. An example of this style of library is MKL, x-ref:
* - https://community.intel.com/t5/Intel-oneAPI-Math-Kernel-Library/ARPACK-with-MKL-crashes-when-calling-zdotc/td-p/1054316
* - https://scicomp.stackexchange.com/questions/5380/intel-mkl-difference-between-mkl-intel-lp64-and-mkl-gf-lp64
*/
// zdotc
extern void (*cmplxret_zdotc__addr)(double complex * z,
const int32_t *,
const double complex *, const int32_t *,
const double complex *, const int32_t *);
double complex cmplxret_zdotc_(const int32_t * N,
const double complex *X, const int32_t * incX,
const double complex *Y, const int32_t * incY)
{
double complex c;
cmplxret_zdotc__addr(&c, N, X, incX, Y, incY);
return c;
}
extern void (*cmplxret_zdotc_64__addr)(double complex * z,
const int64_t *,
const double complex *, const int64_t *,
const double complex *, const int64_t *);
double complex cmplxret_zdotc_64_(const int64_t * N,
const double complex *X, const int64_t * incX,
const double complex *Y, const int64_t * incY)
{
double complex c;
cmplxret_zdotc_64__addr(&c, N, X, incX, Y, incY);
return c;
}
// zdotu
extern void (*cmplxret_zdotu__addr)(double complex * z,
const int32_t *,
const double complex *, const int32_t *,
const double complex *, const int32_t *);
double complex cmplxret_zdotu_(const int32_t * N,
const double complex *X, const int32_t * incX,
const double complex *Y, const int32_t * incY)
{
double complex c;
cmplxret_zdotu__addr(&c, N, X, incX, Y, incY);
return c;
}
extern void (*cmplxret_zdotu_64__addr)(double complex * z,
const int64_t *,
const double complex *, const int64_t *,
const double complex *, const int64_t *);
double complex cmplxret_zdotu_64_(const int64_t * N,
const double complex *X, const int64_t * incX,
const double complex *Y, const int64_t * incY)
{
double complex c;
cmplxret_zdotu_64__addr(&c, N, X, incX, Y, incY);
return c;
}
// cdotc
extern void (*cmplxret_cdotc__addr)(float complex * z,
const int32_t *,
const float complex *, const int32_t *,
const float complex *, const int32_t *);
float complex cmplxret_cdotc_(const int32_t * N,
const float complex *X, const int32_t * incX,
const float complex *Y, const int32_t * incY)
{
float complex c;
cmplxret_cdotc__addr(&c, N, X, incX, Y, incY);
return c;
}
extern void (*cmplxret_cdotc_64__addr)(float complex * z,
const int64_t *,
const float complex *, const int64_t *,
const float complex *, const int64_t *);
float complex cmplxret_cdotc_64_(const int64_t * N,
const float complex *X, const int64_t * incX,
const float complex *Y, const int64_t * incY)
{
float complex c;
cmplxret_cdotc_64__addr(&c, N, X, incX, Y, incY);
return c;
}
// cdotu
extern void (*cmplxret_cdotu__addr)(float complex * z,
const int32_t *,
const float complex *, const int32_t *,
const float complex *, const int32_t *);
float complex cmplxret_cdotu_(const int32_t * N,
const float complex *X, const int32_t * incX,
const float complex *Y, const int32_t * incY)
{
float complex c;
cmplxret_cdotu__addr(&c, N, X, incX, Y, incY);
return c;
}
extern void (*cmplxret_cdotu_64__addr)(float complex * z,
const int64_t *,
const float complex *, const int64_t *,
const float complex *, const int64_t *);
float complex cmplxret_cdotu_64_(const int64_t * N,
const float complex *X, const int64_t * incX,
const float complex *Y, const int64_t * incY)
{
float complex c;
cmplxret_cdotu_64__addr(&c, N, X, incX, Y, incY);
return c;
}