File Coverage

Float128.xs
Criterion Covered Total %
statement 1586 1796 88.3
branch 976 2116 46.1
condition n/a
subroutine n/a
pod n/a
total 2562 3912 65.4


line stmt bran cond sub pod time code
1              
2             #ifdef __MINGW32__
3             #ifndef __USE_MINGW_ANSI_STDIO
4             #define __USE_MINGW_ANSI_STDIO 1
5             #endif
6             #endif
7              
8             #define PERL_NO_GET_CONTEXT 1
9              
10             #include "EXTERN.h"
11             #include "perl.h"
12             #include "XSUB.h"
13              
14              
15             #include "math_float128_include.h"
16              
17             int nnum = 0;
18              
19             int nok_pok = 0; /* flag that is incremented whenever a scalar that is both
20             NOK and POK is passed to new or an overloaded operator */
21              
22 0           int NOK_POK_val(pTHX) {
23             /* return the numeric value of $Math::MPFR::NOK_POK */
24 0 0         return SvIV(get_sv("Math::Float128::NOK_POK", 0));
25             }
26              
27 0           int _win32_infnanstring(char * s) { /* MS Windows only - detect 1.#INF and 1.#IND
28             * Need to do this to correctly handle a scalar
29             * that is both NOK and POK on older win32 perls */
30              
31             /*************************************
32             * if input string =~ /^\-1\.#INF$/ return -1
33             * elsif input string =~ /^\+?1\.#INF$/i return 1
34             * elsif input string =~ /^(\-|\+)?1\.#IND$/i return 2
35             * else return 0
36             **************************************/
37              
38             #ifdef _WIN32_BIZARRE_INFNAN
39              
40             int sign = 1;
41             int factor = 1;
42              
43             if(s[0] == '-') {
44             sign = -1;
45             s++;
46             }
47             else {
48             if(s[0] == '+') s++;
49             }
50              
51             if(!strcmp(s, "1.#INF")) return sign;
52             if(!strcmp(s, "1.#IND")) return 2;
53              
54             return 0;
55             #else
56 0           croak("Math::Float128::_win32_infnanstring not implemented for this build of perl");
57             #endif
58             }
59              
60 3           void flt128_set_prec(pTHX_ int x) {
61 3 100         if(x < 1)croak("1st arg (precision) to flt128_set_prec must be at least 1");
62 2           _DIGITS = x;
63 2           }
64              
65 4           int flt128_get_prec(void) {
66 4           return _DIGITS;
67             }
68              
69 21           int _is_nan(float128 x) {
70 21 100         if(x != x) return 1;
71 11           return 0;
72             }
73              
74 6           int _is_inf(float128 x) {
75 6 50         if(x != x) return 0; /* NaN */
76 6 50         if(x == 0.0Q) return 0; /* Zero */
77 6 50         if(x/x != x/x) {
78 6 100         if(x < 0.0Q) return -1;
79 3           else return 1;
80             }
81 0           return 0; /* Finite Real */
82             }
83              
84             /* Replaced */
85             /*
86             //int _is_zero(float128 x) {
87             // char * buffer;
88             //
89             // if(x != 0.0Q) return 0;
90             //
91             // Newx(buffer, 2, char);
92             //
93             // quadmath_snprintf(buffer, sizeof buffer, "%.0Qf", x);
94             //
95             // if(!strcmp(buffer, "-0")) {
96             // Safefree(buffer);
97             // return -1;
98             // }
99             //
100             // Safefree(buffer);
101             // return 1;
102             //}
103             */
104              
105 17           int _is_zero(float128 x) {
106              
107 17           int n = sizeof(float128);
108 17           void * p = &x;
109              
110 17 100         if(x != 0.0Q) return 0;
111              
112             #ifdef WE_HAVE_BENDIAN /* Big Endian architecture */
113             if(((unsigned char*)p)[0] >= 128) return -1;
114             #else
115 13 100         if(((unsigned char*)p)[n - 1] >= 128) return -1;
116             #endif
117 7           return 1;
118             }
119              
120 46           float128 _get_inf(int sign) {
121             float128 ret;
122 46           ret = FLT128_MAX * 2.0Q;
123 46 100         if(sign < 0) ret *= -1.0Q;
124 46           return ret;
125             }
126              
127 30           float128 _get_nan(void) {
128 30           float128 inf = _get_inf(1);
129 30           return inf / inf;
130             }
131              
132 16           SV * InfF128(pTHX_ int sign) {
133             float128 * f;
134             SV * obj_ref, * obj;
135              
136 16           Newx(f, 1, float128);
137 16 50         if(f == NULL) croak("Failed to allocate memory in InfF128 function");
138              
139 16           obj_ref = newSV(0);
140 16           obj = newSVrv(obj_ref, "Math::Float128");
141              
142 16           *f = _get_inf(sign);
143              
144 16           sv_setiv(obj, INT2PTR(IV,f));
145 16           SvREADONLY_on(obj);
146 16           return obj_ref;
147             }
148              
149 30           SV * NaNF128(pTHX) {
150             float128 * f;
151             SV * obj_ref, * obj;
152              
153 30           Newx(f, 1, float128);
154 30 50         if(f == NULL) croak("Failed to allocate memory in NaNF128 function");
155              
156 30           obj_ref = newSV(0);
157 30           obj = newSVrv(obj_ref, "Math::Float128");
158              
159 30           *f = _get_nan();
160              
161 30           sv_setiv(obj, INT2PTR(IV,f));
162 30           SvREADONLY_on(obj);
163 30           return obj_ref;
164             }
165              
166 23           SV * ZeroF128(pTHX_ int sign) {
167             float128 * f;
168             SV * obj_ref, * obj;
169              
170 23           Newx(f, 1, float128);
171 23 50         if(f == NULL) croak("Failed to allocate memory in ZeroF128 function");
172              
173 23           obj_ref = newSV(0);
174 23           obj = newSVrv(obj_ref, "Math::Float128");
175              
176 23           *f = 0.0Q;
177 23 100         if(sign < 0) *f *= -1;
178              
179 23           sv_setiv(obj, INT2PTR(IV,f));
180 23           SvREADONLY_on(obj);
181 23           return obj_ref;
182             }
183              
184 39           SV * UnityF128(pTHX_ int sign) {
185             float128 * f;
186             SV * obj_ref, * obj;
187              
188 39           Newx(f, 1, float128);
189 39 50         if(f == NULL) croak("Failed to allocate memory in UnityF128 function");
190              
191 39           obj_ref = newSV(0);
192 39           obj = newSVrv(obj_ref, "Math::Float128");
193              
194 39           *f = 1.0Q;
195 39 100         if(sign < 0) *f *= -1;
196              
197 39           sv_setiv(obj, INT2PTR(IV,f));
198 39           SvREADONLY_on(obj);
199 39           return obj_ref;
200             }
201              
202 11           SV * is_NaNF128(pTHX_ SV * b) {
203 11 50         if(sv_isobject(b)) {
204 11 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
205 11 50         if(strEQ(h, "Math::Float128"))
206 11           return newSViv(_is_nan(*(INT2PTR(float128 *, SvIVX(SvRV(b))))));
207             }
208 0           croak("Invalid argument supplied to Math::Float128::isNaNF128 function");
209             }
210              
211 6           SV * is_InfF128(pTHX_ SV * b) {
212 6 50         if(sv_isobject(b)) {
213 6 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
214 6 50         if(strEQ(h, "Math::Float128"))
215 6           return newSViv(_is_inf(*(INT2PTR(float128 *, SvIVX(SvRV(b))))));
216             }
217 0           croak("Invalid argument supplied to Math::Float128::is_InfF128 function");
218             }
219              
220 17           SV * is_ZeroF128(pTHX_ SV * b) {
221 17 50         if(sv_isobject(b)) {
222 17 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
223 17 50         if(strEQ(h, "Math::Float128"))
224 17           return newSViv(_is_zero(*(INT2PTR(float128 *, SvIVX(SvRV(b))))));
225             }
226 0           croak("Invalid argument supplied to Math::Float128::is_ZeroF128 function");
227             }
228              
229              
230 291           void _nnum_inc (char * p) {
231 291           int i = 0;
232 1           for(;;i++) {
233 292 100         if(p[i] == 0) break;
234 8 100         if(p[i] != ' ' && p[i] != '\t' && p[i] != '\n' && p[i] != '\r' && p[i] != '\f') {
    50          
    50          
    50          
    50          
235 7           nnum++;
236 7           break;
237             }
238 1           }
239 291           }
240              
241 160           SV * STRtoF128(pTHX_ SV * str) {
242             float128 * f;
243             SV * obj_ref, * obj;
244             char * p;
245 160           int inf_or_nan = 0;
246              
247 160           Newx(f, 1, float128);
248 160 50         if(f == NULL) croak("Failed to allocate memory in STRtoF128 function");
249              
250 160           obj_ref = newSV(0);
251 160           obj = newSVrv(obj_ref, "Math::Float128");
252              
253             #ifdef _WIN32_BIZARRE_INFNAN
254             inf_or_nan = _win32_infnanstring(SvPV_nolen(str));
255             if(inf_or_nan) {
256             if(inf_or_nan == 2) *f = _get_nan();
257             else *f = _get_inf(inf_or_nan);
258             }
259             else *f = strtoflt128(SvPV_nolen(str), &p);
260             #else
261 160 100         *f = strtoflt128(SvPV_nolen(str), &p);
262             #endif
263              
264 160 50         if(!inf_or_nan) _nnum_inc(p);
265              
266 160           sv_setiv(obj, INT2PTR(IV,f));
267 160           SvREADONLY_on(obj);
268 160           return obj_ref;
269             }
270              
271 1           void fromSTR(pTHX_ float128 * f, SV * str) {
272             char * p;
273 1           int inf_or_nan = 0;
274              
275             #ifdef _WIN32_BIZARRE_INFNAN
276             inf_or_nan = _win32_infnanstring(SvPV_nolen(str));
277             if(inf_or_nan) {
278             if(inf_or_nan == 2) *f = _get_nan();
279             else *f = _get_inf(inf_or_nan);
280             }
281             else *f = strtoflt128(SvPV_nolen(str), &p);
282             #else
283 1 50         *f = strtoflt128(SvPV_nolen(str), &p);
284             #endif
285              
286 1 50         if(!inf_or_nan) _nnum_inc(p);
287              
288 1           }
289              
290 216           SV * NVtoF128(pTHX_ SV * nv) {
291             float128 * f;
292             SV * obj_ref, * obj;
293              
294 216           Newx(f, 1, float128);
295 216 50         if(f == NULL) croak("Failed to allocate memory in NVtoF128 function");
296              
297 216           obj_ref = newSV(0);
298 216           obj = newSVrv(obj_ref, "Math::Float128");
299              
300 216 100         *f = (float128)SvNV(nv);
301              
302 216           sv_setiv(obj, INT2PTR(IV,f));
303 216           SvREADONLY_on(obj);
304 216           return obj_ref;
305             }
306              
307 1           void fromNV(pTHX_ float128 * f, SV * nv) {
308 1 50         *f = (float128)SvNV(nv);
309 1           }
310              
311 160           SV * IVtoF128(pTHX_ SV * iv) {
312             float128 * f;
313             SV * obj_ref, * obj;
314              
315 160           Newx(f, 1, float128);
316 160 50         if(f == NULL) croak("Failed to allocate memory in IVtoF128 function");
317              
318 160           obj_ref = newSV(0);
319 160           obj = newSVrv(obj_ref, "Math::Float128");
320              
321 160 50         *f = (float128)SvIV(iv);
322              
323 160           sv_setiv(obj, INT2PTR(IV,f));
324 160           SvREADONLY_on(obj);
325 160           return obj_ref;
326             }
327              
328 1           void fromIV(pTHX_ float128 * f, SV * iv) {
329 1 50         *f = (float128)SvIV(iv);
330 1           }
331              
332 37           SV * UVtoF128(pTHX_ SV * uv) {
333             float128 * f;
334             SV * obj_ref, * obj;
335              
336 37           Newx(f, 1, float128);
337 37 50         if(f == NULL) croak("Failed to allocate memory in UVtoF128 function");
338              
339 37           obj_ref = newSV(0);
340 37           obj = newSVrv(obj_ref, "Math::Float128");
341              
342 37 100         *f = (float128)SvUV(uv);
343              
344 37           sv_setiv(obj, INT2PTR(IV,f));
345 37           SvREADONLY_on(obj);
346 37           return obj_ref;
347             }
348              
349 1           void fromUV(pTHX_ float128 * f,SV * uv) {
350 1 50         *f = (float128)SvUV(uv);
351 1           }
352              
353 3           void F128toSTR(pTHX_ SV * f) {
354 3           dXSARGS;
355             float128 t;
356             char * buffer;
357              
358 3 50         if(sv_isobject(f)) {
359 3 50         const char *h = HvNAME(SvSTASH(SvRV(f)));
    50          
    50          
    0          
    50          
    50          
360 3 50         if(strEQ(h, "Math::Float128")) {
361 3 50         EXTEND(SP, 1);
362 3           t = *(INT2PTR(float128 *, SvIVX(SvRV(f))));
363              
364 3           Newx(buffer, 15 + _DIGITS, char);
365 3 50         if(buffer == NULL) croak("Failed to allocate memory in F128toSTR");
366 3           quadmath_snprintf(buffer, 15 + _DIGITS, "%.*Qe", _DIGITS - 1, t);
367 3           ST(0) = sv_2mortal(newSVpv(buffer, 0));
368 3           Safefree(buffer);
369 3           XSRETURN(1);
370             }
371 0           else croak("Invalid object supplied to Math::Float128::F128toSTR function");
372             }
373 0           else croak("Invalid argument supplied to Math::Float128::F128toSTR function");
374             }
375              
376 2           void F128toSTRP(pTHX_ SV * f, int decimal_prec) {
377 2           dXSARGS;
378             float128 t;
379             char * buffer;
380              
381 2 100         if(decimal_prec < 1)croak("2nd arg (precision) to F128toSTRP must be at least 1");
382              
383 1 50         if(sv_isobject(f)) {
384 1 50         const char *h = HvNAME(SvSTASH(SvRV(f)));
    50          
    50          
    0          
    50          
    50          
385 1 50         if(strEQ(h, "Math::Float128")) {
386 1 50         EXTEND(SP, 1);
387 1           t = *(INT2PTR(float128 *, SvIVX(SvRV(f))));
388              
389 1           Newx(buffer, 12 + decimal_prec, char);
390 1 50         if(buffer == NULL) croak("Failed to allocate memory in F128toSTRP");
391 1           quadmath_snprintf(buffer, 12 + decimal_prec, "%.*Qe", decimal_prec - 1, t);
392 1           ST(0) = sv_2mortal(newSVpv(buffer, 0));
393 1           Safefree(buffer);
394 1           XSRETURN(1);
395             }
396 0           else croak("Invalid object supplied to Math::Float128::F128toSTRP function");
397             }
398 0           else croak("Invalid argument supplied to Math::Float128::F128toSTRP function");
399             }
400              
401 1098           void DESTROY(pTHX_ SV * f) {
402 1098           Safefree(INT2PTR(float128 *, SvIVX(SvRV(f))));
403 1098           }
404              
405 0           SV * _LDBL_DIG(pTHX) {
406             #ifdef LDBL_DIG
407 0           return newSViv(LDBL_DIG);
408             #else
409             croak("LDBL_DIG not implemented");
410             #endif
411             }
412              
413 0           SV * _DBL_DIG(pTHX) {
414             #ifdef DBL_DIG
415 0           return newSViv(DBL_DIG);
416             #else
417             croak("DBL_DIG not implemented");
418             #endif
419             }
420              
421 2           SV * _FLT128_DIG(pTHX) {
422             #ifdef FLT128_DIG
423 2           return newSViv(FLT128_DIG);
424             #else
425             croak("FLT128_DIG not implemented");
426             #endif
427             }
428              
429 82           SV * _overload_add(pTHX_ SV * a, SV * b, SV * third) {
430              
431             float128 * ld;
432             SV * obj_ref, * obj;
433              
434 82           Newx(ld, 1, float128);
435 82 50         if(ld == NULL) croak("Failed to allocate memory in _overload_add function");
436              
437 82           obj_ref = newSV(0);
438 82           obj = newSVrv(obj_ref, "Math::Float128");
439              
440 82           sv_setiv(obj, INT2PTR(IV,ld));
441 82           SvREADONLY_on(obj);
442              
443 82 100         if(SvUOK(b)) {
444 1           *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) + (float128)SvUVX(b);
445 1           return obj_ref;
446             }
447              
448 81 100         if(SvIOK(b)) {
449 5           *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) + (float128)SvIVX(b);
450 5           return obj_ref;
451             }
452              
453             #if defined(F128_PV_NV_BUG)
454             if( (SvPOK(b) && !SvNOK(b))
455             ||
456             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
457             #else
458 76 100         if(SvPOK(b)) {
459             #endif
460             char *p;
461             #ifdef _WIN32_BIZARRE_INFNAN
462             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
463             #endif
464              
465 5 100         NOK_POK_DUALVAR_CHECK , "overload_add");}
    50          
    50          
466              
467             #ifdef _WIN32_BIZARRE_INFNAN
468             if(inf_or_nan) {
469             if(inf_or_nan == 2) *ld = _get_nan();
470             else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) + _get_inf(inf_or_nan);
471             }
472             else {
473             *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) + strtoflt128(SvPV_nolen(b), &p);
474             _nnum_inc(p);
475             }
476             #else
477 5 50         *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) + strtoflt128(SvPV_nolen(b), &p);
478 5           _nnum_inc(p);
479             #endif
480 5           return obj_ref;
481             }
482              
483 71 100         if(SvNOK(b)) {
484              
485             #if defined(F128_PV_NV_BUG)
486             NOK_POK_DUALVAR_CHECK , "overload_add");}
487             #endif
488              
489             #if defined(AVOID_INF_CAST)
490             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
491             *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) + _get_inf(SvNVX(b) > 0 ? 1 : -1);
492             return obj_ref;
493             }
494             #endif
495 40           *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) + (float128)SvNVX(b);
496 40           return obj_ref;
497             }
498              
499 31 50         if(sv_isobject(b)) {
500 31 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
501 31 50         if(strEQ(h, "Math::Float128")) {
502 31           *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) + *(INT2PTR(float128 *, SvIVX(SvRV(b))));
503 31           return obj_ref;
504             }
505 0           croak("Invalid object supplied to Math::Float128::_overload_add function");
506             }
507              
508 0           croak("Invalid argument supplied to Math::Float128::_overload_add function");
509             }
510              
511 17           SV * _overload_mul(pTHX_ SV * a, SV * b, SV * third) {
512              
513             float128 * ld;
514             SV * obj_ref, * obj;
515              
516 17           Newx(ld, 1, float128);
517 17 50         if(ld == NULL) croak("Failed to allocate memory in _overload_mul function");
518              
519 17           obj_ref = newSV(0);
520 17           obj = newSVrv(obj_ref, "Math::Float128");
521              
522 17           sv_setiv(obj, INT2PTR(IV,ld));
523 17           SvREADONLY_on(obj);
524              
525 17 100         if(SvUOK(b)) {
526 1           *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) * (float128)SvUVX(b);
527 1           return obj_ref;
528             }
529              
530 16 100         if(SvIOK(b)) {
531 3           *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) * (float128)SvIVX(b);
532 3           return obj_ref;
533             }
534              
535             #if defined(F128_PV_NV_BUG)
536             if( (SvPOK(b) && !SvNOK(b))
537             ||
538             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
539             #else
540 13 100         if(SvPOK(b)) {
541             #endif
542             char * p;
543             #ifdef _WIN32_BIZARRE_INFNAN
544             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
545             #endif
546              
547 5 100         NOK_POK_DUALVAR_CHECK , "overload_mul");}
    50          
    50          
548              
549             #ifdef _WIN32_BIZARRE_INFNAN
550             if(inf_or_nan) {
551             if(inf_or_nan == 2) *ld = _get_nan();
552             else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) * _get_inf(inf_or_nan);
553             }
554             else {
555             *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) * strtoflt128(SvPV_nolen(b), &p);
556             _nnum_inc(p);
557             }
558             #else
559 5 50         *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) * strtoflt128(SvPV_nolen(b), &p);
560 5           _nnum_inc(p);
561             #endif
562 5           return obj_ref;
563             }
564              
565 8 100         if(SvNOK(b)) {
566              
567             #if defined(F128_PV_NV_BUG)
568             NOK_POK_DUALVAR_CHECK , "overload_mul");}
569             #endif
570              
571             #if defined(AVOID_INF_CAST)
572             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
573             *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) * _get_inf(SvNVX(b) > 0 ? 1 : -1);
574             return obj_ref;
575             }
576             #endif
577 5           *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) * (float128)SvNVX(b);
578 5           return obj_ref;
579             }
580              
581 3 50         if(sv_isobject(b)) {
582 3 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
583 3 50         if(strEQ(h, "Math::Float128")) {
584 3           *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) * *(INT2PTR(float128 *, SvIVX(SvRV(b))));
585 3           return obj_ref;
586             }
587 0           croak("Invalid object supplied to Math::Float128::_overload_mul function");
588             }
589 0           croak("Invalid argument supplied to Math::Float128::_overload_mul function");
590             }
591              
592 146           SV * _overload_sub(pTHX_ SV * a, SV * b, SV * third) {
593             float128 * ld;
594             SV * obj_ref, * obj;
595              
596 146           Newx(ld, 1, float128);
597 146 50         if(ld == NULL) croak("Failed to allocate memory in _overload_sub function");
598              
599 146           obj_ref = newSV(0);
600 146           obj = newSVrv(obj_ref, "Math::Float128");
601              
602 146           sv_setiv(obj, INT2PTR(IV,ld));
603 146           SvREADONLY_on(obj);
604              
605 146 100         if(SvUOK(b)) {
606 2 50         if(SWITCH_ARGS) *ld = (float128)SvUVX(b) - *(INT2PTR(float128 *, SvIVX(SvRV(a))));
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
607 1           else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) - (float128)SvUVX(b);
608 2           return obj_ref;
609             }
610              
611 144 100         if(SvIOK(b)) {
612 23 50         if(SWITCH_ARGS) *ld = (float128)SvIVX(b) - *(INT2PTR(float128 *, SvIVX(SvRV(a))));
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
613 10           else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) - (float128)SvIVX(b);
614 23           return obj_ref;
615             }
616              
617             #if defined(F128_PV_NV_BUG)
618             if( (SvPOK(b) && !SvNOK(b))
619             ||
620             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
621             #else
622 121 100         if(SvPOK(b)) {
623             #endif
624             char * p;
625             #ifdef _WIN32_BIZARRE_INFNAN
626             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
627             #endif
628              
629 9 100         NOK_POK_DUALVAR_CHECK , "overload_sub");}
    50          
    50          
