forked from skystar0227/CUMP
-
Notifications
You must be signed in to change notification settings - Fork 0
/
cump-impl.h
132 lines (96 loc) · 3.55 KB
/
cump-impl.h
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
123
124
125
126
127
128
129
130
131
132
/* Include file for internal CUMP types, definitions and inlines.
THE CONTENTS OF THIS FILE ARE FOR INTERNAL USE AND ARE ALMOST CERTAIN TO
BE SUBJECT TO INCOMPATIBLE CHANGES IN FUTURE CUMP RELEASES.
Copyright 2012 Takatoshi Nakayama.
This file is part of the CUMP Library.
The CUMP Library is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation; either version 3 of the License, or (at your
option) any later version.
The CUMP Library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
You should have received a copy of the GNU Lesser General Public License
along with the CUMP Library. If not, see http://www.gnu.org/licenses/. */
#ifndef CUMP_IMPL_H_
#include "include/cump/def.h"
#define __CUMP_EXTERN_INLINE static inline
#define CUMP_LIMB_BYTES (sizeof (cump_limb_t))
extern void* (*__cump_allocate_func) (size_t);
extern void* (*__cump_allocate_2D_func) (size_t*, size_t, size_t);
extern void* (*__cump_reallocate_func) (void*, size_t, size_t);
extern void (*__cump_free_func) (void*, size_t);
extern void (*__cump_memcpy_func) (void*, void const *, size_t);
extern void (*__cump_memcpy_h2d_func) (void*, void const *, size_t);
extern void (*__cump_memcpy_d2h_func) (void*, void const *, size_t);
extern void (*__cump_memcpy_d2d_func) (void*, void const *, size_t);
extern void (*__cump_memcpy_2D_func) (void*, size_t, void const *, size_t, size_t, size_t);
extern void (*__cump_memcpy_2D_h2d_func) (void*, size_t, void const *, size_t, size_t, size_t);
extern void (*__cump_memcpy_2D_d2h_func) (void*, size_t, void const *, size_t, size_t, size_t);
extern void (*__cump_memcpy_2D_d2d_func) (void*, size_t, void const *, size_t, size_t, size_t);
extern cump_size_t __cump_host_default_fp_limb_precision;
#if defined (__cplusplus)
extern "C"
{
#endif
__CUMP_EXTERN_INLINE void __cumpf_get_header (cumpf_header *h, cumpf_srcptr p)
{
(*__cump_memcpy_d2h_func) (h, p->_dev, sizeof (*h));
}
__CUMP_EXTERN_INLINE cump_size_t __cumpf_get_prec (cumpf_srcptr p)
{
cump_int32 prec;
(*__cump_memcpy_d2h_func) (&prec, p->_dev, sizeof (prec));
return prec;
}
__CUMP_EXTERN_INLINE void __cumpf_init (cumpf_ptr r, cump_size_t prec)
{
cumpf_header hd;
hd._mp_exp = 0;
hd._mp_size = 0;
hd._mp_prec = prec;
r->_dev = (*__cump_allocate_func) (__CUMPF_ALLOCSIZE (prec));
(*__cump_memcpy_h2d_func) (r->_dev, &hd, sizeof (hd));
}
__CUMP_EXTERN_INLINE cump_size_t __cumpf_array_get_prec (cumpf_array_srcptr p)
{
cump_int32 prec;
(*__cump_memcpy_d2h_func) (&prec, p->_dev, sizeof (prec));
return prec;
}
void __cumpf_array_init (cumpf_array_ptr, cump_uint32, cump_size_t);
__CUMP_EXTERN_INLINE
void CUMPN_COPY_FROM_ARRAY (cump_ptr dst, char const *src, size_t p, cump_size_t n)
{
if (n)
{
cump_limb_t x = *(cump_srcptr) src;
while (--n)
{
*dst++ = x;
x = *(cump_srcptr) (src += p);
}
*dst++ = x;
}
}
__CUMP_EXTERN_INLINE
void CUMPN_COPY_TO_ARRAY (char *dst, size_t p, cump_srcptr src, cump_size_t n)
{
if (n)
{
cump_limb_t x = *src++;
while (--n)
{
*(cump_ptr) dst = x;
dst += p;
x = *src++;
}
*(cump_ptr) dst = x;
}
}
#if defined (__cplusplus)
} /* extern "C" */
#endif
#define CUMP_IMPL_H_
#endif