630              
631             #ifdef _WIN32_BIZARRE_INFNAN
632             if(inf_or_nan) {
633             if(inf_or_nan == 2) *ld = _get_nan();
634             else {
635             if(SWITCH_ARGS) *ld = _get_inf(inf_or_nan) - *(INT2PTR(float128 *, SvIVX(SvRV(a))));
636             else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) - _get_inf(inf_or_nan);
637             }
638             }
639             else {
640             if(SWITCH_ARGS) *ld = strtoflt128(SvPV_nolen(b), &p) - *(INT2PTR(float128 *, SvIVX(SvRV(a))));
641             else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) - strtoflt128(SvPV_nolen(b), &p);
642             _nnum_inc(p);
643             }
644             #else
645 9 50         if(SWITCH_ARGS) *ld = strtoflt128(SvPV_nolen(b), &p) - *(INT2PTR(float128 *, SvIVX(SvRV(a))));
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
    50          
646 8 50         else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) - strtoflt128(SvPV_nolen(b), &p);
647 9           _nnum_inc(p);
648             #endif
649 9           return obj_ref;
650             }
651              
652 112 100         if(SvNOK(b)) {
653              
654             #if defined(F128_PV_NV_BUG)
655             NOK_POK_DUALVAR_CHECK , "overload_sub");}
656             #endif
657              
658             #if defined(AVOID_INF_CAST)
659             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
660             if(SWITCH_ARGS) *ld = _get_inf(SvNVX(b) > 0 ? 1 : -1) - *(INT2PTR(float128 *, SvIVX(SvRV(a))));
661             else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) - _get_inf(SvNVX(b) > 0 ? 1 : -1);
662             return obj_ref;
663             }
664             #endif
665 33 50         if(SWITCH_ARGS) *ld = (float128)SvNVX(b) - *(INT2PTR(float128 *, SvIVX(SvRV(a))));
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
666 32           else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) - (float128)SvNVX(b);
667 33           return obj_ref;
668             }
669              
670 79 50         if(sv_isobject(b)) {
671 79 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
672 79 50         if(strEQ(h, "Math::Float128")) {
673 79           *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) - *(INT2PTR(float128 *, SvIVX(SvRV(b))));
674 79           return obj_ref;
675             }
676 0           croak("Invalid object supplied to Math::Float128::_overload_sub function");
677             }
678              
679             /*
680             else {
681             if(SWITCH_ARGS) {
682             *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) * -1.0L;
683             return obj_ref;
684             }
685             }
686             */
687              
688 0           croak("Invalid argument supplied to Math::Float128::_overload_sub function");
689              
690             }
691              
692 22           SV * _overload_div(pTHX_ SV * a, SV * b, SV * third) {
693             float128 * ld;
694             SV * obj_ref, * obj;
695              
696 22           Newx(ld, 1, float128);
697 22 50         if(ld == NULL) croak("Failed to allocate memory in _overload_div function");
698              
699 22           obj_ref = newSV(0);
700 22           obj = newSVrv(obj_ref, "Math::Float128");
701              
702 22           sv_setiv(obj, INT2PTR(IV,ld));
703 22           SvREADONLY_on(obj);
704              
705 22 100         if(SvUOK(b)) {
706 2 50         if(SWITCH_ARGS) *ld = (float128)SvUVX(b) / *(INT2PTR(float128 *, SvIVX(SvRV(a))));
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
707 1           else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) / (float128)SvUVX(b);
708 2           return obj_ref;
709             }
710              
711 20 100         if(SvIOK(b)) {
712 4 50         if(SWITCH_ARGS) *ld = (float128)SvIVX(b) / *(INT2PTR(float128 *, SvIVX(SvRV(a))));
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
713 2           else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) / (float128)SvIVX(b);
714 4           return obj_ref;
715             }
716              
717             #if defined(F128_PV_NV_BUG)
718             if( (SvPOK(b) && !SvNOK(b))
719             ||
720             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
721             #else
722 16 100         if(SvPOK(b)) {
723             #endif
724             char * p;
725             #ifdef _WIN32_BIZARRE_INFNAN
726             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
727             #endif
728              
729 6 100         NOK_POK_DUALVAR_CHECK , "overload_div");}
    50          
    50          
730              
731             #ifdef _WIN32_BIZARRE_INFNAN
732             if(inf_or_nan) {
733             if(inf_or_nan == 2) *ld = _get_nan();
734             else {
735             if(SWITCH_ARGS) *ld = _get_inf(inf_or_nan) / *(INT2PTR(float128 *, SvIVX(SvRV(a))));
736             else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) / _get_inf(inf_or_nan);
737             }
738             }
739             else {
740             if(SWITCH_ARGS) *ld = strtoflt128(SvPV_nolen(b), &p) / *(INT2PTR(float128 *, SvIVX(SvRV(a))));
741             else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) / strtoflt128(SvPV_nolen(b), &p);
742             _nnum_inc(p);
743             }
744             #else
745 6 50         if(SWITCH_ARGS) *ld = strtoflt128(SvPV_nolen(b), &p) / *(INT2PTR(float128 *, SvIVX(SvRV(a))));
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
    50          
746 5 50         else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) / strtoflt128(SvPV_nolen(b), &p);
747 6           _nnum_inc(p);
748             #endif
749 6           return obj_ref;
750             }
751              
752 10 100         if(SvNOK(b)) {
753              
754             #if defined(F128_PV_NV_BUG)
755             NOK_POK_DUALVAR_CHECK , "overload_div");}
756             #endif
757              
758             #if defined(AVOID_INF_CAST)
759             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
760             if(SWITCH_ARGS) *ld = _get_inf(SvNVX(b) > 0 ? 1 : -1) / *(INT2PTR(float128 *, SvIVX(SvRV(a))));
761             else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) / _get_inf(SvNVX(b) > 0 ? 1 : -1);
762             return obj_ref;
763             }
764             #endif
765 7 50         if(SWITCH_ARGS) *ld = (float128)SvNVX(b) / *(INT2PTR(float128 *, SvIVX(SvRV(a))));
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
766 6           else *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) / (float128)SvNVX(b);
767 7           return obj_ref;
768             }
769              
770 3 50         if(sv_isobject(b)) {
771 3 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
772 3 50         if(strEQ(h, "Math::Float128")) {
773 3           *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a)))) / *(INT2PTR(float128 *, SvIVX(SvRV(b))));
774 3           return obj_ref;
775             }
776 0           croak("Invalid object supplied to Math::Float128::_overload_div function");
777             }
778 0           croak("Invalid argument supplied to Math::Float128::_overload_div function");
779             }
780              
781 204           SV * _overload_equiv(pTHX_ SV * a, SV * b, SV * third) {
782              
783 204 100         if(SvUOK(b)) {
784 10 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == (float128)SvUVX(b)) return newSViv(1);
785 0           return newSViv(0);
786             }
787              
788 194 100         if(SvIOK(b)) {
789 51 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == (float128)SvIVX(b)) return newSViv(1);
790 0           return newSViv(0);
791             }
792              
793             #if defined(F128_PV_NV_BUG)
794             if( (SvPOK(b) && !SvNOK(b))
795             ||
796             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
797             #else
798 143 100         if(SvPOK(b)) {
799             #endif
800             char * p;
801             #ifdef _WIN32_BIZARRE_INFNAN
802             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
803             #endif
804              
805 19 100         NOK_POK_DUALVAR_CHECK , "overload_equiv");}
    50          
    50          
806              
807             #ifdef _WIN32_BIZARRE_INFNAN
808             if(inf_or_nan) {
809             if(inf_or_nan == 2) return newSViv(0);
810             else {
811             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == _get_inf(inf_or_nan)) return newSViv(1);
812             return newSViv(0);
813             }
814             }
815             else {
816             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == strtoflt128(SvPV_nolen(b), &p)) {
817             _nnum_inc(p);
818             return newSViv(1);
819             }
820             _nnum_inc(p);
821             return newSViv(0);
822             }
823             #else
824 19 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == strtoflt128(SvPV_nolen(b), &p)) {
    100          
825 15           _nnum_inc(p);
826 15           return newSViv(1);
827             }
828 4           _nnum_inc(p);
829 19           return newSViv(0);
830             #endif
831             }
832              
833 124 100         if(SvNOK(b)) {
834              
835             #if defined(F128_PV_NV_BUG)
836             NOK_POK_DUALVAR_CHECK , "overload_equiv");}
837             #endif
838              
839             #if defined(AVOID_INF_CAST)
840             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
841             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == _get_inf(SvNVX(b) > 0 ? 1 : -1))
842             return newSViv(1);
843             return newSViv(0);
844             }
845             #endif
846 25 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == (float128)SvNVX(b)) return newSViv(1);
847 6           return newSViv(0);
848             }
849              
850 99 50         if(sv_isobject(b)) {
851 99 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
852 99 50         if(strEQ(h, "Math::Float128")) {
853 99 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == *(INT2PTR(float128 *, SvIVX(SvRV(b))))) return newSViv(1);
854 0           return newSViv(0);
855             }
856 0           croak("Invalid object supplied to Math::Float128::_overload_equiv function");
857             }
858 0           croak("Invalid argument supplied to Math::Float128::_overload_equiv function");
859             }
860              
861 28           SV * _overload_not_equiv(pTHX_ SV * a, SV * b, SV * third) {
862              
863 28 100         if(SvUOK(b)) {
864 2 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) != (float128)SvUVX(b)) return newSViv(1);
865 0           return newSViv(0);
866             }
867              
868 26 100         if(SvIOK(b)) {
869 2 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) != (float128)SvIVX(b)) return newSViv(1);
870 0           return newSViv(0);
871             }
872              
873             #if defined(F128_PV_NV_BUG)
874             if( (SvPOK(b) && !SvNOK(b))
875             ||
876             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
877             #else
878 24 100         if(SvPOK(b)) {
879             #endif
880             char * p;
881             #ifdef _WIN32_BIZARRE_INFNAN
882             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
883             #endif
884              
885 7 100         NOK_POK_DUALVAR_CHECK , "overload_not_equiv");}
    50          
    50          
886              
887             #ifdef _WIN32_BIZARRE_INFNAN
888             if(inf_or_nan) {
889             if(inf_or_nan == 2) return newSViv(1);
890             else {
891             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) != _get_inf(inf_or_nan)) return newSViv(1);
892             return newSViv(0);
893             }
894             }
895             else {
896             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) != strtoflt128(SvPV_nolen(b), &p)) {
897             _nnum_inc(p);
898             return newSViv(1);
899             }
900             _nnum_inc(p);
901             return newSViv(0);
902             }
903             #else
904              
905 7 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) != strtoflt128(SvPV_nolen(b), &p)) {
    100          
906 6           _nnum_inc(p);
907 6           return newSViv(1);
908             }
909 1           _nnum_inc(p);
910 7           return newSViv(0);
911             #endif
912             }
913              
914 17 100         if(SvNOK(b)) {
915              
916             #if defined(F128_PV_NV_BUG)
917             NOK_POK_DUALVAR_CHECK , "overload_not_equiv");}
918             #endif
919              
920             #if defined(AVOID_INF_CAST)
921             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
922             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) != _get_inf(SvNVX(b) > 0 ? 1 : -1))
923             return newSViv(1);
924             return newSViv(0);
925             }
926             #endif
927 9 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) != (float128)SvNVX(b)) return newSViv(1);
928 0           return newSViv(0);
929             }
930              
931 8 50         if(sv_isobject(b)) {
932 8 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
933 8 50         if(strEQ(h, "Math::Float128")) {
934 8 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == *(INT2PTR(float128 *, SvIVX(SvRV(b))))) return newSViv(0);
935 8           return newSViv(1);
936             }
937 0           croak("Invalid object supplied to Math::Float128::_overload_not_equiv function");
938             }
939 0           croak("Invalid argument supplied to Math::Float128::_overload_not_equiv function");
940             }
941              
942 4           SV * _overload_true(pTHX_ SV * a, SV * b, SV * third) {
943              
944 4 100         if(_is_nan(*(INT2PTR(float128 *, SvIVX(SvRV(a)))))) return newSViv(0);
945 3 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) != 0.0Q) return newSViv(1);
946 1           return newSViv(0);
947             }
948              
949 6           SV * _overload_not(pTHX_ SV * a, SV * b, SV * third) {
950 6 100         if(_is_nan(*(INT2PTR(float128 *, SvIVX(SvRV(a)))))) return newSViv(1);
951 5 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) != 0.0L) return newSViv(0);
952 3           return newSViv(1);
953             }
954              
955 16           SV * _overload_add_eq(pTHX_ SV * a, SV * b, SV * third) {
956              
957 16           SvREFCNT_inc(a);
958              
959 16 100         if(SvUOK(b)) {
960 1           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) += (float128)SvUVX(b);
961 1           return a;
962             }
963              
964 15 100         if(SvIOK(b)) {
965 1           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) += (float128)SvIVX(b);
966 1           return a;
967             }
968              
969             #if defined(F128_PV_NV_BUG)
970             if( (SvPOK(b) && !SvNOK(b))
971             ||
972             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
973             #else
974 14 100         if(SvPOK(b)) {
975             #endif
976             char * p;
977             #ifdef _WIN32_BIZARRE_INFNAN
978             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
979             #endif
980              
981 5 100         NOK_POK_DUALVAR_CHECK , "overload_add_eq");}
    50          
    50          
982              
983             #ifdef _WIN32_BIZARRE_INFNAN
984              
985             if(inf_or_nan) {
986             if(inf_or_nan == 2) {
987             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = _get_nan();
988             return a;
989             }
990              
991             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) += _get_inf(inf_or_nan);
992             return a;
993             }
994              
995             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) += strtoflt128(SvPV_nolen(b), &p);
996             _nnum_inc(p);
997             return a;
998             #else
999              
1000 5 50         *(INT2PTR(float128 *, SvIVX(SvRV(a)))) += strtoflt128(SvPV_nolen(b), &p);
1001 5           _nnum_inc(p);
1002 5           return a;
1003             #endif
1004             }
1005              
1006 9 100         if(SvNOK(b)) {
1007              
1008             #if defined(F128_PV_NV_BUG)
1009             NOK_POK_DUALVAR_CHECK , "overload_");}
1010             #endif
1011              
1012             #if defined(AVOID_INF_CAST)
1013             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
1014             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) += _get_inf(SvNVX(b) > 0 ? 1 : -1);
1015             return a;
1016             }
1017             #endif
1018 4           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) += (float128)SvNVX(b);
1019 4           return a;
1020             }
1021              
1022 5 50         if(sv_isobject(b)) {
1023 5 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
1024 5 50         if(strEQ(h, "Math::Float128")) {
1025 5           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) += *(INT2PTR(float128 *, SvIVX(SvRV(b))));
1026 5           return a;
1027             }
1028 0           SvREFCNT_dec(a);
1029 0           croak("Invalid object supplied to Math::Float128::_overload_add_eq function");
1030             }
1031 0           SvREFCNT_dec(a);
1032 0           croak("Invalid argument supplied to Math::Float128::_overload_add_eq function");
1033             }
1034              
1035 15           SV * _overload_mul_eq(pTHX_ SV * a, SV * b, SV * third) {
1036              
1037 15           SvREFCNT_inc(a);
1038              
1039 15 100         if(SvUOK(b)) {
1040 1           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) *= (float128)SvUVX(b);
1041 1           return a;
1042             }
1043              
1044 14 100         if(SvIOK(b)) {
1045 1           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) *= (float128)SvIVX(b);
1046 1           return a;
1047             }
1048              
1049             #if defined(F128_PV_NV_BUG)
1050             if( (SvPOK(b) && !SvNOK(b))
1051             ||
1052             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
1053             #else
1054 13 100         if(SvPOK(b)) {
1055             #endif
1056             char * p;
1057             #ifdef _WIN32_BIZARRE_INFNAN
1058             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
1059             #endif
1060              
1061 6 100         NOK_POK_DUALVAR_CHECK , "overload_mul_eq");}
    50          
    50          
1062              
1063             #ifdef _WIN32_BIZARRE_INFNAN
1064              
1065             if(inf_or_nan) {
1066             if(inf_or_nan == 2) {
1067             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = _get_nan();
1068             return a;
1069             }
1070              
1071             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) *= _get_inf(inf_or_nan);
1072             return a;
1073             }
1074              
1075             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) *= strtoflt128(SvPV_nolen(b), &p);
1076             _nnum_inc(p);
1077             return a;
1078             #else
1079              
1080 6 50         *(INT2PTR(float128 *, SvIVX(SvRV(a)))) *= strtoflt128(SvPV_nolen(b), &p);
1081 6           _nnum_inc(p);
1082 6           return a;
1083             #endif
1084             }
1085              
1086 7 100         if(SvNOK(b)) {
1087              
1088             #if defined(F128_PV_NV_BUG)
1089             NOK_POK_DUALVAR_CHECK , "overload_mul_eq");}
1090             #endif
1091              
1092             #if defined(AVOID_INF_CAST)
1093             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
1094             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) *= _get_inf(SvNVX(b) > 0 ? 1 : -1);
1095             return a;
1096             }
1097             #endif
1098 4           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) *= (float128)SvNVX(b);
1099 4           return a;
1100             }
1101              
1102 3 50         if(sv_isobject(b)) {
1103 3 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
1104 3 50         if(strEQ(h, "Math::Float128")) {
1105 3           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) *= *(INT2PTR(float128 *, SvIVX(SvRV(b))));
1106 3           return a;
1107             }
1108 0           SvREFCNT_dec(a);
1109 0           croak("Invalid object supplied to Math::Float128::_overload_mul_eq function");
1110             }
1111 0           SvREFCNT_dec(a);
1112 0           croak("Invalid argument supplied to Math::Float128::_overload_mul_eq function");
1113             }
1114              
1115 13           SV * _overload_sub_eq(pTHX_ SV * a, SV * b, SV * third) {
1116              
1117 13           SvREFCNT_inc(a);
1118              
1119 13 100         if(SvUOK(b)) {
1120 1           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) -= (float128)SvUVX(b);
1121 1           return a;
1122             }
1123              
1124 12 100         if(SvIOK(b)) {
1125 1           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) -= (float128)SvIVX(b);
1126 1           return a;
1127             }
1128              
1129             #if defined(F128_PV_NV_BUG)
1130             if( (SvPOK(b) && !SvNOK(b))
1131             ||
1132             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
1133             #else
1134 11 100         if(SvPOK(b)) {
1135             #endif
1136             char * p;
1137             #ifdef _WIN32_BIZARRE_INFNAN
1138             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
1139             #endif
1140              
1141 5 100         NOK_POK_DUALVAR_CHECK , "overload_sub_eq");}
    50          
    50          
1142              
1143             #ifdef _WIN32_BIZARRE_INFNAN
1144              
1145             if(inf_or_nan) {
1146             if(inf_or_nan == 2) {
1147             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = _get_nan();
1148             return a;
1149             }
1150              
1151             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) -= _get_inf(inf_or_nan);
1152             return a;
1153             }
1154              
1155             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) -= strtoflt128(SvPV_nolen(b), &p);
1156             _nnum_inc(p);
1157             return a;
1158             #else
1159              
1160 5 50         *(INT2PTR(float128 *, SvIVX(SvRV(a)))) -= strtoflt128(SvPV_nolen(b), &p);
1161 5           _nnum_inc(p);
1162 5           return a;
1163             #endif
1164             }
1165              
1166              
1167 6 100         if(SvNOK(b)) {
1168              
1169             #if defined(F128_PV_NV_BUG)
1170             NOK_POK_DUALVAR_CHECK , "overload_sub_eq");}
1171             #endif
1172              
1173             #if defined(AVOID_INF_CAST)
1174             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
1175             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) -= _get_inf(SvNVX(b) > 0 ? 1 : -1);
1176             return a;
1177             }
1178             #endif
1179 4           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) -= (float128)SvNVX(b);
1180 4           return a;
1181             }
1182              
1183 2 50         if(sv_isobject(b)) {
1184 2 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
1185 2 50         if(strEQ(h, "Math::Float128")) {
1186 2           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) -= *(INT2PTR(float128 *, SvIVX(SvRV(b))));
1187 2           return a;
1188             }
1189 0           SvREFCNT_dec(a);
1190 0           croak("Invalid object supplied to Math::Float128::_overload_sub_eq function");
1191             }
1192 0           SvREFCNT_dec(a);
1193 0           croak("Invalid argument supplied to Math::Float128::_overload_sub_eq function");
1194             }
1195              
1196 13           SV * _overload_div_eq(pTHX_ SV * a, SV * b, SV * third) {
1197              
1198 13           SvREFCNT_inc(a);
1199              
1200 13 100         if(SvUOK(b)) {
1201 1           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) /= (float128)SvUVX(b);
1202 1           return a;
1203             }
1204              
1205 12 100         if(SvIOK(b)) {
1206 1           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) /= (float128)SvIVX(b);
1207 1           return a;
1208             }
1209              
1210             #if defined(F128_PV_NV_BUG)
1211             if( (SvPOK(b) && !SvNOK(b))
1212             ||
1213             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
1214             #else
1215 11 100         if(SvPOK(b)) {
1216             #endif
1217             char * p;
1218             #ifdef _WIN32_BIZARRE_INFNAN
1219             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
1220             #endif
1221              
1222 5 100         NOK_POK_DUALVAR_CHECK , "overload_div_eq");}
    50          
    50          
1223              
1224             #ifdef _WIN32_BIZARRE_INFNAN
1225              
1226             if(inf_or_nan) {
1227             if(inf_or_nan == 2) {
1228             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = _get_nan();
1229             return a;
1230             }
1231              
1232             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) /= _get_inf(inf_or_nan);
1233             return a;
1234             }
1235              
1236             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) /= strtoflt128(SvPV_nolen(b), &p);
1237             _nnum_inc(p);
1238             return a;
1239             #else
1240              
1241 5 50         *(INT2PTR(float128 *, SvIVX(SvRV(a)))) /= strtoflt128(SvPV_nolen(b), &p);
1242 5           _nnum_inc(p);
1243 5           return a;
1244             #endif
1245             }
1246              
1247 6 100         if(SvNOK(b)) {
1248              
1249             #if defined(F128_PV_NV_BUG)
1250             NOK_POK_DUALVAR_CHECK , "overload_div_eq");}
1251             #endif
1252              
1253             #if defined(AVOID_INF_CAST)
1254             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
1255             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) /= _get_inf(SvNVX(b) > 0 ? 1 : -1);
1256             return a;
1257             }
1258             #endif
1259 4           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) /= (float128)SvNVX(b);
1260 4           return a;
1261             }
1262              
1263 2 50         if(sv_isobject(b)) {
1264 2 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
1265 2 50         if(strEQ(h, "Math::Float128")) {
1266 2           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) /= *(INT2PTR(float128 *, SvIVX(SvRV(b))));
1267 2           return a;
1268             }
1269 0           SvREFCNT_dec(a);
1270 0           croak("Invalid object supplied to Math::Float128::_overload_div_eq function");
1271             }
1272 0           SvREFCNT_dec(a);
1273 0           croak("Invalid argument supplied to Math::Float128::_overload_div_eq function");
1274             }
1275              
1276 46           SV * _overload_lt(pTHX_ SV * a, SV * b, SV * third) {
1277              
1278 46 100         if(SvUOK(b)) {
1279 2 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1280 1 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > (float128)SvUVX(b)) return newSViv(1);
1281 0           return newSViv(0);
1282             }
1283 1 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < (float128)SvUVX(b)) return newSViv(1);
1284 0           return newSViv(0);
1285             }
1286              
1287 44 100         if(SvIOK(b)) {
1288 8 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1289 2 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > (float128)SvIVX(b)) return newSViv(1);
1290 0           return newSViv(0);
1291             }
1292 6 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < (float128)SvIVX(b)) return newSViv(1);
1293 0           return newSViv(0);
1294             }
1295              
1296             #if defined(F128_PV_NV_BUG)
1297             if( (SvPOK(b) && !SvNOK(b))
1298             ||
1299             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
1300             #else
1301 36 100         if(SvPOK(b)) {
1302             #endif
1303             char * p;
1304             #ifdef _WIN32_BIZARRE_INFNAN
1305             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
1306             #endif
1307              
1308 11 100         NOK_POK_DUALVAR_CHECK , "overload_lt");}
    50          
    50          
1309              
1310             #ifdef _WIN32_BIZARRE_INFNAN
1311             if(inf_or_nan) {
1312             if(inf_or_nan == 2) return newSViv(0);
1313             if(SWITCH_ARGS) {
1314             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > _get_inf(inf_or_nan)) return newSViv(1);
1315             return newSViv(0);
1316             }
1317             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < _get_inf(inf_or_nan)) return newSViv(1);
1318             return newSViv(0);
1319             }
1320             if(SWITCH_ARGS) {
1321             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > strtoflt128(SvPV_nolen(b), &p)) {
1322             _nnum_inc(p);
1323             return newSViv(1);
1324             }
1325             _nnum_inc(p);
1326             return newSViv(0);
1327             }
1328              
1329             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < strtoflt128(SvPV_nolen(b), &p)) {
1330             _nnum_inc(p);
1331             return newSViv(1);
1332             }
1333             _nnum_inc(p);
1334             return newSViv(0);
1335             #else
1336              
1337 11 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1338 1 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > strtoflt128(SvPV_nolen(b), &p)) {
    50          
1339 1           _nnum_inc(p);
1340 1           return newSViv(1);
1341             }
1342 0           _nnum_inc(p);
1343 0           return newSViv(0);
1344             }
1345              
1346 10 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < strtoflt128(SvPV_nolen(b), &p)) {
    100          
1347 8           _nnum_inc(p);
1348 8           return newSViv(1);
1349             }
1350 2           _nnum_inc(p);
1351 11           return newSViv(0);
1352             #endif
1353             }
1354              
1355 25 100         if(SvNOK(b)) {
1356              
1357             #if defined(F128_PV_NV_BUG)
1358             NOK_POK_DUALVAR_CHECK , "overload_lt");}
1359             #endif
1360              
1361             #if defined(AVOID_INF_CAST)
1362             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
1363             if(SWITCH_ARGS) {
1364             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > _get_inf(SvNVX(b) > 0 ? 1 : -1))
1365             return newSViv(1);
1366             return newSViv(0);
1367             }
1368             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < _get_inf(SvNVX(b) > 0 ? 1 : -1))
1369             return newSViv(1);
1370             return newSViv(0);
1371             }
1372             #endif
1373 21 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1374 2 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > (float128)SvNVX(b)) return newSViv(1);
1375 1           return newSViv(0);
1376             }
1377 19 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < (float128)SvNVX(b)) return newSViv(1);
1378 4           return newSViv(0);
1379             }
1380              
1381 4 50         if(sv_isobject(b)) {
1382 4 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
1383 4 50         if(strEQ(h, "Math::Float128")) {
1384 4 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < *(INT2PTR(float128 *, SvIVX(SvRV(b))))) return newSViv(1);
1385 0           return newSViv(0);
1386             }
1387 0           croak("Invalid object supplied to Math::Float128::_overload_lt function");
1388             }
1389 0           croak("Invalid argument supplied to Math::Float128::_overload_lt function");
1390             }
1391              
1392 81           SV * _overload_gt(pTHX_ SV * a, SV * b, SV * third) {
1393              
1394 81 100         if(SvUOK(b)) {
1395 2 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1396 1 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < (float128)SvUVX(b)) return newSViv(1);
1397 0           return newSViv(0);
1398             }
1399 1 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > (float128)SvUVX(b)) return newSViv(1);
1400 0           return newSViv(0);
1401             }
1402              
1403 79 100         if(SvIOK(b)) {
1404 12 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1405 2 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < (float128)SvIVX(b)) return newSViv(1);
1406 0           return newSViv(0);
1407             }
1408 10 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > (float128)SvIVX(b)) return newSViv(1);
1409 0           return newSViv(0);
1410             }
1411              
1412             #if defined(F128_PV_NV_BUG)
1413             if( (SvPOK(b) && !SvNOK(b))
1414             ||
1415             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
1416             #else
1417 67 100         if(SvPOK(b)) {
1418             #endif
1419             char * p;
1420             #ifdef _WIN32_BIZARRE_INFNAN
1421             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
1422             #endif
1423              
1424 11 100         NOK_POK_DUALVAR_CHECK , "overload_gt");}
    50          
    50          
1425              
1426             #ifdef _WIN32_BIZARRE_INFNAN
1427             if(inf_or_nan) {
1428             if(inf_or_nan == 2) return newSViv(0);
1429             if(SWITCH_ARGS) {
1430             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < _get_inf(inf_or_nan)) return newSViv(1);
1431             return newSViv(0);
1432             }
1433             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > _get_inf(inf_or_nan)) return newSViv(1);
1434             return newSViv(0);
1435             }
1436             if(SWITCH_ARGS) {
1437             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < strtoflt128(SvPV_nolen(b), &p)) {
1438             _nnum_inc(p);
1439             return newSViv(1);
1440             }
1441             _nnum_inc(p);
1442             return newSViv(0);
1443             }
1444              
1445             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > strtoflt128(SvPV_nolen(b), &p)) {
1446             _nnum_inc(p);
1447             return newSViv(1);
1448             }
1449             _nnum_inc(p);
1450             return newSViv(0);
1451             #else
1452 11 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1453 1 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < strtoflt128(SvPV_nolen(b), &p)) {
    50          
1454 1           _nnum_inc(p);
1455 1           return newSViv(1);
1456             }
1457 0           _nnum_inc(p);
1458 0           return newSViv(0);
1459             }
1460              
1461 10 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > strtoflt128(SvPV_nolen(b), &p)) {
    100          
1462 6           _nnum_inc(p);
1463 6           return newSViv(1);
1464             }
1465 4           _nnum_inc(p);
1466 11           return newSViv(0);
1467             #endif
1468             }
1469              
1470 56 100         if(SvNOK(b)) {
1471              
1472             #if defined(F128_PV_NV_BUG)
1473             NOK_POK_DUALVAR_CHECK , "overload_gt");}
1474             #endif
1475              
1476             #if defined(AVOID_INF_CAST)
1477             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
1478             if(SWITCH_ARGS) {
1479             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < _get_inf(SvNVX(b) > 0 ? 1 : -1))
1480             return newSViv(1);
1481             return newSViv(0);
1482             }
1483             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > _get_inf(SvNVX(b) > 0 ? 1 : -1))
1484             return newSViv(1);
1485             return newSViv(0);
1486             }
1487             #endif
1488 16 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1489 2 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < (float128)SvNVX(b)) return newSViv(1);
1490 1           return newSViv(0);
1491             }
1492 14 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > (float128)SvNVX(b)) return newSViv(1);
1493 3           return newSViv(0);
1494             }
1495              
1496 40 50         if(sv_isobject(b)) {
1497 40 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
1498 40 50         if(strEQ(h, "Math::Float128")) {
1499 40 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > *(INT2PTR(float128 *, SvIVX(SvRV(b))))) return newSViv(1);
1500 36           return newSViv(0);
1501             }
1502 0           croak("Invalid object supplied to Math::Float128::_overload_gt function");
1503             }
1504 0           croak("Invalid argument supplied to Math::Float128::_overload_gt function");
1505             }
1506              
1507 40           SV * _overload_lte(pTHX_ SV * a, SV * b, SV * third) {
1508              
1509 40 100         if(SvUOK(b)) {
1510 4 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1511 2 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= (float128)SvUVX(b)) return newSViv(1);
1512 0           return newSViv(0);
1513             }
1514 2 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= (float128)SvUVX(b)) return newSViv(1);
1515 0           return newSViv(0);
1516             }
1517              
1518 36 100         if(SvIOK(b)) {
1519 6 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1520 3 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= (float128)SvIVX(b)) return newSViv(1);
1521 0           return newSViv(0);
1522             }
1523 3 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= (float128)SvIVX(b)) return newSViv(1);
1524 0           return newSViv(0);
1525             }
1526              
1527             #if defined(F128_PV_NV_BUG)
1528             if( (SvPOK(b) && !SvNOK(b))
1529             ||
1530             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
1531             #else
1532 30 100         if(SvPOK(b)) {
1533             #endif
1534             char * p;
1535             #ifdef _WIN32_BIZARRE_INFNAN
1536             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
1537             #endif
1538              
1539 9 100         NOK_POK_DUALVAR_CHECK , "overload_lte");}
    50          
    50          
1540              
1541             #ifdef _WIN32_BIZARRE_INFNAN
1542             if(inf_or_nan) {
1543             if(inf_or_nan == 2) return newSViv(0);
1544             if(SWITCH_ARGS) {
1545             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= _get_inf(inf_or_nan)) return newSViv(1);
1546             return newSViv(0);
1547             }
1548             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= _get_inf(inf_or_nan)) return newSViv(1);
1549             return newSViv(0);
1550             }
1551             if(SWITCH_ARGS) {
1552             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= strtoflt128(SvPV_nolen(b), &p)) {
1553             _nnum_inc(p);
1554             return newSViv(1);
1555             }
1556             _nnum_inc(p);
1557             return newSViv(0);
1558             }
1559              
1560             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= strtoflt128(SvPV_nolen(b), &p)) {
1561             _nnum_inc(p);
1562             return newSViv(1);
1563             }
1564             _nnum_inc(p);
1565             return newSViv(0);
1566             #else
1567 9 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1568 2 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= strtoflt128(SvPV_nolen(b), &p)) {
    50          
1569 2           _nnum_inc(p);
1570 2           return newSViv(1);
1571             }
1572 0           _nnum_inc(p);
1573 0           return newSViv(0);
1574             }
1575 7 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= strtoflt128(SvPV_nolen(b), &p)) {
    100          
1576 5           _nnum_inc(p);
1577 5           return newSViv(1);
1578             }
1579 2           _nnum_inc(p);
1580 9           return newSViv(0);
1581             #endif
1582             }
1583              
1584 21 100         if(SvNOK(b)) {
1585              
1586             #if defined(F128_PV_NV_BUG)
1587             NOK_POK_DUALVAR_CHECK , "overload_lte");}
1588             #endif
1589              
1590             #if defined(AVOID_INF_CAST)
1591             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
1592             if(SWITCH_ARGS) {
1593             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= _get_inf(SvNVX(b) > 0 ? 1 : -1))
1594             return newSViv(1);
1595             return newSViv(0);
1596             }
1597             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= _get_inf(SvNVX(b) > 0 ? 1 : -1))
1598             return newSViv(1);
1599             return newSViv(0);
1600             }
1601             #endif
1602 12 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1603 3 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= (float128)SvNVX(b)) return newSViv(1);
1604 1           return newSViv(0);
1605             }
1606 9 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= (float128)SvNVX(b)) return newSViv(1);
1607 4           return newSViv(0);
1608             }
1609              
1610 9 50         if(sv_isobject(b)) {
1611 9 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
1612 9 50         if(strEQ(h, "Math::Float128")) {
1613 9 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= *(INT2PTR(float128 *, SvIVX(SvRV(b))))) return newSViv(1);
1614 0           return newSViv(0);
1615             }
1616 0           croak("Invalid object supplied to Math::Float128::_overload_lte function");
1617             }
1618 0           croak("Invalid argument supplied to Math::Float128::_overload_lte function");
1619             }
1620              
1621 37           SV * _overload_gte(pTHX_ SV * a, SV * b, SV * third) {
1622              
1623 37 100         if(SvUOK(b)) {
1624 4 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1625 2 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= (float128)SvUVX(b)) return newSViv(1);
1626 0           return newSViv(0);
1627             }
1628 2 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= (float128)SvUVX(b)) return newSViv(1);
1629 0           return newSViv(0);
1630             }
1631              
1632 33 100         if(SvIOK(b)) {
1633 6 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1634 3 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= (float128)SvIVX(b)) return newSViv(1);
1635 0           return newSViv(0);
1636             }
1637 3 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= (float128)SvIVX(b)) return newSViv(1);
1638 0           return newSViv(0);
1639             }
1640              
1641             #if defined(F128_PV_NV_BUG)
1642             if( (SvPOK(b) && !SvNOK(b))
1643             ||
1644             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
1645             #else
1646 27 100         if(SvPOK(b)) {
1647             #endif
1648             char * p;
1649             #ifdef _WIN32_BIZARRE_INFNAN
1650             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
1651             #endif
1652              
1653 9 100         NOK_POK_DUALVAR_CHECK , "overload_gte");}
    50          
    50          
1654              
1655             #ifdef _WIN32_BIZARRE_INFNAN
1656             if(inf_or_nan) {
1657             if(inf_or_nan == 2) return newSViv(0);
1658             if(SWITCH_ARGS) {
1659             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= _get_inf(inf_or_nan)) return newSViv(1);
1660             return newSViv(0);
1661             }
1662             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= _get_inf(inf_or_nan)) return newSViv(1);
1663             return newSViv(0);
1664             }
1665             if(SWITCH_ARGS) {
1666             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= strtoflt128(SvPV_nolen(b), &p)) {
1667             _nnum_inc(p);
1668             return newSViv(1);
1669             }
1670             _nnum_inc(p);
1671             return newSViv(0);
1672             }
1673              
1674             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= strtoflt128(SvPV_nolen(b), &p)) {
1675             _nnum_inc(p);
1676             return newSViv(1);
1677             }
1678             _nnum_inc(p);
1679             return newSViv(0);
1680             #else
1681              
1682 9 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1683 2 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= strtoflt128(SvPV_nolen(b), &p)) {
    50          
1684 2           _nnum_inc(p);
1685 2           return newSViv(1);
1686             }
1687 0           _nnum_inc(p);
1688 0           return newSViv(0);
1689             }
1690              
1691 7 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= strtoflt128(SvPV_nolen(b), &p)) {
    100          
1692 3           _nnum_inc(p);
1693 3           return newSViv(1);
1694             }
1695 4           _nnum_inc(p);
1696 9           return newSViv(0);
1697             #endif
1698             }
1699              
1700              
1701 18 100         if(SvNOK(b)) {
1702              
1703             #if defined(F128_PV_NV_BUG)
1704             NOK_POK_DUALVAR_CHECK , "overload_gte");}
1705             #endif
1706              
1707             #if defined(AVOID_INF_CAST)
1708             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
1709             if(SWITCH_ARGS) {
1710             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= _get_inf(SvNVX(b) > 0 ? 1 : -1))
1711             return newSViv(1);
1712             return newSViv(0);
1713             }
1714             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= _get_inf(SvNVX(b) > 0 ? 1 : -1))
1715             return newSViv(1);
1716             return newSViv(0);
1717             }
1718             #endif
1719 12 50         if(SWITCH_ARGS) {
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1720 3 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) <= (float128)SvNVX(b)) return newSViv(1);
1721 1           return newSViv(0);
1722             }
1723 9 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= (float128)SvNVX(b)) return newSViv(1);
1724 3           return newSViv(0);
1725             }
1726              
1727 6 50         if(sv_isobject(b)) {
1728 6 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
1729 6 50         if(strEQ(h, "Math::Float128")) {
1730 6 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) >= *(INT2PTR(float128 *, SvIVX(SvRV(b))))) return newSViv(1);
1731 0           return newSViv(0);
1732             }
1733 0           croak("Invalid object supplied to Math::Float128::_overload_gte function");
1734             }
1735 0           croak("Invalid argument supplied to Math::Float128::_overload_gte function");
1736             }
1737              
1738 65           SV * _overload_spaceship(pTHX_ SV * a, SV * b, SV * third) {
1739 65           int reversal = 1;
1740 65 50         if(SWITCH_ARGS) reversal = -1;
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
1741              
1742 65 100         if(SvUOK(b)) {
1743 10 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == (float128)SvUVX(b)) return newSViv( 0 * reversal);
1744 6 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < (float128)SvUVX(b)) return newSViv(-1 * reversal);
1745 4 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > (float128)SvUVX(b)) return newSViv( 1 * reversal);
1746 2           return &PL_sv_undef; /* it's a nan */
1747             }
1748              
1749 55 100         if(SvIOK(b)) {
1750 12 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == (float128)SvIVX(b)) return newSViv( 0);
1751 8 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < (float128)SvIVX(b)) return newSViv(-1 * reversal);
1752 4 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > (float128)SvIVX(b)) return newSViv( 1 * reversal);
1753 2           return &PL_sv_undef; /* it's a nan */
1754             }
1755              
1756             #if defined(F128_PV_NV_BUG)
1757             if( (SvPOK(b) && !SvNOK(b))
1758             ||
1759             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
1760             #else
1761 43 100         if(SvPOK(b)) {
1762             #endif
1763             char *p;
1764             #ifdef _WIN32_BIZARRE_INFNAN
1765             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
1766             #endif
1767              
1768 15 100         NOK_POK_DUALVAR_CHECK , "overload_spaceship");}
    50          
    50          
1769              
1770             #ifdef _WIN32_BIZARRE_INFNAN
1771              
1772             if(inf_or_nan) {
1773             if(inf_or_nan == 2) return &PL_sv_undef;
1774             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == _get_inf(inf_or_nan))
1775             return newSViv(0);
1776             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < _get_inf(inf_or_nan))
1777             return newSViv(-1 * reversal);
1778             return newSViv(reversal);
1779             }
1780              
1781             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == strtoflt128(SvPV_nolen(b), &p)) {
1782             _nnum_inc(p);
1783             return newSViv( 0);
1784             }
1785             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < strtoflt128(SvPV_nolen(b), &p)) {
1786             _nnum_inc(p);
1787             return newSViv(-1 * reversal);
1788             }
1789             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > strtoflt128(SvPV_nolen(b), &p)) {
1790             _nnum_inc(p);
1791             return newSViv(reversal);
1792             }
1793             return &PL_sv_undef; /* it's a nan */
1794             #else
1795 15 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == strtoflt128(SvPV_nolen(b), &p)) {
    100          
1796 4           _nnum_inc(p);
1797 4           return newSViv( 0);
1798             }
1799 11 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < strtoflt128(SvPV_nolen(b), &p)) {
    100          
1800 5           _nnum_inc(p);
1801 5           return newSViv(-1 * reversal);
1802             }
1803 6 50         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > strtoflt128(SvPV_nolen(b), &p)) {
    100          
1804 3           _nnum_inc(p);
1805 3           return newSViv(reversal);
1806             }
1807 15           return &PL_sv_undef; /* it's a nan */
1808             #endif
1809             }
1810              
1811 28 100         if(SvNOK(b)) {
1812              
1813             #if defined(F128_PV_NV_BUG)
1814             NOK_POK_DUALVAR_CHECK , "overload_spaceship");}
1815             #endif
1816              
1817             #if defined(AVOID_INF_CAST)
1818             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
1819             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == _get_inf(SvNVX(b) > 0 ? 1 : -1))
1820             return newSViv(0);
1821             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < _get_inf(SvNVX(b) > 0 ? 1 : -1))
1822             return newSViv(-1 * reversal);
1823             if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > _get_inf(SvNVX(b) > 0 ? 1 : -1))
1824             return newSViv(reversal);
1825             }
1826             #endif
1827 15 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == (float128)SvNVX(b)) return newSViv( 0);
1828 11 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < (float128)SvNVX(b)) return newSViv(-1 * reversal);
1829 8 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > (float128)SvNVX(b)) return newSViv(reversal);
1830 5           return &PL_sv_undef; /* it's a nan */
1831             }
1832              
1833 13 50         if(sv_isobject(b)) {
1834 13 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
1835 13 50         if(strEQ(h, "Math::Float128")) {
1836 13 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) < *(INT2PTR(float128 *, SvIVX(SvRV(b))))) return newSViv(-1);
1837 10 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) > *(INT2PTR(float128 *, SvIVX(SvRV(b))))) return newSViv(1);
1838 7 100         if(*(INT2PTR(float128 *, SvIVX(SvRV(a)))) == *(INT2PTR(float128 *, SvIVX(SvRV(b))))) return newSViv(0);
1839 2           return &PL_sv_undef; /* it's a nan */
1840             }
1841 0           croak("Invalid object supplied to Math::Float128::_overload_spaceship function");
1842             }
1843 0           croak("Invalid argument supplied to Math::Float128::_overload_spaceship function");
1844             }
1845              
1846 1           SV * _overload_copy(pTHX_ SV * a, SV * b, SV * third) {
1847              
1848             float128 * ld;
1849             SV * obj_ref, * obj;
1850              
1851 1           Newx(ld, 1, float128);
1852 1 50         if(ld == NULL) croak("Failed to allocate memory in _overload_copy function");
1853              
1854 1           *ld = *(INT2PTR(float128 *, SvIVX(SvRV(a))));
1855              
1856 1           obj_ref = newSV(0);
1857 1           obj = newSVrv(obj_ref, "Math::Float128");
1858 1           sv_setiv(obj, INT2PTR(IV,ld));
1859 1           SvREADONLY_on(obj);
1860 1           return obj_ref;
1861             }
1862              
1863 27           SV * F128toF128(pTHX_ SV * a) {
1864             float128 * f;
1865             SV * obj_ref, * obj;
1866              
1867 27 50         if(sv_isobject(a)) {
1868 27 50         const char *h = HvNAME(SvSTASH(SvRV(a)));
    50          
    50          
    0          
    50          
    50          
1869 27 50         if(strEQ(h, "Math::Float128")) {
1870              
1871 27           Newx(f, 1, float128);
1872 27 50         if(f == NULL) croak("Failed to allocate memory in F128toF128 function");
1873              
1874 27           *f = *(INT2PTR(float128 *, SvIVX(SvRV(a))));
1875              
1876 27           obj_ref = newSV(0);
1877 27           obj = newSVrv(obj_ref, "Math::Float128");
1878 27           sv_setiv(obj, INT2PTR(IV,f));
1879 27           SvREADONLY_on(obj);
1880 27           return obj_ref;
1881             }
1882 0           croak("Invalid object supplied to Math::Float128::F128toF128 function");
1883             }
1884 0           croak("Invalid argument supplied to Math::Float128::F128toF128 function");
1885             }
1886              
1887 1           void fromF128(pTHX_ float128 * f, SV * a) {
1888              
1889 1 50         if(sv_isobject(a)) {
1890 1 50         const char *h = HvNAME(SvSTASH(SvRV(a)));
    50          
    50          
    0          
    50          
    50          
1891 1 50         if(strEQ(h, "Math::Float128")) {
1892              
1893 1           *f = *(INT2PTR(float128 *, SvIVX(SvRV(a))));
1894             }
1895 1           else croak("Invalid object supplied to Math::Float128::fromF128 function");
1896             }
1897 0           else croak("Invalid argument supplied to Math::Float128::fromF128 function");
1898 1           }
1899              
1900 449           SV * _itsa(pTHX_ SV * a) {
1901 449 100         if(SvUOK(a)) return newSVuv(1);
1902 423 100         if(SvIOK(a)) return newSVuv(2);
1903              
1904 273 100         if(SvPOK(a)) {
1905             #if defined(F128_PV_NV_BUG) /* perl can set the POK flag when it should not */
1906             if(SvNOK(a) && !SvIOKp(a))
1907             return newSVuv(3); /* designate it as NV */
1908             #endif
1909 100           return newSVuv(4); /* designate it as PV */
1910             }
1911              
1912 173 100         if(SvNOK(a)) return newSVuv(3);
1913 29 50         if(sv_isobject(a)) {
1914 29 50         const char *h = HvNAME(SvSTASH(SvRV(a)));
    50          
    50          
    0          
    50          
    50          
1915 29 50         if(strEQ(h, "Math::Float128")) return newSVuv(113);
1916             }
1917 0           return newSVuv(0);
1918             }
1919              
1920 63           SV * _overload_abs(pTHX_ SV * a, SV * b, SV * third) {
1921              
1922             float128 * f;
1923             SV * obj_ref, * obj;
1924              
1925 63           Newx(f, 1, float128);
1926 63 50         if(f == NULL) croak("Failed to allocate memory in _overload_abs function");
1927              
1928 63           obj_ref = newSV(0);
1929 63           obj = newSVrv(obj_ref, "Math::Float128");
1930              
1931 63           sv_setiv(obj, INT2PTR(IV,f));
1932 63           SvREADONLY_on(obj);
1933              
1934 63           *f = fabsq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))));
1935 63           return obj_ref;
1936             }
1937              
1938 11           SV * _overload_int(pTHX_ SV * a, SV * b, SV * third) {
1939              
1940             float128 * f;
1941             SV * obj_ref, * obj;
1942              
1943 11           Newx(f, 1, float128);
1944 11 50         if(f == NULL) croak("Failed to allocate memory in _overload_int function");
1945              
1946 11           *f = *(INT2PTR(float128 *, SvIVX(SvRV(a))));
1947              
1948 11 100         if(*f < 0.0Q) *f = ceilq(*f);
1949 7           else *f = floorq(*f);
1950              
1951 11           obj_ref = newSV(0);
1952 11           obj = newSVrv(obj_ref, "Math::Float128");
1953 11           sv_setiv(obj, INT2PTR(IV,f));
1954 11           SvREADONLY_on(obj);
1955 11           return obj_ref;
1956             }
1957              
1958 4           SV * _overload_sqrt(pTHX_ SV * a, SV * b, SV * third) {
1959              
1960             float128 * f;
1961             SV * obj_ref, * obj;
1962              
1963 4           Newx(f, 1, float128);
1964 4 50         if(f == NULL) croak("Failed to allocate memory in _overload_sqrt function");
1965              
1966 4           *f = sqrtq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))));
1967              
1968 4           obj_ref = newSV(0);
1969 4           obj = newSVrv(obj_ref, "Math::Float128");
1970 4           sv_setiv(obj, INT2PTR(IV,f));
1971 4           SvREADONLY_on(obj);
1972 4           return obj_ref;
1973             }
1974              
1975 4           SV * _overload_log(pTHX_ SV * a, SV * b, SV * third) {
1976              
1977             float128 * f;
1978             SV * obj_ref, * obj;
1979              
1980 4           Newx(f, 1, float128);
1981 4 50         if(f == NULL) croak("Failed to allocate memory in _overload_log function");
1982              
1983 4           *f = logq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))));
1984              
1985              
1986 4           obj_ref = newSV(0);
1987 4           obj = newSVrv(obj_ref, "Math::Float128");
1988 4           sv_setiv(obj, INT2PTR(IV,f));
1989 4           SvREADONLY_on(obj);
1990 4           return obj_ref;
1991             }
1992              
1993 1           SV * _overload_exp(pTHX_ SV * a, SV * b, SV * third) {
1994              
1995             float128 * f;
1996             SV * obj_ref, * obj;
1997              
1998 1           Newx(f, 1, float128);
1999 1 50         if(f == NULL) croak("Failed to allocate memory in _overload_exp function");
2000              
2001             #if defined(__MINGW64_VERSION_MAJOR) && __MINGW64_VERSION_MAJOR < 4 /* avoid calling expq() as it's buggy */
2002             *f = powq(M_Eq, *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2003             #else
2004 1           *f = expq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2005             #endif
2006              
2007              
2008 1           obj_ref = newSV(0);
2009 1           obj = newSVrv(obj_ref, "Math::Float128");
2010 1           sv_setiv(obj, INT2PTR(IV,f));
2011 1           SvREADONLY_on(obj);
2012 1           return obj_ref;
2013             }
2014              
2015 1           SV * _overload_sin(pTHX_ SV * a, SV * b, SV * third) {
2016              
2017             float128 * f;
2018             SV * obj_ref, * obj;
2019              
2020 1           Newx(f, 1, float128);
2021 1 50         if(f == NULL) croak("Failed to allocate memory in _overload_sin function");
2022              
2023 1           *f = sinq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2024              
2025              
2026 1           obj_ref = newSV(0);
2027 1           obj = newSVrv(obj_ref, "Math::Float128");
2028 1           sv_setiv(obj, INT2PTR(IV,f));
2029 1           SvREADONLY_on(obj);
2030 1           return obj_ref;
2031             }
2032              
2033 1           SV * _overload_cos(pTHX_ SV * a, SV * b, SV * third) {
2034              
2035             float128 * f;
2036             SV * obj_ref, * obj;
2037              
2038 1           Newx(f, 1, float128);
2039 1 50         if(f == NULL) croak("Failed to allocate memory in _overload_cos function");
2040              
2041 1           *f = cosq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2042              
2043              
2044 1           obj_ref = newSV(0);
2045 1           obj = newSVrv(obj_ref, "Math::Float128");
2046 1           sv_setiv(obj, INT2PTR(IV,f));
2047 1           SvREADONLY_on(obj);
2048 1           return obj_ref;
2049             }
2050              
2051 4           SV * _overload_atan2(pTHX_ SV * a, SV * b, SV * third) {
2052              
2053             float128 * f;
2054             SV * obj_ref, * obj;
2055              
2056 4           Newx(f, 1, float128);
2057 4 50         if(f == NULL) croak("Failed to allocate memory in _overload_atan2 function");
2058              
2059 4           obj_ref = newSV(0);
2060 4           obj = newSVrv(obj_ref, "Math::Float128");
2061 4           sv_setiv(obj, INT2PTR(IV,f));
2062 4           SvREADONLY_on(obj);
2063              
2064 4 50         if(SvUOK(b)) {
2065 0 0         if(SWITCH_ARGS)
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
2066 0           *f = atan2q((float128)SvUVX(b), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2067 0           else *f = atan2q(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), (float128)SvUVX(b));
2068 0           return obj_ref;
2069             }
2070              
2071 4 50         if(SvIOK(b)) {
2072 0 0         if(SWITCH_ARGS)
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
    0          
2073 0           *f = atan2q((float128)SvIVX(b), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2074 0           else *f = atan2q(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), (float128)SvIVX(b));
2075 0           return obj_ref;
2076             }
2077              
2078             #if defined(F128_PV_NV_BUG)
2079             if( (SvPOK(b) && !SvNOK(b))
2080             ||
2081             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
2082             #else
2083 4 100         if(SvPOK(b)) {
2084             #endif
2085             char * p;
2086             #ifdef _WIN32_BIZARRE_INFNAN
2087             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
2088             #endif
2089              
2090 1 50         NOK_POK_DUALVAR_CHECK , "overload_atan2");}
    0          
    0          
2091              
2092             #ifdef _WIN32_BIZARRE_INFNAN
2093              
2094             if(inf_or_nan) {
2095             if(inf_or_nan == 2) {
2096             if(SWITCH_ARGS)
2097             *f = atan2q(_get_nan(), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2098             else *f = atan2q(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), _get_nan());
2099             }
2100             else {
2101             if(SWITCH_ARGS)
2102             *f = atan2q(_get_inf(inf_or_nan), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2103             else *f = atan2q(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), _get_inf(inf_or_nan));
2104             }
2105             }
2106             else {
2107             if(SWITCH_ARGS)
2108             *f = atan2q(strtoflt128(SvPV_nolen(b), &p), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2109             else *f = atan2q(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), strtoflt128(SvPV_nolen(b), &p));
2110             _nnum_inc(p);
2111             return obj_ref;
2112             }
2113             #else
2114 1 50         if(SWITCH_ARGS)
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
    50          
2115 1 50         *f = atan2q(strtoflt128(SvPV_nolen(b), &p), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2116 0 0         else *f = atan2q(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), strtoflt128(SvPV_nolen(b), &p));
2117 1           _nnum_inc(p);
2118 1           return obj_ref;
2119             #endif
2120             }
2121              
2122 3 100         if(SvNOK(b)) {
2123              
2124             #if defined(F128_PV_NV_BUG)
2125             NOK_POK_DUALVAR_CHECK , "overload_atan2");}
2126             #endif
2127              
2128             #if defined(AVOID_INF_CAST)
2129             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
2130             if(SWITCH_ARGS)
2131             *f = atan2q(_get_inf(SvNVX(b) > 0 ? 1 : -1), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2132             else *f = atan2q(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), _get_inf(SvNVX(b) > 0 ? 1 : -1));
2133             return obj_ref;
2134             }
2135             #endif
2136 1 50         if(SWITCH_ARGS)
    0          
    0          
    50          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
    0          
    50          
2137 0           *f = atan2q((float128)SvNVX(b), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2138 1           else *f = atan2q(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), (float128)SvNVX(b));
2139 1           return obj_ref;
2140             }
2141              
2142 2 50         if(sv_isobject(b)) {
2143 2 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
2144 2 50         if(strEQ(h, "Math::Float128")) {
2145 2           *f = atan2q(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), *(INT2PTR(float128 *, SvIVX(SvRV(b)))));
2146 2           return obj_ref;
2147             }
2148 0           croak("Invalid object supplied to Math::Float128::_overload_atan2 function");
2149             }
2150 0           croak("Invalid argument supplied to Math::Float128::_overload_atan2 function");
2151             }
2152              
2153 1           SV * _overload_inc(pTHX_ SV * a, SV * b, SV * third) {
2154              
2155 1           SvREFCNT_inc(a);
2156              
2157 1           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) += 1.0Q;
2158              
2159 1           return a;
2160             }
2161              
2162 1           SV * _overload_dec(pTHX_ SV * a, SV * b, SV * third) {
2163              
2164 1           SvREFCNT_inc(a);
2165              
2166 1           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) -= 1.0Q;
2167              
2168 1           return a;
2169             }
2170              
2171 16           SV * _overload_pow(pTHX_ SV * a, SV * b, SV * third) {
2172              
2173             float128 * f;
2174             SV * obj_ref, * obj;
2175              
2176 16           Newx(f, 1, float128);
2177 16 50         if(f == NULL) croak("Failed to allocate memory in _overload_pow function");
2178              
2179 16           obj_ref = newSV(0);
2180 16           obj = newSVrv(obj_ref, "Math::Float128");
2181 16           sv_setiv(obj, INT2PTR(IV,f));
2182 16           SvREADONLY_on(obj);
2183              
2184 16 100         if(SvUOK(b)) {
2185 2 50         if(SWITCH_ARGS)
    0          
    0          
    50          
    50          
    50          
    50          
    50          
    0          
    0          
    0          
    0          
    0          
    50          
2186 2           *f = powq((float128)SvUVX(b), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2187 0           else *f = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), (float128)SvUVX(b));
2188 2           return obj_ref;
2189             }
2190              
2191 14 100         if(SvIOK(b)) {
2192 5 50         if(SWITCH_ARGS)
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
2193 3           *f = powq((float128)SvIVX(b), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2194 2           else *f = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), (float128)SvIVX(b));
2195 5           return obj_ref;
2196             }
2197              
2198             #if defined(F128_PV_NV_BUG)
2199             if( (SvPOK(b) && !SvNOK(b))
2200             ||
2201             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
2202             #else
2203 9 100         if(SvPOK(b)) {
2204             #endif
2205             char * p;
2206             #ifdef _WIN32_BIZARRE_INFNAN
2207             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
2208             #endif
2209              
2210 4 100         NOK_POK_DUALVAR_CHECK , "overload_pow");}
    50          
    50          
2211              
2212             #ifdef _WIN32_BIZARRE_INFNAN
2213             if(inf_or_nan) {
2214             if(inf_or_nan == 2) {
2215             if(SWITCH_ARGS)
2216             *f = powq(_get_nan(), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2217             else *f = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), _get_nan());
2218             }
2219             else {
2220             if(SWITCH_ARGS)
2221             *f = powq(_get_inf(inf_or_nan), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2222             else *f = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), _get_inf(inf_or_nan));
2223             }
2224             }
2225             else {
2226             if(SWITCH_ARGS)
2227             *f = powq(strtoflt128(SvPV_nolen(b), &p), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2228             else *f = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), strtoflt128(SvPV_nolen(b), &p));
2229             _nnum_inc(p);
2230             }
2231             #else
2232 4 50         if(SWITCH_ARGS)
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
2233 3 50         *f = powq(strtoflt128(SvPV_nolen(b), &p), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2234 1 50         else *f = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), strtoflt128(SvPV_nolen(b), &p));
2235 4           _nnum_inc(p);
2236             #endif
2237 4           return obj_ref;
2238             }
2239              
2240 5 100         if(SvNOK(b)) {
2241              
2242             #if defined(F128_PV_NV_BUG)
2243             NOK_POK_DUALVAR_CHECK , "overload_pow");}
2244             #endif
2245              
2246             #if defined(AVOID_INF_CAST)
2247             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
2248             if(SWITCH_ARGS)
2249             *f = powq(_get_inf(SvNVX(b) > 0 ? 1 : -1), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2250             else *f = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), _get_inf(SvNVX(b) > 0 ? 1 : -1));
2251             return obj_ref;
2252             }
2253             #endif
2254 3 50         if(SWITCH_ARGS)
    0          
    0          
    50          
    50          
    50          
    100          
    50          
    0          
    0          
    0          
    0          
    0          
    100          
2255 2           *f = powq((float128)SvNVX(b), *(INT2PTR(float128 *, SvIVX(SvRV(a)))));
2256 1           else *f = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), (float128)SvNVX(b));
2257 3           return obj_ref;
2258             }
2259              
2260 2 50         if(sv_isobject(b)) {
2261 2 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
2262 2 50         if(strEQ(h, "Math::Float128")) {
2263 2           *f = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))), *(INT2PTR(float128 *, SvIVX(SvRV(b)))));
2264 2           return obj_ref;
2265             }
2266 0           croak("Invalid object supplied to Math::Float128::_overload_pow function");
2267             }
2268 0           croak("Invalid argument supplied to Math::Float128::_overload_pow function");
2269             }
2270              
2271 5           SV * _overload_pow_eq(pTHX_ SV * a, SV * b, SV * third) {
2272              
2273 5           SvREFCNT_inc(a);
2274              
2275 5 50         if(SvUOK(b)) {
2276 0           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))),
2277 0           (float128)SvUVX(b));
2278 0           return a;
2279             }
2280              
2281 5 100         if(SvIOK(b)) {
2282 1           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))),
2283 1           (float128)SvIVX(b));
2284 1           return a;
2285             }
2286              
2287             #if defined(F128_PV_NV_BUG)
2288             if( (SvPOK(b) && !SvNOK(b))
2289             ||
2290             (SvPOK(b) && SvNOK(b) && SvIOKp(b)) ) {
2291             #else
2292 4 100         if(SvPOK(b)) {
2293             #endif
2294             char * p;
2295             #ifdef _WIN32_BIZARRE_INFNAN
2296             int inf_or_nan = _win32_infnanstring(SvPV_nolen(b));
2297             #endif
2298              
2299 1 50         NOK_POK_DUALVAR_CHECK , "overload_pow_eq");}
    0          
    0          
2300              
2301             #ifdef _WIN32_BIZARRE_INFNAN
2302              
2303             if(inf_or_nan) {
2304             if(inf_or_nan == 2) {
2305             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))),
2306             _get_nan());
2307             return a;
2308             }
2309              
2310             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))),
2311             _get_inf(inf_or_nan));
2312             return a;
2313             }
2314              
2315             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))),
2316             strtoflt128(SvPV_nolen(b), &p));
2317             _nnum_inc(p);
2318             return a;
2319             #else
2320 1 50         *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))),
2321 1           strtoflt128(SvPV_nolen(b), &p));
2322 1           _nnum_inc(p);
2323 1           return a;
2324             #endif
2325             }
2326              
2327 3 100         if(SvNOK(b)) {
2328              
2329             #if defined(F128_PV_NV_BUG)
2330             NOK_POK_DUALVAR_CHECK , "overload_pow_eq");}
2331             #endif
2332              
2333             #if defined(AVOID_INF_CAST)
2334             if(SvNVX(b) != 0.0L && SvNVX(b) == SvNVX(b) && SvNVX(b) / SvNVX(b) != SvNVX(b) / SvNVX(b)) {
2335             *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))),
2336             _get_inf(SvNVX(b) > 0 ? 1 : -1));
2337             return a;
2338             }
2339             #endif
2340 1           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))),
2341 1           (float128)SvNVX(b));
2342 1           return a;
2343             }
2344              
2345 2 50         if(sv_isobject(b)) {
2346 2 50         const char *h = HvNAME(SvSTASH(SvRV(b)));
    50          
    50          
    0          
    50          
    50          
2347 2 50         if(strEQ(h, "Math::Float128")) {
2348 2           *(INT2PTR(float128 *, SvIVX(SvRV(a)))) = powq(*(INT2PTR(float128 *, SvIVX(SvRV(a)))),
2349 2           *(INT2PTR(float128 *, SvIVX(SvRV(b)))));
2350 2           return a;
2351             }
2352 0           SvREFCNT_dec(a);
2353 0           croak("Invalid object supplied to Math::Float128::_overload_pow_eq function");
2354             }
2355 0           SvREFCNT_dec(a);
2356 0           croak("Invalid argument supplied to Math::Float128::_overload_pow_eq function");
2357             }
2358              
2359 71           SV * cmp2NV(pTHX_ SV * flt128_obj, SV * sv) {
2360             float128 f;
2361             NV nv;
2362              
2363 71 50         if(sv_isobject(flt128_obj)) {
2364 71 50         const char *h = HvNAME(SvSTASH(SvRV(flt128_obj)));
    50          
    50          
    0          
    50          
    50          
2365 71 50         if(strEQ(h, "Math::Float128")) {
2366 71           f = *(INT2PTR(float128 *, SvIVX(SvRV(flt128_obj))));
2367 71 100         nv = SvNV(sv);
2368              
2369 71 50         if((f != f) || (nv != nv)) return &PL_sv_undef;
    50          
2370 71 100         if(f < (float128)nv) return newSViv(-1);
2371 46 100         if(f > (float128)nv) return newSViv(1);
2372 22           return newSViv(0);
2373             }
2374 0           croak("Invalid object supplied to Math::Float128::cmp2NV function");
2375             }
2376 0           croak("Invalid argument supplied to Math::Float128::cmp_NV function");
2377             }
2378              
2379 53           SV * F128toNV(pTHX_ SV * f) {
2380 53           return newSVnv((NV)(*(INT2PTR(float128 *, SvIVX(SvRV(f))))));
2381             }
2382              
2383             /* #define FLT128_MAX 1.18973149535723176508575932662800702e4932Q */
2384              
2385 1           SV * _FLT128_MAX(pTHX) {
2386             #ifdef FLT128_MAX
2387             float128 * f;
2388             SV * obj_ref, * obj;
2389              
2390 1           Newx(f, 1, float128);
2391 1 50         if(f == NULL) croak("Failed to allocate memory in _FLT128_MAX function");
2392              
2393 1           obj_ref = newSV(0);
2394 1           obj = newSVrv(obj_ref, "Math::Float128");
2395              
2396 1           *f = FLT128_MAX;
2397              
2398 1           sv_setiv(obj, INT2PTR(IV,f));
2399 1           SvREADONLY_on(obj);
2400 1           return obj_ref;
2401             #else
2402             croak("FLT128_MAX not implemented");
2403             #endif
2404             }
2405              
2406             /* #define FLT128_MIN 3.36210314311209350626267781732175260e-4932Q */
2407              
2408 1           SV * _FLT128_MIN(pTHX) {
2409             #ifdef FLT128_MIN
2410             float128 * f;
2411             SV * obj_ref, * obj;
2412              
2413 1           Newx(f, 1, float128);
2414 1 50         if(f == NULL) croak("Failed to allocate memory in _FLT128_MIN function");
2415              
2416 1           obj_ref = newSV(0);
2417 1           obj = newSVrv(obj_ref, "Math::Float128");
2418              
2419 1           *f = FLT128_MIN;
2420              
2421 1           sv_setiv(obj, INT2PTR(IV,f));
2422 1           SvREADONLY_on(obj);
2423 1           return obj_ref;
2424             #else
2425             croak("FLT128_MIN not implemented");
2426             #endif
2427             }
2428              
2429             /* #define FLT128_EPSILON 1.92592994438723585305597794258492732e-34Q */
2430              
2431 1           SV * _FLT128_EPSILON(pTHX) {
2432             #ifdef FLT128_EPSILON
2433             float128 * f;
2434             SV * obj_ref, * obj;
2435              
2436 1           Newx(f, 1, float128);
2437 1 50         if(f == NULL) croak("Failed to allocate memory in _FLT128_EPSILON function");
2438              
2439 1           obj_ref = newSV(0);
2440 1           obj = newSVrv(obj_ref, "Math::Float128");
2441              
2442 1           *f = FLT128_EPSILON;
2443              
2444 1           sv_setiv(obj, INT2PTR(IV,f));
2445 1           SvREADONLY_on(obj);
2446 1           return obj_ref;
2447             #else
2448             croak("FLT128_EPSILON not implemented");
2449             #endif
2450             }
2451              
2452             /* #define FLT128_DENORM_MIN 6.475175119438025110924438958227646552e-4966Q */
2453              
2454              
2455 1           SV * _FLT128_DENORM_MIN(pTHX) {
2456             #ifdef FLT128_DENORM_MIN
2457             float128 * f;
2458             SV * obj_ref, * obj;
2459              
2460 1           Newx(f, 1, float128);
2461 1 50         if(f == NULL) croak("Failed to allocate memory in _FLT128_DENORM_MIN function");
2462              
2463 1           obj_ref = newSV(0);
2464 1           obj = newSVrv(obj_ref, "Math::Float128");
2465              
2466 1           *f = FLT128_DENORM_MIN;
2467              
2468 1           sv_setiv(obj, INT2PTR(IV,f));
2469 1           SvREADONLY_on(obj);
2470 1           return obj_ref;
2471             #else
2472             croak("FLT128_DENORM_MIN not implemented");
2473             #endif
2474             }
2475              
2476             /* #define FLT128_MANT_DIG 113 */
2477              
2478 1           int _FLT128_MANT_DIG(void) {
2479             #ifdef FLT128_MANT_DIG
2480 1           return (int)FLT128_MANT_DIG;
2481             #else
2482             croak("FLT128_MANT_DIG not implemented");
2483             #endif
2484             }
2485              
2486             /* #define FLT128_MIN_EXP (-16381) */
2487              
2488 1           int _FLT128_MIN_EXP(void) {
2489             #ifdef FLT128_MIN_EXP
2490 1           return (int)FLT128_MIN_EXP;
2491             #else
2492             croak("FLT128_MIN_EXP not implemented");
2493             #endif
2494             }
2495              
2496             /* #define FLT128_MAX_EXP 16384 */
2497              
2498 1           int _FLT128_MAX_EXP(void) {
2499             #ifdef FLT128_MAX_EXP
2500 1           return (int)FLT128_MAX_EXP;
2501             #else
2502             croak("FLT128_MAX_EXP not implemented");
2503             #endif
2504             }
2505              
2506             /* #define FLT128_MIN_10_EXP (-4931) */
2507              
2508 1           int _FLT128_MIN_10_EXP(void) {
2509             #ifdef FLT128_MIN_10_EXP
2510 1           return (int)FLT128_MIN_10_EXP;
2511             #else
2512             croak("FLT128_MIN_10_EXP not implemented");
2513             #endif
2514             }
2515              
2516             /* #define FLT128_MAX_10_EXP 4932 */
2517              
2518 1           int _FLT128_MAX_10_EXP(void) {
2519             #ifdef FLT128_MAX_10_EXP
2520 1           return (int)FLT128_MAX_10_EXP;
2521             #else
2522             croak("FLT128_MAX_10_EXP not implemented");
2523             #endif
2524             }
2525              
2526             /* #define HUGE_VALQ __builtin_huge_valq() */
2527              
2528              
2529             /*#define M_Eq 2.7182818284590452353602874713526625Q */ /* e */
2530              
2531 1           SV * _M_Eq(pTHX) {
2532             #ifndef M_Eq
2533             #define M_Eq expq(1.0Q)
2534             #endif
2535             float128 * f;
2536             SV * obj_ref, * obj;
2537              
2538 1           Newx(f, 1, float128);
2539 1 50         if(f == NULL) croak("Failed to allocate memory in _M_Eq function");
2540              
2541 1           obj_ref = newSV(0);
2542 1           obj = newSVrv(obj_ref, "Math::Float128");
2543              
2544 1           *f = M_Eq;
2545              
2546 1           sv_setiv(obj, INT2PTR(IV,f));
2547 1           SvREADONLY_on(obj);
2548 1           return obj_ref;
2549             }
2550              
2551             /* #define M_LOG2Eq 1.4426950408889634073599246810018921Q */ /* log_2 e */
2552              
2553 1           SV * _M_LOG2Eq(pTHX) {
2554             #ifndef M_LOG2Eq
2555             #define M_LOG2Eq log2q(expq(1.0Q))
2556             #endif
2557             float128 * f;
2558             SV * obj_ref, * obj;
2559              
2560 1           Newx(f, 1, float128);
2561 1 50         if(f == NULL) croak("Failed to allocate memory in _M_LOG2Eq function");
2562              
2563 1           obj_ref = newSV(0);
2564 1           obj = newSVrv(obj_ref, "Math::Float128");
2565              
2566 1           *f = M_LOG2Eq;
2567              
2568 1           sv_setiv(obj, INT2PTR(IV,f));
2569 1           SvREADONLY_on(obj);
2570 1           return obj_ref;
2571             }
2572              
2573             /* #define M_LOG10Eq 0.4342944819032518276511289189166051Q */ /* log_10 e */
2574              
2575 1           SV * _M_LOG10Eq(pTHX) {
2576             #ifndef M_LOG10Eq
2577             #define M_LOG10Eq lo10q(expq(1.0Q))
2578             #endif
2579             float128 * f;
2580             SV * obj_ref, * obj;
2581              
2582 1           Newx(f, 1, float128);
2583 1 50         if(f == NULL) croak("Failed to allocate memory in _M_LOG10Eq function");
2584              
2585 1           obj_ref = newSV(0);
2586 1           obj = newSVrv(obj_ref, "Math::Float128");
2587              
2588 1           *f = M_LOG10Eq;
2589              
2590 1           sv_setiv(obj, INT2PTR(IV,f));
2591 1           SvREADONLY_on(obj);
2592 1           return obj_ref;
2593             }
2594              
2595             /* #define M_LN2q 0.6931471805599453094172321214581766Q */ /* log_e 2 */
2596              
2597 1           SV * _M_LN2q(pTHX) {
2598             #ifndef M_LN2q
2599             #define M_LN2q logq(2.0Q)
2600             #endif
2601             float128 * f;
2602             SV * obj_ref, * obj;
2603              
2604 1           Newx(f, 1, float128);
2605 1 50         if(f == NULL) croak("Failed to allocate memory in _M_LN2q function");
2606              
2607 1           obj_ref = newSV(0);
2608 1           obj = newSVrv(obj_ref, "Math::Float128");
2609              
2610 1           *f = M_LN2q;
2611              
2612 1           sv_setiv(obj, INT2PTR(IV,f));
2613 1           SvREADONLY_on(obj);
2614 1           return obj_ref;
2615             }
2616              
2617             /* #define M_LN10q 2.3025850929940456840179914546843642Q */ /* log_e 10 */
2618              
2619 1           SV * _M_LN10q(pTHX) {
2620             #ifndef M_LN10q
2621             #define M_LN10q logq(10.0Q)
2622             #endif
2623             float128 * f;
2624             SV * obj_ref, * obj;
2625              
2626 1           Newx(f, 1, float128);
2627 1 50         if(f == NULL) croak("Failed to allocate memory in _M_LN10q function");
2628              
2629 1           obj_ref = newSV(0);
2630 1           obj = newSVrv(obj_ref, "Math::Float128");
2631              
2632 1           *f = M_LN10q;
2633              
2634 1           sv_setiv(obj, INT2PTR(IV,f));
2635 1           SvREADONLY_on(obj);
2636 1           return obj_ref;
2637             }
2638              
2639             /* #define M_PIq 3.1415926535897932384626433832795029Q */ /* pi */
2640              
2641 1           SV * _M_PIq(pTHX) {
2642             #ifndef M_PIq
2643             #define M_PIq 2.0Q*asinq(1.0Q)
2644             #endif
2645             float128 * f;
2646             SV * obj_ref, * obj;
2647              
2648 1           Newx(f, 1, float128);
2649 1 50         if(f == NULL) croak("Failed to allocate memory in _M_PIq function");
2650              
2651 1           obj_ref = newSV(0);
2652 1           obj = newSVrv(obj_ref, "Math::Float128");
2653              
2654 1           *f = M_PIq;
2655              
2656 1           sv_setiv(obj, INT2PTR(IV,f));
2657 1           SvREADONLY_on(obj);
2658 1           return obj_ref;
2659             }
2660              
2661             /* #define M_PI_2q 1.5707963267948966192313216916397514Q */ /* pi/2 */
2662              
2663 1           SV * _M_PI_2q(pTHX) {
2664             #ifndef M_PI_2q
2665             #define M_PI_2q asinq(1.0Q)
2666             #endif
2667             float128 * f;
2668             SV * obj_ref, * obj;
2669              
2670 1           Newx(f, 1, float128);
2671 1 50         if(f == NULL) croak("Failed to allocate memory in _M_PI_2q function");
2672              
2673 1           obj_ref = newSV(0);
2674 1           obj = newSVrv(obj_ref, "Math::Float128");
2675              
2676 1           *f = M_PI_2q;
2677              
2678 1           sv_setiv(obj, INT2PTR(IV,f));
2679 1           SvREADONLY_on(obj);
2680 1           return obj_ref;
2681             }
2682              
2683             /* #define M_PI_4q 0.7853981633974483096156608458198757Q */ /* pi/4 */
2684              
2685 1           SV * _M_PI_4q(pTHX) {
2686             #ifndef M_PI_4q
2687             #define M_PI_4q asinq(1.0Q)/2.0Q
2688             #endif
2689             float128 * f;
2690             SV * obj_ref, * obj;
2691              
2692 1           Newx(f, 1, float128);
2693 1 50         if(f == NULL) croak("Failed to allocate memory in _M_PI_4q function");
2694              
2695 1           obj_ref = newSV(0);
2696 1           obj = newSVrv(obj_ref, "Math::Float128");
2697              
2698 1           *f = M_PI_4q;
2699              
2700 1           sv_setiv(obj, INT2PTR(IV,f));
2701 1           SvREADONLY_on(obj);
2702 1           return obj_ref;
2703             }
2704              
2705             /* #define M_1_PIq 0.3183098861837906715377675267450287Q */ /* 1/pi */
2706              
2707 1           SV * _M_1_PIq(pTHX) {
2708             #ifndef M_1_PIq
2709             #define M_1_PIq 0.5Q/asinq(1.0Q)
2710             #endif
2711             float128 * f;
2712             SV * obj_ref, * obj;
2713              
2714 1           Newx(f, 1, float128);
2715 1 50         if(f == NULL) croak("Failed to allocate memory in _M_1_PIq function");
2716              
2717 1           obj_ref = newSV(0);
2718 1           obj = newSVrv(obj_ref, "Math::Float128");
2719              
2720 1           *f = M_1_PIq;
2721              
2722 1           sv_setiv(obj, INT2PTR(IV,f));
2723 1           SvREADONLY_on(obj);
2724 1           return obj_ref;
2725             }
2726              
2727             /* #define M_2_PIq 0.6366197723675813430755350534900574Q */ /* 2/pi */
2728              
2729 1           SV * _M_2_PIq(pTHX) {
2730             #ifndef M_2_PIq
2731             #define M_2_PIq 1.0Q/asinq(1.0Q)
2732             #endif
2733             float128 * f;
2734             SV * obj_ref, * obj;
2735              
2736 1           Newx(f, 1, float128);
2737 1 50         if(f == NULL) croak("Failed to allocate memory in _M_2_PIq function");
2738              
2739 1           obj_ref = newSV(0);
2740 1           obj = newSVrv(obj_ref, "Math::Float128");
2741              
2742 1           *f = M_2_PIq;
2743              
2744 1           sv_setiv(obj, INT2PTR(IV,f));
2745 1           SvREADONLY_on(obj);
2746 1           return obj_ref;
2747             }
2748              
2749             /* #define M_2_SQRTPIq 1.1283791670955125738961589031215452Q */ /* 2/sqrt(pi) */
2750              
2751 1           SV * _M_2_SQRTPIq(pTHX) {
2752             #ifndef M_2_SQRTPIq
2753             #define M_2_SQRTPIq 2.0Q/sqrtq(2.0Q*asinq(1.0Q))
2754             #endif
2755             float128 * f;
2756             SV * obj_ref, * obj;
2757              
2758 1           Newx(f, 1, float128);
2759 1 50         if(f == NULL) croak("Failed to allocate memory in _M_2_SQRTPIq function");
2760              
2761 1           obj_ref = newSV(0);
2762 1           obj = newSVrv(obj_ref, "Math::Float128");
2763              
2764 1           *f = M_2_SQRTPIq;
2765              
2766 1           sv_setiv(obj, INT2PTR(IV,f));
2767 1           SvREADONLY_on(obj);
2768 1           return obj_ref;
2769             }
2770              
2771             /* #define M_SQRT2q 1.4142135623730950488016887242096981Q */ /* sqrt(2) */
2772              
2773 1           SV * _M_SQRT2q(pTHX) {
2774             #ifndef M_SQRT2q
2775             #define M_SQRT2q sqrtq(2.0Q)
2776             #endif
2777             float128 * f;
2778             SV * obj_ref, * obj;
2779              
2780 1           Newx(f, 1, float128);
2781 1 50         if(f == NULL) croak("Failed to allocate memory in _M_SQRT2q function");
2782              
2783 1           obj_ref = newSV(0);
2784 1           obj = newSVrv(obj_ref, "Math::Float128");
2785              
2786 1           *f = M_SQRT2q;
2787              
2788 1           sv_setiv(obj, INT2PTR(IV,f));
2789 1           SvREADONLY_on(obj);
2790 1           return obj_ref;
2791             }
2792              
2793             /* #define M_SQRT1_2q 0.7071067811865475244008443621048490Q */ /* 1/sqrt(2) */
2794              
2795 1           SV * _M_SQRT1_2q(pTHX) {
2796             #ifndef M_SQRT1_2q
2797             #define M_SQRT1_2q 1.0Q/sqrtq(2.0Q)
2798             #endif
2799             float128 * f;
2800             SV * obj_ref, * obj;
2801              
2802 1           Newx(f, 1, float128);
2803 1 50         if(f == NULL) croak("Failed to allocate memory in _M_SQRT1_2q function");
2804              
2805 1           obj_ref = newSV(0);
2806 1           obj = newSVrv(obj_ref, "Math::Float128");
2807              
2808 1           *f = M_SQRT1_2q;
2809              
2810 1           sv_setiv(obj, INT2PTR(IV,f));
2811 1           SvREADONLY_on(obj);
2812 1           return obj_ref;
2813             }
2814              
2815 1           void _f128_bytes(pTHX_ SV * sv) {
2816 1           dXSARGS;
2817 1           float128 f128 = *(INT2PTR(float128 *, SvIVX(SvRV(sv))));
2818 1           int i, n = sizeof(float128);
2819             char * buff;
2820 1           void * p = &f128;
2821              
2822 1           Newx(buff, 4, char);
2823 1 50         if(buff == NULL) croak("Failed to allocate memory in _f128_bytes function");
2824              
2825 1           sp = mark;
2826              
2827             #ifdef WE_HAVE_BENDIAN /* Big Endian architecture */
2828             for (i = 0; i < n; i++) {
2829             #else
2830 17 100         for (i = n - 1; i >= 0; i--) {
2831             #endif
2832              
2833 16           sprintf(buff, "%02X", ((unsigned char*)p)[i]);
2834 16 50         XPUSHs(sv_2mortal(newSVpv(buff, 0)));
2835             }
2836 1           PUTBACK;
2837 1           Safefree(buff);
2838 1           XSRETURN(n);
2839             }
2840              
2841 1           void acos_F128(float128 * rop, float128 * op) {
2842 1           *rop = acosq(*op);
2843 1           }
2844              
2845 1           void acosh_F128(float128 * rop, float128 * op) {
2846 1           *rop = acoshq(*op);
2847 1           }
2848              
2849 1           void asin_F128(float128 * rop, float128 * op) {
2850 1           *rop = asinq(*op);
2851 1           }
2852              
2853 1           void asinh_F128(float128 * rop, float128 * op) {
2854 1           *rop = asinhq(*op);
2855 1           }
2856              
2857 1           void atan_F128(float128 * rop, float128 * op) {
2858 1           *rop = atanq(*op);
2859 1           }
2860              
2861 1           void atanh_F128(float128 * rop, float128 * op) {
2862 1           *rop = atanhq(*op);
2863 1           }
2864              
2865 1           void atan2_F128(float128 * rop, float128 * op1, float128 * op2) {
2866 1           *rop = atan2q(*op1, *op2);
2867 1           }
2868              
2869 1           void cbrt_F128(float128 * rop, float128 * op) {
2870 1           *rop = cbrtq(*op);
2871 1           }
2872              
2873 2           void ceil_F128(float128 * rop, float128 * op) {
2874 2           *rop = ceilq(*op);
2875 2           }
2876              
2877 4           void copysign_F128(float128 * rop, float128 * op1, float128 * op2) {
2878 4           *rop = copysignq(*op1, *op2);
2879 4           }
2880              
2881 1           void cosh_F128(float128 * rop, float128 * op) {
2882             #if defined(__MINGW64_VERSION_MAJOR) && __MINGW64_VERSION_MAJOR < 4 /* avoid calling coshq() as it's buggy */
2883             float128 temp = sinhq(*op);
2884             temp = powq(temp, 2) + 1.0Q;
2885             *rop = sqrtq(temp);
2886             #else
2887 1           *rop = coshq(*op);
2888             #endif
2889 1           }
2890              
2891 1           void cos_F128(float128 * rop, float128 * op) {
2892 1           *rop = cosq(*op);
2893 1           }
2894              
2895 1           void erf_F128(float128 * rop, float128 * op) {
2896 1           *rop = erfq(*op);
2897 1           }
2898              
2899 1           void erfc_F128(float128 * rop, float128 * op) {
2900 1           *rop = erfcq(*op);
2901 1           }
2902              
2903 1           void exp_F128(float128 * rop, float128 * op) {
2904             #if defined(__MINGW64_VERSION_MAJOR) && __MINGW64_VERSION_MAJOR < 4 /* avoid calling expq() as it's buggy */
2905             *rop = powq(M_Eq, *op);
2906             #else
2907 1           *rop = expq(*op);
2908             #endif
2909 1           }
2910              
2911 1           void expm1_F128(float128 * rop, float128 * op) {
2912 1           *rop = expm1q(*op);
2913 1           }
2914              
2915 1           void fabs_F128(float128 * rop, float128 * op) {
2916 1           *rop = fabsq(*op);
2917 1           }
2918              
2919 2           void fdim_F128(float128 * rop, float128 * op1, float128 * op2) {
2920 2           *rop = fdimq(*op1, *op2);
2921 2           }
2922              
2923 7           int finite_F128(float128 * op) {
2924 7           return finiteq(*op);
2925             }
2926              
2927 2           void floor_F128(float128 * rop, float128 * op) {
2928 2           *rop = floorq(*op);
2929 2           }
2930              
2931 1           void fma_F128(float128 * rop, float128 * op1, float128 * op2, float128 * op3) {
2932             #if defined(__MINGW64_VERSION_MAJOR) && __MINGW64_VERSION_MAJOR < 4 /* avoid calling fmaq() as it's buggy */
2933             float128 temp = *op1 * *op2;
2934             temp += *op3;
2935             *rop = temp;
2936             #else
2937 1           *rop = fmaq(*op1, *op2, *op3);
2938             #endif
2939 1           }
2940              
2941 1           void fmax_F128(float128 * rop, float128 * op1, float128 * op2) {
2942 1           *rop = fmaxq(*op1, *op2);
2943 1           }
2944              
2945 1           void fmin_F128(float128 * rop, float128 * op1, float128 * op2) {
2946 1           *rop = fminq(*op1, *op2);
2947 1           }
2948              
2949 1           void fmod_F128(float128 * rop, float128 * op1, float128 * op2) {
2950 1           *rop = fmodq(*op1, *op2);
2951 1           }
2952              
2953 1           void hypot_F128(float128 * rop, float128 * op1, float128 * op2) {
2954 1           *rop = hypotq(*op1, *op2);
2955 1           }
2956              
2957 1           void frexp_F128(pTHX_ float128 * frac, SV * exp, float128 * op) {
2958             int e;
2959 1           *frac = frexpq(*op, &e);
2960 1           sv_setsv(exp, newSViv(e));
2961 1           }
2962              
2963 1           void ldexp_F128(float128 * rop, float128 * op, int pow) {
2964 1           *rop = ldexpq(*op, pow);
2965 1           }
2966              
2967 17           int isinf_F128(float128 * op) {
2968 17           return isinfq(*op);
2969             }
2970              
2971 1           int ilogb_F128(float128 * op) {
2972 1           return ilogbq(*op);
2973             }
2974              
2975 21           int isnan_F128(float128 * op) {
2976 21           return isnanq(*op);
2977             }
2978              
2979 1           void j0_F128(float128 * rop, float128 * op) {
2980 1           *rop = j0q(*op);
2981 1           }
2982              
2983 1           void j1_F128(float128 * rop, float128 * op) {
2984 1           *rop = j1q(*op);
2985 1           }
2986              
2987 1           void jn_F128(float128 * rop, int n, float128 * op) {
2988 1           *rop = jnq(n, *op);
2989 1           }
2990              
2991 1           void lgamma_F128(float128 * rop, float128 * op) {
2992 1           *rop = lgammaq(*op);
2993 1           }
2994              
2995 2           SV * llrint_F128(pTHX_ float128 * op) {
2996             #ifdef LONGLONG2IV_IS_OK
2997 2           return newSViv((IV)llrintq(*op));
2998             #else
2999             warn("llrint_F128 not implemented: IV size (%d) is smaller than longlong size (%d)\n", sizeof(IV), sizeof(long long int));
3000             croak("Use lrint_F128 instead");
3001             #endif
3002             }
3003              
3004 2           SV * llround_F128(pTHX_ float128 * op) {
3005             #ifdef LONGLONG2IV_IS_OK
3006 2           return newSViv((IV)llroundq(*op));
3007             #else
3008             warn("llround_F128 not implemented: IV size (%d) is smaller than longlong size (%d)\n", sizeof(IV), sizeof(long long int));
3009             croak("Use lround_F128 instead");
3010             #endif
3011             }
3012              
3013 2           SV * lrint_F128(pTHX_ float128 * op) {
3014             #ifdef LONG2IV_IS_OK
3015 2           return newSViv((IV)lrintq(*op));
3016             #else
3017             croak("lrint_F128 not implemented: IV size (%d) is smaller than long size (%d)", sizeof(IV), sizeof(long));
3018             #endif
3019             }
3020              
3021 2           SV * lround_F128(pTHX_ float128 * op) {
3022             #ifdef LONG2IV_IS_OK
3023 2           return newSViv((IV)lroundq(*op));
3024             #else
3025             croak("lround_F128 not implemented: IV size (%d) is smaller than long size (%d)", sizeof(IV), sizeof(long));
3026             #endif
3027             }
3028              
3029 1           void log_F128(float128 * rop, float128 * op) {
3030 1           *rop = logq(*op);
3031 1           }
3032              
3033 1           void log10_F128(float128 * rop, float128 * op) {
3034 1           *rop = log10q(*op);
3035 1           }
3036              
3037 1           void log2_F128(float128 * rop, float128 * op) {
3038 1           *rop = log2q(*op);
3039 1           }
3040              
3041 1           void log1p_F128(float128 * rop, float128 * op) {
3042 1           *rop = log1pq(*op);
3043 1           }
3044              
3045 1           void modf_F128(float128 * integer, float128 * frac, float128 * op) {
3046             float128 ret;
3047 1           *frac = modfq(*op, &ret);
3048 1           *integer = ret;
3049 1           }
3050              
3051 1           void nan_F128(pTHX_ float128 * rop, SV * op) {
3052 1 50         *rop = nanq(SvPV_nolen(op));
3053 1           }
3054              
3055 6           void nearbyint_F128(float128 * rop, float128 * op) {
3056             #if defined(__MINGW64_VERSION_MAJOR) && __MINGW64_VERSION_MAJOR < 4 /* avoid calling nearbyintq() as it's buggy */
3057             float128 do_floor, do_ceil;
3058             int rnd = fegetround();
3059             if(*op == 0.0Q || isinfq(*op) || isnanq(*op)) {
3060             *rop = *op;
3061             return;
3062             }
3063             do_floor = *op - floorq(*op);
3064             do_ceil = ceilq(*op) - *op;
3065             if(do_ceil < do_floor) {
3066             *rop = ceilq(*op);
3067             return;
3068             }
3069             if(do_ceil > do_floor) {
3070             *rop = floorq(*op);
3071             return;
3072             }
3073             if(do_floor == do_ceil) {
3074             if(rnd == FE_TONEAREST) {
3075             if(remainderq(floorq(*op), 2.0Q) == 0.0Q) *rop = floorq(*op);
3076             else *rop = ceilq(*op);
3077             return;
3078             }
3079             if(rnd == FE_UPWARD) {
3080             *rop = ceilq(*op);
3081             return;
3082             }
3083             if(rnd == FE_DOWNWARD) {
3084             *rop = floorq(*op);
3085             return;
3086             }
3087             if(rnd == FE_TOWARDZERO) {
3088             if(*op < 0.0Q) *rop = ceilq(*op);
3089             if(*op > 0.0Q) *rop = floorq(*op);
3090             return;
3091             }
3092             croak("nearbyint_F128 workaround for mingw64 compiler failed\n");
3093             }
3094             #else
3095 6           *rop = nearbyintq(*op);
3096             #endif
3097 6           }
3098              
3099 2           void nextafter_F128(float128 * rop, float128 * op1, float128 * op2) {
3100 2           *rop = nextafterq(*op1, *op2);
3101 2           }
3102              
3103 1           void pow_F128(float128 * rop, float128 * op1, float128 * op2) {
3104 1           *rop = powq(*op1, *op2);
3105 1           }
3106              
3107 1           void remainder_F128(float128 * rop, float128 * op1, float128 * op2) {
3108 1           *rop = remainderq(*op1, *op2);
3109 1           }
3110              
3111 1           void remquo_F128(pTHX_ float128 * rop1, SV * rop2, float128 * op1, float128 * op2) {
3112             int ret;
3113 1           *rop1 = remquoq(*op1, *op2, &ret);
3114 1           sv_setsv(rop2, newSViv(ret));
3115 1           }
3116              
3117 2           void rint_F128(float128 * rop, float128 * op) {
3118 2           *rop = rintq(*op);
3119 2           }
3120              
3121 2           void round_F128(float128 * rop, float128 * op) {
3122 2           *rop = roundq(*op);
3123 2           }
3124              
3125 1           void scalbln_F128(float128 * rop, float128 * op1, long op2) {
3126 1           *rop = scalblnq(*op1, op2);
3127 1           }
3128              
3129 1           void scalbn_F128(float128 * rop, float128 * op1, int op2) {
3130 1           *rop = scalbnq(*op1, op2);
3131 1           }
3132              
3133 2           int signbit_F128(float128 * op) {
3134 2           return signbitq(*op);
3135             }
3136              
3137 1           void sincos_F128(float128 * sin, float128 * cos, float128 * op) {
3138             float128 sine, cosine;
3139 1           sincosq(*op, &sine, &cosine);
3140 1           *sin = sine;
3141 1           *cos = cosine;
3142 1           }
3143              
3144 1           void sinh_F128(float128 * rop, float128 * op) {
3145 1           *rop = sinhq(*op);
3146 1           }
3147              
3148 1           void sin_F128(float128 * rop, float128 * op) {
3149 1           *rop = sinq(*op);
3150 1           }
3151              
3152 1           void sqrt_F128(float128 * rop, float128 * op) {
3153 1           *rop = sqrtq(*op);
3154 1           }
3155              
3156 1           void tan_F128(float128 * rop, float128 * op) {
3157 1           *rop = tanq(*op);
3158 1           }
3159              
3160 1           void tanh_F128(float128 * rop, float128 * op) {
3161 1           *rop = tanhq(*op);
3162 1           }
3163              
3164 1           void tgamma_F128(float128 * rop, float128 * op) {
3165             #if defined(__MINGW64_VERSION_MAJOR) && __MINGW64_VERSION_MAJOR < 4 /* avoid calling tgammaq() as it's buggy */
3166             *rop = powq(M_Eq, lgammaq(*op));
3167             #else
3168 1           *rop = tgammaq(*op);
3169             #endif
3170 1           }
3171              
3172 1           void trunc_F128(float128 * rop, float128 * op) {
3173 1           *rop = truncq(*op);
3174 1           }
3175              
3176 1           void y0_F128(float128 * rop, float128 * op) {
3177 1           *rop = y0q(*op);
3178 1           }
3179              
3180 1           void y1_F128(float128 * rop, float128 * op) {
3181 1           *rop = y1q(*op);
3182 1           }
3183              
3184 1           void yn_F128(float128 * rop, int n, float128 * op) {
3185 1           *rop = ynq(n, *op);
3186 1           }
3187              
3188 1           int _longlong2iv_is_ok(void) {
3189              
3190             /* Is longlong to IV conversion guaranteed to not lose precision ? */
3191             #ifdef LONGLONG2IV_IS_OK
3192 1           return 1;
3193             #else
3194             return 0;
3195             #endif
3196              
3197             }
3198              
3199             /* Is long to IV conversion guaranteed to not lose precision ? */
3200 1           int _long2iv_is_ok(void) {
3201              
3202             #ifdef LONG2IV_IS_OK
3203 1           return 1;
3204             #else
3205             return 0;
3206             #endif
3207              
3208             }
3209              
3210             /* FLT_RADIX is probably 2, but we can use this if we need to be sure. */
3211 1           int _flt_radix(void) {
3212             #ifdef FLT_RADIX
3213 1           return (int)FLT_RADIX;
3214             #else
3215             return 0;
3216             #endif
3217             }
3218              
3219 1           SV * _fegetround(pTHX) {
3220             #ifdef __MINGW64_VERSION_MAJOR /* fenv.h has been included */
3221             int r = fegetround();
3222             if(r == FE_TONEAREST) return newSVpv("FE_TONEAREST", 0);
3223             if(r == FE_TOWARDZERO) return newSVpv("FE_TOWARDZERO", 0);
3224             if(r == FE_UPWARD) return newSVpv("FE_UPWARD", 0);
3225             if(r == FE_DOWNWARD) return newSVpv("FE_DOWNWARD", 0);
3226             return newSVpv("Unknown rounding mode", 0);
3227             #else
3228 1           return newSVpv("Rounding mode undetermined - fenv.h not loaded", 0);
3229             #endif
3230             }
3231              
3232 7           int nnumflag(void) {
3233 7           return nnum;
3234             }
3235              
3236 1           void clear_nnum(void) {
3237 1           nnum = 0;
3238 1           }
3239              
3240 1           void set_nnum(int x) {
3241 1           nnum = x;
3242 1           }
3243              
3244 0           int _lln(pTHX_ SV * x) {
3245 0 0         if(looks_like_number(x)) return 1;
3246 0           return 0;
3247             }
3248              
3249 28           int nok_pokflag(void) {
3250 28           return nok_pok;
3251             }
3252              
3253 0           void clear_nok_pok(void){
3254 0           nok_pok = 0;
3255 0           }
3256              
3257 6           void set_nok_pok(int x) {
3258 6           nok_pok = x;
3259 6           }
3260              
3261 119           int _SvNOK(pTHX_ SV * in) {
3262 119 100         if(SvNOK(in)) return 1;
3263 93           return 0;
3264             }
3265              
3266 20           int _SvPOK(pTHX_ SV * in) {
3267 20 50         if(SvPOK(in)) return 1;
3268 0           return 0;
3269             }
3270              
3271 1           int _avoid_inf_cast(void) {
3272             #if defined(AVOID_INF_CAST)
3273             return 1;
3274             #else
3275 1           return 0;
3276             #endif
3277             }
3278              
3279 1           int _has_pv_nv_bug(void) {
3280             #if defined(F128_PV_NV_BUG)
3281             return 1;
3282             #else
3283 1           return 0;
3284             #endif
3285             }
3286              
3287              
3288              
3289              
3290             MODULE = Math::Float128 PACKAGE = Math::Float128
3291              
3292             PROTOTYPES: DISABLE
3293              
3294              
3295             int
3296             NOK_POK_val ()
3297             CODE:
3298 0           RETVAL = NOK_POK_val (aTHX);
3299             OUTPUT: RETVAL
3300              
3301              
3302             int
3303             _win32_infnanstring (s)
3304             char * s
3305              
3306             void
3307             flt128_set_prec (x)
3308             int x
3309             PREINIT:
3310             I32* temp;
3311             PPCODE:
3312 3           temp = PL_markstack_ptr++;
3313 3           flt128_set_prec(aTHX_ x);
3314 2 50         if (PL_markstack_ptr != temp) {
3315             /* truly void, because dXSARGS not invoked */
3316 2           PL_markstack_ptr = temp;
3317 2           XSRETURN_EMPTY; /* return empty stack */
3318             }
3319             /* must have used dXSARGS; list context implied */
3320 0           return; /* assume stack size is correct */
3321              
3322             int
3323             flt128_get_prec ()
3324              
3325              
3326             SV *
3327             InfF128 (sign)
3328             int sign
3329             CODE:
3330 16           RETVAL = InfF128 (aTHX_ sign);
3331             OUTPUT: RETVAL
3332              
3333             SV *
3334             NaNF128 ()
3335             CODE:
3336 30           RETVAL = NaNF128 (aTHX);
3337             OUTPUT: RETVAL
3338              
3339              
3340             SV *
3341             ZeroF128 (sign)
3342             int sign
3343             CODE:
3344 23           RETVAL = ZeroF128 (aTHX_ sign);
3345             OUTPUT: RETVAL
3346              
3347             SV *
3348             UnityF128 (sign)
3349             int sign
3350             CODE:
3351 39           RETVAL = UnityF128 (aTHX_ sign);
3352             OUTPUT: RETVAL
3353              
3354             SV *
3355             is_NaNF128 (b)
3356             SV * b
3357             CODE:
3358 11           RETVAL = is_NaNF128 (aTHX_ b);
3359             OUTPUT: RETVAL
3360              
3361             SV *
3362             is_InfF128 (b)
3363             SV * b
3364             CODE:
3365 6           RETVAL = is_InfF128 (aTHX_ b);
3366             OUTPUT: RETVAL
3367              
3368             SV *
3369             is_ZeroF128 (b)
3370             SV * b
3371             CODE:
3372 17           RETVAL = is_ZeroF128 (aTHX_ b);
3373             OUTPUT: RETVAL
3374              
3375             void
3376             _nnum_inc (p)
3377             char * p
3378             PREINIT:
3379             I32* temp;
3380             PPCODE:
3381 0           temp = PL_markstack_ptr++;
3382 0           _nnum_inc(p);
3383 0 0         if (PL_markstack_ptr != temp) {
3384             /* truly void, because dXSARGS not invoked */
3385 0           PL_markstack_ptr = temp;
3386 0           XSRETURN_EMPTY; /* return empty stack */
3387             }
3388             /* must have used dXSARGS; list context implied */
3389 0           return; /* assume stack size is correct */
3390              
3391             SV *
3392             STRtoF128 (str)
3393             SV * str
3394             CODE:
3395 160           RETVAL = STRtoF128 (aTHX_ str);
3396             OUTPUT: RETVAL
3397              
3398             void
3399             fromSTR (f, str)
3400             float128 * f
3401             SV * str
3402             PREINIT:
3403             I32* temp;
3404             PPCODE:
3405 1           temp = PL_markstack_ptr++;
3406 1           fromSTR(aTHX_ f, str);
3407 1 50         if (PL_markstack_ptr != temp) {
3408             /* truly void, because dXSARGS not invoked */
3409 1           PL_markstack_ptr = temp;
3410 1           XSRETURN_EMPTY; /* return empty stack */
3411             }
3412             /* must have used dXSARGS; list context implied */
3413 0           return; /* assume stack size is correct */
3414              
3415             SV *
3416             NVtoF128 (nv)
3417             SV * nv
3418             CODE:
3419 216           RETVAL = NVtoF128 (aTHX_ nv);
3420             OUTPUT: RETVAL
3421              
3422             void
3423             fromNV (f, nv)
3424             float128 * f
3425             SV * nv
3426             PREINIT:
3427             I32* temp;
3428             PPCODE:
3429 1           temp = PL_markstack_ptr++;
3430 1           fromNV(aTHX_ f, nv);
3431 1 50         if (PL_markstack_ptr != temp) {
3432             /* truly void, because dXSARGS not invoked */
3433 1           PL_markstack_ptr = temp;
3434 1           XSRETURN_EMPTY; /* return empty stack */
3435             }
3436             /* must have used dXSARGS; list context implied */
3437 0           return; /* assume stack size is correct */
3438              
3439             SV *
3440             IVtoF128 (iv)
3441             SV * iv
3442             CODE:
3443 160           RETVAL = IVtoF128 (aTHX_ iv);
3444             OUTPUT: RETVAL
3445              
3446             void
3447             fromIV (f, iv)
3448             float128 * f
3449             SV * iv
3450             PREINIT:
3451             I32* temp;
3452             PPCODE:
3453 1           temp = PL_markstack_ptr++;
3454 1           fromIV(aTHX_ f, iv);
3455 1 50         if (PL_markstack_ptr != temp) {
3456             /* truly void, because dXSARGS not invoked */
3457 1           PL_markstack_ptr = temp;
3458 1           XSRETURN_EMPTY; /* return empty stack */
3459             }
3460             /* must have used dXSARGS; list context implied */
3461 0           return; /* assume stack size is correct */
3462              
3463             SV *
3464             UVtoF128 (uv)
3465             SV * uv
3466             CODE:
3467 37           RETVAL = UVtoF128 (aTHX_ uv);
3468             OUTPUT: RETVAL
3469              
3470             void
3471             fromUV (f, uv)
3472             float128 * f
3473             SV * uv
3474             PREINIT:
3475             I32* temp;
3476             PPCODE:
3477 1           temp = PL_markstack_ptr++;
3478 1           fromUV(aTHX_ f, uv);
3479 1 50         if (PL_markstack_ptr != temp) {
3480             /* truly void, because dXSARGS not invoked */
3481 1           PL_markstack_ptr = temp;
3482 1           XSRETURN_EMPTY; /* return empty stack */
3483             }
3484             /* must have used dXSARGS; list context implied */
3485 0           return; /* assume stack size is correct */
3486              
3487             void
3488             F128toSTR (f)
3489             SV * f
3490             PREINIT:
3491             I32* temp;
3492             PPCODE:
3493 3           temp = PL_markstack_ptr++;
3494 3           F128toSTR(aTHX_ f);
3495 3 50         if (PL_markstack_ptr != temp) {
3496             /* truly void, because dXSARGS not invoked */
3497 0           PL_markstack_ptr = temp;
3498 0           XSRETURN_EMPTY; /* return empty stack */
3499             }
3500             /* must have used dXSARGS; list context implied */
3501 3           return; /* assume stack size is correct */
3502              
3503             void
3504             F128toSTRP (f, decimal_prec)
3505             SV * f
3506             int decimal_prec
3507             PREINIT:
3508             I32* temp;
3509             PPCODE:
3510 2           temp = PL_markstack_ptr++;
3511 2           F128toSTRP(aTHX_ f, decimal_prec);
3512 1 50         if (PL_markstack_ptr != temp) {
3513             /* truly void, because dXSARGS not invoked */
3514 0           PL_markstack_ptr = temp;
3515 0           XSRETURN_EMPTY; /* return empty stack */
3516             }
3517             /* must have used dXSARGS; list context implied */
3518 1           return; /* assume stack size is correct */
3519              
3520             void
3521             DESTROY (f)
3522             SV * f
3523             PREINIT:
3524             I32* temp;
3525             PPCODE:
3526 1098           temp = PL_markstack_ptr++;
3527 1098           DESTROY(aTHX_ f);
3528 1098 50         if (PL_markstack_ptr != temp) {
3529             /* truly void, because dXSARGS not invoked */
3530 1098           PL_markstack_ptr = temp;
3531 1098           XSRETURN_EMPTY; /* return empty stack */
3532             }
3533             /* must have used dXSARGS; list context implied */
3534 0           return; /* assume stack size is correct */
3535              
3536             SV *
3537             _LDBL_DIG ()
3538             CODE:
3539 0           RETVAL = _LDBL_DIG (aTHX);
3540             OUTPUT: RETVAL
3541              
3542              
3543             SV *
3544             _DBL_DIG ()
3545             CODE:
3546 0           RETVAL = _DBL_DIG (aTHX);
3547             OUTPUT: RETVAL
3548              
3549              
3550             SV *
3551             _FLT128_DIG ()
3552             CODE:
3553 2           RETVAL = _FLT128_DIG (aTHX);
3554             OUTPUT: RETVAL
3555              
3556              
3557             SV *
3558             _overload_add (a, b, third)
3559             SV * a
3560             SV * b
3561             SV * third
3562             CODE:
3563 82           RETVAL = _overload_add (aTHX_ a, b, third);
3564             OUTPUT: RETVAL
3565              
3566             SV *
3567             _overload_mul (a, b, third)
3568             SV * a
3569             SV * b
3570             SV * third
3571             CODE:
3572 17           RETVAL = _overload_mul (aTHX_ a, b, third);
3573             OUTPUT: RETVAL
3574              
3575             SV *
3576             _overload_sub (a, b, third)
3577             SV * a
3578             SV * b
3579             SV * third
3580             CODE:
3581 146           RETVAL = _overload_sub (aTHX_ a, b, third);
3582             OUTPUT: RETVAL
3583              
3584             SV *
3585             _overload_div (a, b, third)
3586             SV * a
3587             SV * b
3588             SV * third
3589             CODE:
3590 22           RETVAL = _overload_div (aTHX_ a, b, third);
3591             OUTPUT: RETVAL
3592              
3593             SV *
3594             _overload_equiv (a, b, third)
3595             SV * a
3596             SV * b
3597             SV * third
3598             CODE:
3599 204           RETVAL = _overload_equiv (aTHX_ a, b, third);
3600             OUTPUT: RETVAL
3601              
3602             SV *
3603             _overload_not_equiv (a, b, third)
3604             SV * a
3605             SV * b
3606             SV * third
3607             CODE:
3608 28           RETVAL = _overload_not_equiv (aTHX_ a, b, third);
3609             OUTPUT: RETVAL
3610              
3611             SV *
3612             _overload_true (a, b, third)
3613             SV * a
3614             SV * b
3615             SV * third
3616             CODE:
3617 4           RETVAL = _overload_true (aTHX_ a, b, third);
3618             OUTPUT: RETVAL
3619              
3620             SV *
3621             _overload_not (a, b, third)
3622             SV * a
3623             SV * b
3624             SV * third
3625             CODE:
3626 6           RETVAL = _overload_not (aTHX_ a, b, third);
3627             OUTPUT: RETVAL
3628              
3629             SV *
3630             _overload_add_eq (a, b, third)
3631             SV * a
3632             SV * b
3633             SV * third
3634             CODE:
3635 16           RETVAL = _overload_add_eq (aTHX_ a, b, third);
3636             OUTPUT: RETVAL
3637              
3638             SV *
3639             _overload_mul_eq (a, b, third)
3640             SV * a
3641             SV * b
3642             SV * third
3643             CODE:
3644 15           RETVAL = _overload_mul_eq (aTHX_ a, b, third);
3645             OUTPUT: RETVAL
3646              
3647             SV *
3648             _overload_sub_eq (a, b, third)
3649             SV * a
3650             SV * b
3651             SV * third
3652             CODE:
3653 13           RETVAL = _overload_sub_eq (aTHX_ a, b, third);
3654             OUTPUT: RETVAL
3655              
3656             SV *
3657             _overload_div_eq (a, b, third)
3658             SV * a
3659             SV * b
3660             SV * third
3661             CODE:
3662 13           RETVAL = _overload_div_eq (aTHX_ a, b, third);
3663             OUTPUT: RETVAL
3664              
3665             SV *
3666             _overload_lt (a, b, third)
3667             SV * a
3668             SV * b
3669             SV * third
3670             CODE:
3671 46           RETVAL = _overload_lt (aTHX_ a, b, third);
3672             OUTPUT: RETVAL
3673              
3674             SV *
3675             _overload_gt (a, b, third)
3676             SV * a
3677             SV * b
3678             SV * third
3679             CODE:
3680 81           RETVAL = _overload_gt (aTHX_ a, b, third);
3681             OUTPUT: RETVAL
3682              
3683             SV *
3684             _overload_lte (a, b, third)
3685             SV * a
3686             SV * b
3687             SV * third
3688             CODE:
3689 40           RETVAL = _overload_lte (aTHX_ a, b, third);
3690             OUTPUT: RETVAL
3691              
3692             SV *
3693             _overload_gte (a, b, third)
3694             SV * a
3695             SV * b
3696             SV * third
3697             CODE:
3698 37           RETVAL = _overload_gte (aTHX_ a, b, third);
3699             OUTPUT: RETVAL
3700              
3701             SV *
3702             _overload_spaceship (a, b, third)
3703             SV * a
3704             SV * b
3705             SV * third
3706             CODE:
3707 65           RETVAL = _overload_spaceship (aTHX_ a, b, third);
3708             OUTPUT: RETVAL
3709              
3710             SV *
3711             _overload_copy (a, b, third)
3712             SV * a
3713             SV * b
3714             SV * third
3715             CODE:
3716 1           RETVAL = _overload_copy (aTHX_ a, b, third);
3717             OUTPUT: RETVAL
3718              
3719             SV *
3720             F128toF128 (a)
3721             SV * a
3722             CODE:
3723 27           RETVAL = F128toF128 (aTHX_ a);
3724             OUTPUT: RETVAL
3725              
3726             void
3727             fromF128 (f, a)
3728             float128 * f
3729             SV * a
3730             PREINIT:
3731             I32* temp;
3732             PPCODE:
3733 1           temp = PL_markstack_ptr++;
3734 1           fromF128(aTHX_ f, a);
3735 1 50         if (PL_markstack_ptr != temp) {
3736             /* truly void, because dXSARGS not invoked */
3737 1           PL_markstack_ptr = temp;
3738 1           XSRETURN_EMPTY; /* return empty stack */
3739             }
3740             /* must have used dXSARGS; list context implied */
3741 0           return; /* assume stack size is correct */
3742              
3743             SV *
3744             _itsa (a)
3745             SV * a
3746             CODE:
3747 449           RETVAL = _itsa (aTHX_ a);
3748             OUTPUT: RETVAL
3749              
3750             SV *
3751             _overload_abs (a, b, third)
3752             SV * a
3753             SV * b
3754             SV * third
3755             CODE:
3756 63           RETVAL = _overload_abs (aTHX_ a, b, third);
3757             OUTPUT: RETVAL
3758              
3759             SV *
3760             _overload_int (a, b, third)
3761             SV * a
3762             SV * b
3763             SV * third
3764             CODE:
3765 11           RETVAL = _overload_int (aTHX_ a, b, third);
3766             OUTPUT: RETVAL
3767              
3768             SV *
3769             _overload_sqrt (a, b, third)
3770             SV * a
3771             SV * b
3772             SV * third
3773             CODE:
3774 4           RETVAL = _overload_sqrt (aTHX_ a, b, third);
3775             OUTPUT: RETVAL
3776              
3777             SV *
3778             _overload_log (a, b, third)
3779             SV * a
3780             SV * b
3781             SV * third
3782             CODE:
3783 4           RETVAL = _overload_log (aTHX_ a, b, third);
3784             OUTPUT: RETVAL
3785              
3786             SV *
3787             _overload_exp (a, b, third)
3788             SV * a
3789             SV * b
3790             SV * third
3791             CODE:
3792 1           RETVAL = _overload_exp (aTHX_ a, b, third);
3793             OUTPUT: RETVAL
3794              
3795             SV *
3796             _overload_sin (a, b, third)
3797             SV * a
3798             SV * b
3799             SV * third
3800             CODE:
3801 1           RETVAL = _overload_sin (aTHX_ a, b, third);
3802             OUTPUT: RETVAL
3803              
3804             SV *
3805             _overload_cos (a, b, third)
3806             SV * a
3807             SV * b
3808             SV * third
3809             CODE:
3810 1           RETVAL = _overload_cos (aTHX_ a, b, third);
3811             OUTPUT: RETVAL
3812              
3813             SV *
3814             _overload_atan2 (a, b, third)
3815             SV * a
3816             SV * b
3817             SV * third
3818             CODE:
3819 4           RETVAL = _overload_atan2 (aTHX_ a, b, third);
3820             OUTPUT: RETVAL
3821              
3822             SV *
3823             _overload_inc (a, b, third)
3824             SV * a
3825             SV * b
3826             SV * third
3827             CODE:
3828 1           RETVAL = _overload_inc (aTHX_ a, b, third);
3829             OUTPUT: RETVAL
3830              
3831             SV *
3832             _overload_dec (a, b, third)
3833             SV * a
3834             SV * b
3835             SV * third
3836             CODE:
3837 1           RETVAL = _overload_dec (aTHX_ a, b, third);
3838             OUTPUT: RETVAL
3839              
3840             SV *
3841             _overload_pow (a, b, third)
3842             SV * a
3843             SV * b
3844             SV * third
3845             CODE:
3846 16           RETVAL = _overload_pow (aTHX_ a, b, third);
3847             OUTPUT: RETVAL
3848              
3849             SV *
3850             _overload_pow_eq (a, b, third)
3851             SV * a
3852             SV * b
3853             SV * third
3854             CODE:
3855 5           RETVAL = _overload_pow_eq (aTHX_ a, b, third);
3856             OUTPUT: RETVAL
3857              
3858             SV *
3859             cmp2NV (flt128_obj, sv)
3860             SV * flt128_obj
3861             SV * sv
3862             CODE:
3863 71           RETVAL = cmp2NV (aTHX_ flt128_obj, sv);
3864             OUTPUT: RETVAL
3865              
3866             SV *
3867             F128toNV (f)
3868             SV * f
3869             CODE:
3870 53           RETVAL = F128toNV (aTHX_ f);
3871             OUTPUT: RETVAL
3872              
3873             SV *
3874             _FLT128_MAX ()
3875             CODE:
3876 1           RETVAL = _FLT128_MAX (aTHX);
3877             OUTPUT: RETVAL
3878              
3879              
3880             SV *
3881             _FLT128_MIN ()
3882             CODE:
3883 1           RETVAL = _FLT128_MIN (aTHX);
3884             OUTPUT: RETVAL
3885              
3886              
3887             SV *
3888             _FLT128_EPSILON ()
3889             CODE:
3890 1           RETVAL = _FLT128_EPSILON (aTHX);
3891             OUTPUT: RETVAL
3892              
3893              
3894             SV *
3895             _FLT128_DENORM_MIN ()
3896             CODE:
3897 1           RETVAL = _FLT128_DENORM_MIN (aTHX);
3898             OUTPUT: RETVAL
3899              
3900              
3901             int
3902             _FLT128_MANT_DIG ()
3903              
3904              
3905             int
3906             _FLT128_MIN_EXP ()
3907              
3908              
3909             int
3910             _FLT128_MAX_EXP ()
3911              
3912              
3913             int
3914             _FLT128_MIN_10_EXP ()
3915              
3916              
3917             int
3918             _FLT128_MAX_10_EXP ()
3919              
3920              
3921             SV *
3922             _M_Eq ()
3923             CODE:
3924 1           RETVAL = _M_Eq (aTHX);
3925             OUTPUT: RETVAL
3926              
3927              
3928             SV *
3929             _M_LOG2Eq ()
3930             CODE:
3931 1           RETVAL = _M_LOG2Eq (aTHX);
3932             OUTPUT: RETVAL
3933              
3934              
3935             SV *
3936             _M_LOG10Eq ()
3937             CODE:
3938 1           RETVAL = _M_LOG10Eq (aTHX);
3939             OUTPUT: RETVAL
3940              
3941              
3942             SV *
3943             _M_LN2q ()
3944             CODE:
3945 1           RETVAL = _M_LN2q (aTHX);
3946             OUTPUT: RETVAL
3947              
3948              
3949             SV *
3950             _M_LN10q ()
3951             CODE:
3952 1           RETVAL = _M_LN10q (aTHX);
3953             OUTPUT: RETVAL
3954              
3955              
3956             SV *
3957             _M_PIq ()
3958             CODE:
3959 1           RETVAL = _M_PIq (aTHX);
3960             OUTPUT: RETVAL
3961              
3962              
3963             SV *
3964             _M_PI_2q ()
3965             CODE:
3966 1           RETVAL = _M_PI_2q (aTHX);
3967             OUTPUT: RETVAL
3968              
3969              
3970             SV *
3971             _M_PI_4q ()
3972             CODE:
3973 1           RETVAL = _M_PI_4q (aTHX);
3974             OUTPUT: RETVAL
3975              
3976              
3977             SV *
3978             _M_1_PIq ()
3979             CODE:
3980 1           RETVAL = _M_1_PIq (aTHX);
3981             OUTPUT: RETVAL
3982              
3983              
3984             SV *
3985             _M_2_PIq ()
3986             CODE:
3987 1           RETVAL = _M_2_PIq (aTHX);
3988             OUTPUT: RETVAL
3989              
3990              
3991             SV *
3992             _M_2_SQRTPIq ()
3993             CODE:
3994 1           RETVAL = _M_2_SQRTPIq (aTHX);
3995             OUTPUT: RETVAL
3996              
3997              
3998             SV *
3999             _M_SQRT2q ()
4000             CODE:
4001 1           RETVAL = _M_SQRT2q (aTHX);
4002             OUTPUT: RETVAL
4003              
4004              
4005             SV *
4006             _M_SQRT1_2q ()
4007             CODE:
4008 1           RETVAL = _M_SQRT1_2q (aTHX);
4009             OUTPUT: RETVAL
4010              
4011              
4012             void
4013             _f128_bytes (sv)
4014             SV * sv
4015             PREINIT:
4016             I32* temp;
4017             PPCODE:
4018 1           temp = PL_markstack_ptr++;
4019 1           _f128_bytes(aTHX_ sv);
4020 1 50         if (PL_markstack_ptr != temp) {
4021             /* truly void, because dXSARGS not invoked */
4022 0           PL_markstack_ptr = temp;
4023 0           XSRETURN_EMPTY; /* return empty stack */
4024             }
4025             /* must have used dXSARGS; list context implied */
4026 1           return; /* assume stack size is correct */
4027              
4028             void
4029             acos_F128 (rop, op)
4030             float128 * rop
4031             float128 * op
4032             PREINIT:
4033             I32* temp;
4034             PPCODE:
4035 1           temp = PL_markstack_ptr++;
4036 1           acos_F128(rop, op);
4037 1 50         if (PL_markstack_ptr != temp) {
4038             /* truly void, because dXSARGS not invoked */
4039 1           PL_markstack_ptr = temp;
4040 1           XSRETURN_EMPTY; /* return empty stack */
4041             }
4042             /* must have used dXSARGS; list context implied */
4043 0           return; /* assume stack size is correct */
4044              
4045             void
4046             acosh_F128 (rop, op)
4047             float128 * rop
4048             float128 * op
4049             PREINIT:
4050             I32* temp;
4051             PPCODE:
4052 1           temp = PL_markstack_ptr++;
4053 1           acosh_F128(rop, op);
4054 1 50         if (PL_markstack_ptr != temp) {
4055             /* truly void, because dXSARGS not invoked */
4056 1           PL_markstack_ptr = temp;
4057 1           XSRETURN_EMPTY; /* return empty stack */
4058             }
4059             /* must have used dXSARGS; list context implied */
4060 0           return; /* assume stack size is correct */
4061              
4062             void
4063             asin_F128 (rop, op)
4064             float128 * rop
4065             float128 * op
4066             PREINIT:
4067             I32* temp;
4068             PPCODE:
4069 1           temp = PL_markstack_ptr++;
4070 1           asin_F128(rop, op);
4071 1 50         if (PL_markstack_ptr != temp) {
4072             /* truly void, because dXSARGS not invoked */
4073 1           PL_markstack_ptr = temp;
4074 1           XSRETURN_EMPTY; /* return empty stack */
4075             }
4076             /* must have used dXSARGS; list context implied */
4077 0           return; /* assume stack size is correct */
4078              
4079             void
4080             asinh_F128 (rop, op)
4081             float128 * rop
4082             float128 * op
4083             PREINIT:
4084             I32* temp;
4085             PPCODE:
4086 1           temp = PL_markstack_ptr++;
4087 1           asinh_F128(rop, op);
4088 1 50         if (PL_markstack_ptr != temp) {
4089             /* truly void, because dXSARGS not invoked */
4090 1           PL_markstack_ptr = temp;
4091 1           XSRETURN_EMPTY; /* return empty stack */
4092             }
4093             /* must have used dXSARGS; list context implied */
4094 0           return; /* assume stack size is correct */
4095              
4096             void
4097             atan_F128 (rop, op)
4098             float128 * rop
4099             float128 * op
4100             PREINIT:
4101             I32* temp;
4102             PPCODE:
4103 1           temp = PL_markstack_ptr++;
4104 1           atan_F128(rop, op);
4105 1 50         if (PL_markstack_ptr != temp) {
4106             /* truly void, because dXSARGS not invoked */
4107 1           PL_markstack_ptr = temp;
4108 1           XSRETURN_EMPTY; /* return empty stack */
4109             }
4110             /* must have used dXSARGS; list context implied */
4111 0           return; /* assume stack size is correct */
4112              
4113             void
4114             atanh_F128 (rop, op)
4115             float128 * rop
4116             float128 * op
4117             PREINIT:
4118             I32* temp;
4119             PPCODE:
4120 1           temp = PL_markstack_ptr++;
4121 1           atanh_F128(rop, op);
4122 1 50         if (PL_markstack_ptr != temp) {
4123             /* truly void, because dXSARGS not invoked */
4124 1           PL_markstack_ptr = temp;
4125 1           XSRETURN_EMPTY; /* return empty stack */
4126             }
4127             /* must have used dXSARGS; list context implied */
4128 0           return; /* assume stack size is correct */
4129              
4130             void
4131             atan2_F128 (rop, op1, op2)
4132             float128 * rop
4133             float128 * op1
4134             float128 * op2
4135             PREINIT:
4136             I32* temp;
4137             PPCODE:
4138 1           temp = PL_markstack_ptr++;
4139 1           atan2_F128(rop, op1, op2);
4140 1 50         if (PL_markstack_ptr != temp) {
4141             /* truly void, because dXSARGS not invoked */
4142 1           PL_markstack_ptr = temp;
4143 1           XSRETURN_EMPTY; /* return empty stack */
4144             }
4145             /* must have used dXSARGS; list context implied */
4146 0           return; /* assume stack size is correct */
4147              
4148             void
4149             cbrt_F128 (rop, op)
4150             float128 * rop
4151             float128 * op
4152             PREINIT:
4153             I32* temp;
4154             PPCODE:
4155 1           temp = PL_markstack_ptr++;
4156 1           cbrt_F128(rop, op);
4157 1 50         if (PL_markstack_ptr != temp) {
4158             /* truly void, because dXSARGS not invoked */
4159 1           PL_markstack_ptr = temp;
4160 1           XSRETURN_EMPTY; /* return empty stack */
4161             }
4162             /* must have used dXSARGS; list context implied */
4163 0           return; /* assume stack size is correct */
4164              
4165             void
4166             ceil_F128 (rop, op)
4167             float128 * rop
4168             float128 * op
4169             PREINIT:
4170             I32* temp;
4171             PPCODE:
4172 2           temp = PL_markstack_ptr++;
4173 2           ceil_F128(rop, op);
4174 2 50         if (PL_markstack_ptr != temp) {
4175             /* truly void, because dXSARGS not invoked */
4176 2           PL_markstack_ptr = temp;
4177 2           XSRETURN_EMPTY; /* return empty stack */
4178             }
4179             /* must have used dXSARGS; list context implied */
4180 0           return; /* assume stack size is correct */
4181              
4182             void
4183             copysign_F128 (rop, op1, op2)
4184             float128 * rop
4185             float128 * op1
4186             float128 * op2
4187             PREINIT:
4188             I32* temp;
4189             PPCODE:
4190 4           temp = PL_markstack_ptr++;
4191 4           copysign_F128(rop, op1, op2);
4192 4 50         if (PL_markstack_ptr != temp) {
4193             /* truly void, because dXSARGS not invoked */
4194 4           PL_markstack_ptr = temp;
4195 4           XSRETURN_EMPTY; /* return empty stack */
4196             }
4197             /* must have used dXSARGS; list context implied */
4198 0           return; /* assume stack size is correct */
4199              
4200             void
4201             cosh_F128 (rop, op)
4202             float128 * rop
4203             float128 * op
4204             PREINIT:
4205             I32* temp;
4206             PPCODE:
4207 1           temp = PL_markstack_ptr++;
4208 1           cosh_F128(rop, op);
4209 1 50         if (PL_markstack_ptr != temp) {
4210             /* truly void, because dXSARGS not invoked */
4211 1           PL_markstack_ptr = temp;
4212 1           XSRETURN_EMPTY; /* return empty stack */
4213             }
4214             /* must have used dXSARGS; list context implied */
4215 0           return; /* assume stack size is correct */
4216              
4217             void
4218             cos_F128 (rop, op)
4219             float128 * rop
4220             float128 * op
4221             PREINIT:
4222             I32* temp;
4223             PPCODE:
4224 1           temp = PL_markstack_ptr++;
4225 1           cos_F128(rop, op);
4226 1 50         if (PL_markstack_ptr != temp) {
4227             /* truly void, because dXSARGS not invoked */
4228 1           PL_markstack_ptr = temp;
4229 1           XSRETURN_EMPTY; /* return empty stack */
4230             }
4231             /* must have used dXSARGS; list context implied */
4232 0           return; /* assume stack size is correct */
4233              
4234             void
4235             erf_F128 (rop, op)
4236             float128 * rop
4237             float128 * op
4238             PREINIT:
4239             I32* temp;
4240             PPCODE:
4241 1           temp = PL_markstack_ptr++;
4242 1           erf_F128(rop, op);
4243 1 50         if (PL_markstack_ptr != temp) {
4244             /* truly void, because dXSARGS not invoked */
4245 1           PL_markstack_ptr = temp;
4246 1           XSRETURN_EMPTY; /* return empty stack */
4247             }
4248             /* must have used dXSARGS; list context implied */
4249 0           return; /* assume stack size is correct */
4250              
4251             void
4252             erfc_F128 (rop, op)
4253             float128 * rop
4254             float128 * op
4255             PREINIT:
4256             I32* temp;
4257             PPCODE:
4258 1           temp = PL_markstack_ptr++;
4259 1           erfc_F128(rop, op);
4260 1 50         if (PL_markstack_ptr != temp) {
4261             /* truly void, because dXSARGS not invoked */
4262 1           PL_markstack_ptr = temp;
4263 1           XSRETURN_EMPTY; /* return empty stack */
4264             }
4265             /* must have used dXSARGS; list context implied */
4266 0           return; /* assume stack size is correct */
4267              
4268             void
4269             exp_F128 (rop, op)
4270             float128 * rop
4271             float128 * op
4272             PREINIT:
4273             I32* temp;
4274             PPCODE:
4275 1           temp = PL_markstack_ptr++;
4276 1           exp_F128(rop, op);
4277 1 50         if (PL_markstack_ptr != temp) {
4278             /* truly void, because dXSARGS not invoked */
4279 1           PL_markstack_ptr = temp;
4280 1           XSRETURN_EMPTY; /* return empty stack */
4281             }
4282             /* must have used dXSARGS; list context implied */
4283 0           return; /* assume stack size is correct */
4284              
4285             void
4286             expm1_F128 (rop, op)
4287             float128 * rop
4288             float128 * op
4289             PREINIT:
4290             I32* temp;
4291             PPCODE:
4292 1           temp = PL_markstack_ptr++;
4293 1           expm1_F128(rop, op);
4294 1 50         if (PL_markstack_ptr != temp) {
4295             /* truly void, because dXSARGS not invoked */
4296 1           PL_markstack_ptr = temp;
4297 1           XSRETURN_EMPTY; /* return empty stack */
4298             }
4299             /* must have used dXSARGS; list context implied */
4300 0           return; /* assume stack size is correct */
4301              
4302             void
4303             fabs_F128 (rop, op)
4304             float128 * rop
4305             float128 * op
4306             PREINIT:
4307             I32* temp;
4308             PPCODE:
4309 1           temp = PL_markstack_ptr++;
4310 1           fabs_F128(rop, op);
4311 1 50         if (PL_markstack_ptr != temp) {
4312             /* truly void, because dXSARGS not invoked */
4313 1           PL_markstack_ptr = temp;
4314 1           XSRETURN_EMPTY; /* return empty stack */
4315             }
4316             /* must have used dXSARGS; list context implied */
4317 0           return; /* assume stack size is correct */
4318              
4319             void
4320             fdim_F128 (rop, op1, op2)
4321             float128 * rop
4322             float128 * op1
4323             float128 * op2
4324             PREINIT:
4325             I32* temp;
4326             PPCODE:
4327 2           temp = PL_markstack_ptr++;
4328 2           fdim_F128(rop, op1, op2);
4329 2 50         if (PL_markstack_ptr != temp) {
4330             /* truly void, because dXSARGS not invoked */
4331 2           PL_markstack_ptr = temp;
4332 2           XSRETURN_EMPTY; /* return empty stack */
4333             }
4334             /* must have used dXSARGS; list context implied */
4335 0           return; /* assume stack size is correct */
4336              
4337             int
4338             finite_F128 (op)
4339             float128 * op
4340              
4341             void
4342             floor_F128 (rop, op)
4343             float128 * rop
4344             float128 * op
4345             PREINIT:
4346             I32* temp;
4347             PPCODE:
4348 2           temp = PL_markstack_ptr++;
4349 2           floor_F128(rop, op);
4350 2 50         if (PL_markstack_ptr != temp) {
4351             /* truly void, because dXSARGS not invoked */
4352 2           PL_markstack_ptr = temp;
4353 2           XSRETURN_EMPTY; /* return empty stack */
4354             }
4355             /* must have used dXSARGS; list context implied */
4356 0           return; /* assume stack size is correct */
4357              
4358             void
4359             fma_F128 (rop, op1, op2, op3)
4360             float128 * rop
4361             float128 * op1
4362             float128 * op2
4363             float128 * op3
4364             PREINIT:
4365             I32* temp;
4366             PPCODE:
4367 1           temp = PL_markstack_ptr++;
4368 1           fma_F128(rop, op1, op2, op3);
4369 1 50         if (PL_markstack_ptr != temp) {
4370             /* truly void, because dXSARGS not invoked */
4371 1           PL_markstack_ptr = temp;
4372 1           XSRETURN_EMPTY; /* return empty stack */
4373             }
4374             /* must have used dXSARGS; list context implied */
4375 0           return; /* assume stack size is correct */
4376              
4377             void
4378             fmax_F128 (rop, op1, op2)
4379             float128 * rop
4380             float128 * op1
4381             float128 * op2
4382             PREINIT:
4383             I32* temp;
4384             PPCODE:
4385 1           temp = PL_markstack_ptr++;
4386 1           fmax_F128(rop, op1, op2);
4387 1 50         if (PL_markstack_ptr != temp) {
4388             /* truly void, because dXSARGS not invoked */
4389 1           PL_markstack_ptr = temp;
4390 1           XSRETURN_EMPTY; /* return empty stack */
4391             }
4392             /* must have used dXSARGS; list context implied */
4393 0           return; /* assume stack size is correct */
4394              
4395             void
4396             fmin_F128 (rop, op1, op2)
4397             float128 * rop
4398             float128 * op1
4399             float128 * op2
4400             PREINIT:
4401             I32* temp;
4402             PPCODE:
4403 1           temp = PL_markstack_ptr++;
4404 1           fmin_F128(rop, op1, op2);
4405 1 50         if (PL_markstack_ptr != temp) {
4406             /* truly void, because dXSARGS not invoked */
4407 1           PL_markstack_ptr = temp;
4408 1           XSRETURN_EMPTY; /* return empty stack */
4409             }
4410             /* must have used dXSARGS; list context implied */
4411 0           return; /* assume stack size is correct */
4412              
4413             void
4414             fmod_F128 (rop, op1, op2)
4415             float128 * rop
4416             float128 * op1
4417             float128 * op2
4418             PREINIT:
4419             I32* temp;
4420             PPCODE:
4421 1           temp = PL_markstack_ptr++;
4422 1           fmod_F128(rop, op1, op2);
4423 1 50         if (PL_markstack_ptr != temp) {
4424             /* truly void, because dXSARGS not invoked */
4425 1           PL_markstack_ptr = temp;
4426 1           XSRETURN_EMPTY; /* return empty stack */
4427             }
4428             /* must have used dXSARGS; list context implied */
4429 0           return; /* assume stack size is correct */
4430              
4431             void
4432             hypot_F128 (rop, op1, op2)
4433             float128 * rop
4434             float128 * op1
4435             float128 * op2
4436             PREINIT:
4437             I32* temp;
4438             PPCODE:
4439 1           temp = PL_markstack_ptr++;
4440 1           hypot_F128(rop, op1, op2);
4441 1 50         if (PL_markstack_ptr != temp) {
4442             /* truly void, because dXSARGS not invoked */
4443 1           PL_markstack_ptr = temp;
4444 1           XSRETURN_EMPTY; /* return empty stack */
4445             }
4446             /* must have used dXSARGS; list context implied */
4447 0           return; /* assume stack size is correct */
4448              
4449             void
4450             frexp_F128 (frac, exp, op)
4451             float128 * frac
4452             SV * exp
4453             float128 * op
4454             PREINIT:
4455             I32* temp;
4456             PPCODE:
4457 1           temp = PL_markstack_ptr++;
4458 1           frexp_F128(aTHX_ frac, exp, op);
4459 1 50         if (PL_markstack_ptr != temp) {
4460             /* truly void, because dXSARGS not invoked */
4461 1           PL_markstack_ptr = temp;
4462 1           XSRETURN_EMPTY; /* return empty stack */
4463             }
4464             /* must have used dXSARGS; list context implied */
4465 0           return; /* assume stack size is correct */
4466              
4467             void
4468             ldexp_F128 (rop, op, pow)
4469             float128 * rop
4470             float128 * op
4471             int pow
4472             PREINIT:
4473             I32* temp;
4474             PPCODE:
4475 1           temp = PL_markstack_ptr++;
4476 1           ldexp_F128(rop, op, pow);
4477 1 50         if (PL_markstack_ptr != temp) {
4478             /* truly void, because dXSARGS not invoked */
4479 1           PL_markstack_ptr = temp;
4480 1           XSRETURN_EMPTY; /* return empty stack */
4481             }
4482             /* must have used dXSARGS; list context implied */
4483 0           return; /* assume stack size is correct */
4484              
4485             int
4486             isinf_F128 (op)
4487             float128 * op
4488              
4489             int
4490             ilogb_F128 (op)
4491             float128 * op
4492              
4493             int
4494             isnan_F128 (op)
4495             float128 * op
4496              
4497             void
4498             j0_F128 (rop, op)
4499             float128 * rop
4500             float128 * op
4501             PREINIT:
4502             I32* temp;
4503             PPCODE:
4504 1           temp = PL_markstack_ptr++;
4505 1           j0_F128(rop, op);
4506 1 50         if (PL_markstack_ptr != temp) {
4507             /* truly void, because dXSARGS not invoked */
4508 1           PL_markstack_ptr = temp;
4509 1           XSRETURN_EMPTY; /* return empty stack */
4510             }
4511             /* must have used dXSARGS; list context implied */
4512 0           return; /* assume stack size is correct */
4513              
4514             void
4515             j1_F128 (rop, op)
4516             float128 * rop
4517             float128 * op
4518             PREINIT:
4519             I32* temp;
4520             PPCODE:
4521 1           temp = PL_markstack_ptr++;
4522 1           j1_F128(rop, op);
4523 1 50         if (PL_markstack_ptr != temp) {
4524             /* truly void, because dXSARGS not invoked */
4525 1           PL_markstack_ptr = temp;
4526 1           XSRETURN_EMPTY; /* return empty stack */
4527             }
4528             /* must have used dXSARGS; list context implied */
4529 0           return; /* assume stack size is correct */
4530              
4531             void
4532             jn_F128 (rop, n, op)
4533             float128 * rop
4534             int n
4535             float128 * op
4536             PREINIT:
4537             I32* temp;
4538             PPCODE:
4539 1           temp = PL_markstack_ptr++;
4540 1           jn_F128(rop, n, op);
4541 1 50         if (PL_markstack_ptr != temp) {
4542             /* truly void, because dXSARGS not invoked */
4543 1           PL_markstack_ptr = temp;
4544 1           XSRETURN_EMPTY; /* return empty stack */
4545             }
4546             /* must have used dXSARGS; list context implied */
4547 0           return; /* assume stack size is correct */
4548              
4549             void
4550             lgamma_F128 (rop, op)
4551             float128 * rop
4552             float128 * op
4553             PREINIT:
4554             I32* temp;
4555             PPCODE:
4556 1           temp = PL_markstack_ptr++;
4557 1           lgamma_F128(rop, op);
4558 1 50         if (PL_markstack_ptr != temp) {
4559             /* truly void, because dXSARGS not invoked */
4560 1           PL_markstack_ptr = temp;
4561 1           XSRETURN_EMPTY; /* return empty stack */
4562             }
4563             /* must have used dXSARGS; list context implied */
4564 0           return; /* assume stack size is correct */
4565              
4566             SV *
4567             llrint_F128 (op)
4568             float128 * op
4569             CODE:
4570 2           RETVAL = llrint_F128 (aTHX_ op);
4571             OUTPUT: RETVAL
4572              
4573             SV *
4574             llround_F128 (op)
4575             float128 * op
4576             CODE:
4577 2           RETVAL = llround_F128 (aTHX_ op);
4578             OUTPUT: RETVAL
4579              
4580             SV *
4581             lrint_F128 (op)
4582             float128 * op
4583             CODE:
4584 2           RETVAL = lrint_F128 (aTHX_ op);
4585             OUTPUT: RETVAL
4586              
4587             SV *
4588             lround_F128 (op)
4589             float128 * op
4590             CODE:
4591 2           RETVAL = lround_F128 (aTHX_ op);
4592             OUTPUT: RETVAL
4593              
4594             void
4595             log_F128 (rop, op)
4596             float128 * rop
4597             float128 * op
4598             PREINIT:
4599             I32* temp;
4600             PPCODE:
4601 1           temp = PL_markstack_ptr++;
4602 1           log_F128(rop, op);
4603 1 50         if (PL_markstack_ptr != temp) {
4604             /* truly void, because dXSARGS not invoked */
4605 1           PL_markstack_ptr = temp;
4606 1           XSRETURN_EMPTY; /* return empty stack */
4607             }
4608             /* must have used dXSARGS; list context implied */
4609 0           return; /* assume stack size is correct */
4610              
4611             void
4612             log10_F128 (rop, op)
4613             float128 * rop
4614             float128 * op
4615             PREINIT:
4616             I32* temp;
4617             PPCODE:
4618 1           temp = PL_markstack_ptr++;
4619 1           log10_F128(rop, op);
4620 1 50         if (PL_markstack_ptr != temp) {
4621             /* truly void, because dXSARGS not invoked */
4622 1           PL_markstack_ptr = temp;
4623 1           XSRETURN_EMPTY; /* return empty stack */
4624             }
4625             /* must have used dXSARGS; list context implied */
4626 0           return; /* assume stack size is correct */
4627              
4628             void
4629             log2_F128 (rop, op)
4630             float128 * rop
4631             float128 * op
4632             PREINIT:
4633             I32* temp;
4634             PPCODE:
4635 1           temp = PL_markstack_ptr++;
4636 1           log2_F128(rop, op);
4637 1 50         if (PL_markstack_ptr != temp) {
4638             /* truly void, because dXSARGS not invoked */
4639 1           PL_markstack_ptr = temp;
4640 1           XSRETURN_EMPTY; /* return empty stack */
4641             }
4642             /* must have used dXSARGS; list context implied */
4643 0           return; /* assume stack size is correct */
4644              
4645             void
4646             log1p_F128 (rop, op)
4647             float128 * rop
4648             float128 * op
4649             PREINIT:
4650             I32* temp;
4651             PPCODE:
4652 1           temp = PL_markstack_ptr++;
4653 1           log1p_F128(rop, op);
4654 1 50         if (PL_markstack_ptr != temp) {
4655             /* truly void, because dXSARGS not invoked */
4656 1           PL_markstack_ptr = temp;
4657 1           XSRETURN_EMPTY; /* return empty stack */
4658             }
4659             /* must have used dXSARGS; list context implied */
4660 0           return; /* assume stack size is correct */
4661              
4662             void
4663             modf_F128 (integer, frac, op)
4664             float128 * integer
4665             float128 * frac
4666             float128 * op
4667             PREINIT:
4668             I32* temp;
4669             PPCODE:
4670 1           temp = PL_markstack_ptr++;
4671 1           modf_F128(integer, frac, op);
4672 1 50         if (PL_markstack_ptr != temp) {
4673             /* truly void, because dXSARGS not invoked */
4674 1           PL_markstack_ptr = temp;
4675 1           XSRETURN_EMPTY; /* return empty stack */
4676             }
4677             /* must have used dXSARGS; list context implied */
4678 0           return; /* assume stack size is correct */
4679              
4680             void
4681             nan_F128 (rop, op)
4682             float128 * rop
4683             SV * op
4684             PREINIT:
4685             I32* temp;
4686             PPCODE:
4687 1           temp = PL_markstack_ptr++;
4688 1           nan_F128(aTHX_ rop, op);
4689 1 50         if (PL_markstack_ptr != temp) {
4690             /* truly void, because dXSARGS not invoked */
4691 1           PL_markstack_ptr = temp;
4692 1           XSRETURN_EMPTY; /* return empty stack */
4693             }
4694             /* must have used dXSARGS; list context implied */
4695 0           return; /* assume stack size is correct */
4696              
4697             void
4698             nearbyint_F128 (rop, op)
4699             float128 * rop
4700             float128 * op
4701             PREINIT:
4702             I32* temp;
4703             PPCODE:
4704 6           temp = PL_markstack_ptr++;
4705 6           nearbyint_F128(rop, op);
4706 6 50         if (PL_markstack_ptr != temp) {
4707             /* truly void, because dXSARGS not invoked */
4708 6           PL_markstack_ptr = temp;
4709 6           XSRETURN_EMPTY; /* return empty stack */
4710             }
4711             /* must have used dXSARGS; list context implied */
4712 0           return; /* assume stack size is correct */
4713              
4714             void
4715             nextafter_F128 (rop, op1, op2)
4716             float128 * rop
4717             float128 * op1
4718             float128 * op2
4719             PREINIT:
4720             I32* temp;
4721             PPCODE:
4722 2           temp = PL_markstack_ptr++;
4723 2           nextafter_F128(rop, op1, op2);
4724 2 50         if (PL_markstack_ptr != temp) {
4725             /* truly void, because dXSARGS not invoked */
4726 2           PL_markstack_ptr = temp;
4727 2           XSRETURN_EMPTY; /* return empty stack */
4728             }
4729             /* must have used dXSARGS; list context implied */
4730 0           return; /* assume stack size is correct */
4731              
4732             void
4733             pow_F128 (rop, op1, op2)
4734             float128 * rop
4735             float128 * op1
4736             float128 * op2
4737             PREINIT:
4738             I32* temp;
4739             PPCODE:
4740 1           temp = PL_markstack_ptr++;
4741 1           pow_F128(rop, op1, op2);
4742 1 50         if (PL_markstack_ptr != temp) {
4743             /* truly void, because dXSARGS not invoked */
4744 1           PL_markstack_ptr = temp;
4745 1           XSRETURN_EMPTY; /* return empty stack */
4746             }
4747             /* must have used dXSARGS; list context implied */
4748 0           return; /* assume stack size is correct */
4749              
4750             void
4751             remainder_F128 (rop, op1, op2)
4752             float128 * rop
4753             float128 * op1
4754             float128 * op2
4755             PREINIT:
4756             I32* temp;
4757             PPCODE:
4758 1           temp = PL_markstack_ptr++;
4759 1           remainder_F128(rop, op1, op2);
4760 1 50         if (PL_markstack_ptr != temp) {
4761             /* truly void, because dXSARGS not invoked */
4762 1           PL_markstack_ptr = temp;
4763 1           XSRETURN_EMPTY; /* return empty stack */
4764             }
4765             /* must have used dXSARGS; list context implied */
4766 0           return; /* assume stack size is correct */
4767              
4768             void
4769             remquo_F128 (rop1, rop2, op1, op2)
4770             float128 * rop1
4771             SV * rop2
4772             float128 * op1
4773             float128 * op2
4774             PREINIT:
4775             I32* temp;
4776             PPCODE:
4777 1           temp = PL_markstack_ptr++;
4778 1           remquo_F128(aTHX_ rop1, rop2, op1, op2);
4779 1 50         if (PL_markstack_ptr != temp) {
4780             /* truly void, because dXSARGS not invoked */
4781 1           PL_markstack_ptr = temp;
4782 1           XSRETURN_EMPTY; /* return empty stack */
4783             }
4784             /* must have used dXSARGS; list context implied */
4785 0           return; /* assume stack size is correct */
4786              
4787             void
4788             rint_F128 (rop, op)
4789             float128 * rop
4790             float128 * op
4791             PREINIT:
4792             I32* temp;
4793             PPCODE:
4794 2           temp = PL_markstack_ptr++;
4795 2           rint_F128(rop, op);
4796 2 50         if (PL_markstack_ptr != temp) {
4797             /* truly void, because dXSARGS not invoked */
4798 2           PL_markstack_ptr = temp;
4799 2           XSRETURN_EMPTY; /* return empty stack */
4800             }
4801             /* must have used dXSARGS; list context implied */
4802 0           return; /* assume stack size is correct */
4803              
4804             void
4805             round_F128 (rop, op)
4806             float128 * rop
4807             float128 * op
4808             PREINIT:
4809             I32* temp;
4810             PPCODE:
4811 2           temp = PL_markstack_ptr++;
4812 2           round_F128(rop, op);
4813 2 50         if (PL_markstack_ptr != temp) {
4814             /* truly void, because dXSARGS not invoked */
4815 2           PL_markstack_ptr = temp;
4816 2           XSRETURN_EMPTY; /* return empty stack */
4817             }
4818             /* must have used dXSARGS; list context implied */
4819 0           return; /* assume stack size is correct */
4820              
4821             void
4822             scalbln_F128 (rop, op1, op2)
4823             float128 * rop
4824             float128 * op1
4825             long op2
4826             PREINIT:
4827             I32* temp;
4828             PPCODE:
4829 1           temp = PL_markstack_ptr++;
4830 1           scalbln_F128(rop, op1, op2);
4831 1 50         if (PL_markstack_ptr != temp) {
4832             /* truly void, because dXSARGS not invoked */
4833 1           PL_markstack_ptr = temp;
4834 1           XSRETURN_EMPTY; /* return empty stack */
4835             }
4836             /* must have used dXSARGS; list context implied */
4837 0           return; /* assume stack size is correct */
4838              
4839             void
4840             scalbn_F128 (rop, op1, op2)
4841             float128 * rop
4842             float128 * op1
4843             int op2
4844             PREINIT:
4845             I32* temp;
4846             PPCODE:
4847 1           temp = PL_markstack_ptr++;
4848 1           scalbn_F128(rop, op1, op2);
4849 1 50         if (PL_markstack_ptr != temp) {
4850             /* truly void, because dXSARGS not invoked */
4851 1           PL_markstack_ptr = temp;
4852 1           XSRETURN_EMPTY; /* return empty stack */
4853             }
4854             /* must have used dXSARGS; list context implied */
4855 0           return; /* assume stack size is correct */
4856              
4857             int
4858             signbit_F128 (op)
4859             float128 * op
4860              
4861             void
4862             sincos_F128 (sin, cos, op)
4863             float128 * sin
4864             float128 * cos
4865             float128 * op
4866             PREINIT:
4867             I32* temp;
4868             PPCODE:
4869 1           temp = PL_markstack_ptr++;
4870 1           sincos_F128(sin, cos, op);
4871 1 50         if (PL_markstack_ptr != temp) {
4872             /* truly void, because dXSARGS not invoked */
4873 1           PL_markstack_ptr = temp;
4874 1           XSRETURN_EMPTY; /* return empty stack */
4875             }
4876             /* must have used dXSARGS; list context implied */
4877 0           return; /* assume stack size is correct */
4878              
4879             void
4880             sinh_F128 (rop, op)
4881             float128 * rop
4882             float128 * op
4883             PREINIT:
4884             I32* temp;
4885             PPCODE:
4886 1           temp = PL_markstack_ptr++;
4887 1           sinh_F128(rop, op);
4888 1 50         if (PL_markstack_ptr != temp) {
4889             /* truly void, because dXSARGS not invoked */
4890 1           PL_markstack_ptr = temp;
4891 1           XSRETURN_EMPTY; /* return empty stack */
4892             }
4893             /* must have used dXSARGS; list context implied */
4894 0           return; /* assume stack size is correct */
4895              
4896             void
4897             sin_F128 (rop, op)
4898             float128 * rop
4899             float128 * op
4900             PREINIT:
4901             I32* temp;
4902             PPCODE:
4903 1           temp = PL_markstack_ptr++;
4904 1           sin_F128(rop, op);
4905 1 50         if (PL_markstack_ptr != temp) {
4906             /* truly void, because dXSARGS not invoked */
4907 1           PL_markstack_ptr = temp;
4908 1           XSRETURN_EMPTY; /* return empty stack */
4909             }
4910             /* must have used dXSARGS; list context implied */
4911 0           return; /* assume stack size is correct */
4912              
4913             void
4914             sqrt_F128 (rop, op)
4915             float128 * rop
4916             float128 * op
4917             PREINIT:
4918             I32* temp;
4919             PPCODE:
4920 1           temp = PL_markstack_ptr++;
4921 1           sqrt_F128(rop, op);
4922 1 50         if (PL_markstack_ptr != temp) {
4923             /* truly void, because dXSARGS not invoked */
4924 1           PL_markstack_ptr = temp;
4925 1           XSRETURN_EMPTY; /* return empty stack */
4926             }
4927             /* must have used dXSARGS; list context implied */
4928 0           return; /* assume stack size is correct */
4929              
4930             void
4931             tan_F128 (rop, op)
4932             float128 * rop
4933             float128 * op
4934             PREINIT:
4935             I32* temp;
4936             PPCODE:
4937 1           temp = PL_markstack_ptr++;
4938 1           tan_F128(rop, op);
4939 1 50         if (PL_markstack_ptr != temp) {
4940             /* truly void, because dXSARGS not invoked */
4941 1           PL_markstack_ptr = temp;
4942 1           XSRETURN_EMPTY; /* return empty stack */
4943             }
4944             /* must have used dXSARGS; list context implied */
4945 0           return; /* assume stack size is correct */
4946              
4947             void
4948             tanh_F128 (rop, op)
4949             float128 * rop
4950             float128 * op
4951             PREINIT:
4952             I32* temp;
4953             PPCODE:
4954 1           temp = PL_markstack_ptr++;
4955 1           tanh_F128(rop, op);
4956 1 50         if (PL_markstack_ptr != temp) {
4957             /* truly void, because dXSARGS not invoked */
4958 1           PL_markstack_ptr = temp;
4959 1           XSRETURN_EMPTY; /* return empty stack */
4960             }
4961             /* must have used dXSARGS; list context implied */
4962 0           return; /* assume stack size is correct */
4963              
4964             void
4965             tgamma_F128 (rop, op)
4966             float128 * rop
4967             float128 * op
4968             PREINIT:
4969             I32* temp;
4970             PPCODE:
4971 1           temp = PL_markstack_ptr++;
4972 1           tgamma_F128(rop, op);
4973 1 50         if (PL_markstack_ptr != temp) {
4974             /* truly void, because dXSARGS not invoked */
4975 1           PL_markstack_ptr = temp;
4976 1           XSRETURN_EMPTY; /* return empty stack */
4977             }
4978             /* must have used dXSARGS; list context implied */
4979 0           return; /* assume stack size is correct */
4980              
4981             void
4982             trunc_F128 (rop, op)
4983             float128 * rop
4984             float128 * op
4985             PREINIT:
4986             I32* temp;
4987             PPCODE:
4988 1           temp = PL_markstack_ptr++;
4989 1           trunc_F128(rop, op);
4990 1 50         if (PL_markstack_ptr != temp) {
4991             /* truly void, because dXSARGS not invoked */
4992 1           PL_markstack_ptr = temp;
4993 1           XSRETURN_EMPTY; /* return empty stack */
4994             }
4995             /* must have used dXSARGS; list context implied */
4996 0           return; /* assume stack size is correct */
4997              
4998             void
4999             y0_F128 (rop, op)
5000             float128 * rop
5001             float128 * op
5002             PREINIT:
5003             I32* temp;
5004             PPCODE:
5005 1           temp = PL_markstack_ptr++;
5006 1           y0_F128(rop, op);
5007 1 50         if (PL_markstack_ptr != temp) {
5008             /* truly void, because dXSARGS not invoked */
5009 1           PL_markstack_ptr = temp;
5010 1           XSRETURN_EMPTY; /* return empty stack */
5011             }
5012             /* must have used dXSARGS; list context implied */
5013 0           return; /* assume stack size is correct */
5014              
5015             void
5016             y1_F128 (rop, op)
5017             float128 * rop
5018             float128 * op
5019             PREINIT:
5020             I32* temp;
5021             PPCODE:
5022 1           temp = PL_markstack_ptr++;
5023 1           y1_F128(rop, op);
5024 1 50         if (PL_markstack_ptr != temp) {
5025             /* truly void, because dXSARGS not invoked */
5026 1           PL_markstack_ptr = temp;
5027 1           XSRETURN_EMPTY; /* return empty stack */
5028             }
5029             /* must have used dXSARGS; list context implied */
5030 0           return; /* assume stack size is correct */
5031              
5032             void
5033             yn_F128 (rop, n, op)
5034             float128 * rop
5035             int n
5036             float128 * op
5037             PREINIT:
5038             I32* temp;
5039             PPCODE:
5040 1           temp = PL_markstack_ptr++;
5041 1           yn_F128(rop, n, op);
5042 1 50         if (PL_markstack_ptr != temp) {
5043             /* truly void, because dXSARGS not invoked */
5044 1           PL_markstack_ptr = temp;
5045 1           XSRETURN_EMPTY; /* return empty stack */
5046             }
5047             /* must have used dXSARGS; list context implied */
5048 0           return; /* assume stack size is correct */
5049              
5050             int
5051             _longlong2iv_is_ok ()
5052              
5053              
5054             int
5055             _long2iv_is_ok ()
5056              
5057              
5058             int
5059             _flt_radix ()
5060              
5061              
5062             SV *
5063             _fegetround ()
5064             CODE:
5065 1           RETVAL = _fegetround (aTHX);
5066             OUTPUT: RETVAL
5067              
5068              
5069             int
5070             nnumflag ()
5071              
5072              
5073             void
5074             clear_nnum ()
5075              
5076             PREINIT:
5077             I32* temp;
5078             PPCODE:
5079 1           temp = PL_markstack_ptr++;
5080 1           clear_nnum();
5081 1 50         if (PL_markstack_ptr != temp) {
5082             /* truly void, because dXSARGS not invoked */
5083 1           PL_markstack_ptr = temp;
5084 1           XSRETURN_EMPTY; /* return empty stack */
5085             }
5086             /* must have used dXSARGS; list context implied */
5087 0           return; /* assume stack size is correct */
5088              
5089             void
5090             set_nnum (x)
5091             int x
5092             PREINIT:
5093             I32* temp;
5094             PPCODE:
5095 1           temp = PL_markstack_ptr++;
5096 1           set_nnum(x);
5097 1 50         if (PL_markstack_ptr != temp) {
5098             /* truly void, because dXSARGS not invoked */
5099 1           PL_markstack_ptr = temp;
5100 1           XSRETURN_EMPTY; /* return empty stack */
5101             }
5102             /* must have used dXSARGS; list context implied */
5103 0           return; /* assume stack size is correct */
5104              
5105             int
5106             _lln (x)
5107             SV * x
5108             CODE:
5109 0           RETVAL = _lln (aTHX_ x);
5110             OUTPUT: RETVAL
5111              
5112             int
5113             nok_pokflag ()
5114              
5115              
5116             void
5117             clear_nok_pok ()
5118              
5119             PREINIT:
5120             I32* temp;
5121             PPCODE:
5122 0           temp = PL_markstack_ptr++;
5123 0           clear_nok_pok();
5124 0 0         if (PL_markstack_ptr != temp) {
5125             /* truly void, because dXSARGS not invoked */
5126 0           PL_markstack_ptr = temp;
5127 0           XSRETURN_EMPTY; /* return empty stack */
5128             }
5129             /* must have used dXSARGS; list context implied */
5130 0           return; /* assume stack size is correct */
5131              
5132             void
5133             set_nok_pok (x)
5134             int x
5135             PREINIT:
5136             I32* temp;
5137             PPCODE:
5138 6           temp = PL_markstack_ptr++;
5139 6           set_nok_pok(x);
5140 6 50         if (PL_markstack_ptr != temp) {
5141             /* truly void, because dXSARGS not invoked */
5142 6           PL_markstack_ptr = temp;
5143 6           XSRETURN_EMPTY; /* return empty stack */
5144             }
5145             /* must have used dXSARGS; list context implied */
5146 0           return; /* assume stack size is correct */
5147              
5148             int
5149             _SvNOK (in)
5150             SV * in
5151             CODE:
5152 119           RETVAL = _SvNOK (aTHX_ in);
5153             OUTPUT: RETVAL
5154              
5155             int
5156             _SvPOK (in)
5157             SV * in
5158             CODE:
5159 20           RETVAL = _SvPOK (aTHX_ in);
5160             OUTPUT: RETVAL
5161              
5162             int
5163             _avoid_inf_cast ()
5164              
5165              
5166             int
5167             _has_pv_nv_bug ()
5168              
5169