File Coverage

Float32.xs
Criterion Covered Total %
statement 270 314 85.9
branch 98 148 66.2
condition n/a
subroutine n/a
pod n/a
total 368 462 79.6


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             #define TYPE_PRECISION 24
15             #define TYPE_EMIN -148
16             #define TYPE_EMAX 128
17              
18              
19 27512           SV * _itsa(pTHX_ SV * a) {
20 27512 100         if(SvIOK(a)) {
21 399           return newSVuv(2); /* IV */
22             }
23 27113 100         if(SvPOK(a)) {
24 18048           return newSVuv(4); /* PV */
25             }
26 9065 100         if(SvNOK(a)) return newSVuv(3); /* NV */
27 8671 50         if(sv_isobject(a)) {
28 8671 50         const char* h = HvNAME(SvSTASH(SvRV(a)));
    50          
    50          
    0          
    50          
    50          
29 8671 50         if(strEQ(h, "Math::Bfloat16")) return newSVuv(20);
30 8671 50         if(strEQ(h, "Math::Float32")) return newSVuv(22);
31             }
32 0           croak("The Math::Float32::_itsa XSub has been given an invalid argument (probably undefined)");
33             }
34              
35 111           int is_flt_nan( float * obj) {
36 111 100         if(*obj == *obj) return 0;
37 47           return 1;
38             }
39              
40 16           int is_flt_inf( float * obj) {
41 16 50         if(*obj == 0) return 0;
42 16 100         if(*obj / *obj != *obj / *obj) {
43 11 100         if(*obj > 0) return 1;
44 5           return -1;
45             }
46 5           return 0;
47             }
48              
49 8594           SV * _fromFloat32(pTHX_ float * in) {
50              
51             float * f_obj;
52             SV * obj_ref, * obj;
53              
54 8594           Newx(f_obj, 1, float);
55 8594 50         if(f_obj == NULL) croak("Failed to allocate memory in _fromFloat32 function");
56 8594           obj_ref = newSV(0);
57 8594           obj = newSVrv(obj_ref, "Math::Float32");
58              
59 8594           *f_obj = *in;
60              
61 8594           sv_setiv(obj, INT2PTR(IV,f_obj));
62 8594           SvREADONLY_on(obj);
63 8594           return obj_ref;
64             }
65              
66 394           SV * _fromNV(pTHX_ SV * in) {
67              
68             float * f_obj;
69             SV * obj_ref, * obj;
70              
71 394           Newx(f_obj, 1, float);
72 394 50         if(f_obj == NULL) croak("Failed to allocate memory in _fromNV function");
73 394           obj_ref = newSV(0);
74 394           obj = newSVrv(obj_ref, "Math::Float32");
75              
76 394           *f_obj = (float)SvNV(in);
77              
78 394           sv_setiv(obj, INT2PTR(IV,f_obj));
79 394           SvREADONLY_on(obj);
80 394           return obj_ref;
81             }
82              
83 399           SV * _fromIV(pTHX_ SV * in) {
84              
85             float * f_obj;
86             SV * obj_ref, * obj;
87              
88 399           Newx(f_obj, 1, float);
89 399 50         if(f_obj == NULL) croak("Failed to allocate memory in _fromIV function");
90 399           obj_ref = newSV(0);
91 399           obj = newSVrv(obj_ref, "Math::Float32");
92              
93 399 100         if(SvUOK(in)) *f_obj = ( float)SvUV(in);
94 398           else *f_obj = ( float)SvIV(in);
95              
96 399           sv_setiv(obj, INT2PTR(IV,f_obj));
97 399           SvREADONLY_on(obj);
98 399           return obj_ref;
99             }
100              
101 9039           SV * _fromPV(pTHX_ SV * in) {
102              
103             float * f_obj;
104             SV * obj_ref, * obj;
105              
106 9039           Newx(f_obj, 1, float);
107 9039 50         if(f_obj == NULL) croak("Failed to allocate memory in _fromPV function");
108 9039           obj_ref = newSV(0);
109 9039           obj = newSVrv(obj_ref, "Math::Float32");
110              
111 9039           *f_obj = strtof(SvPV_nolen(in), NULL);
112              
113 9039           sv_setiv(obj, INT2PTR(IV,f_obj));
114 9039           SvREADONLY_on(obj);
115 9039           return obj_ref;
116             }
117              
118 278           SV * flt_to_NV(pTHX_ float * obj) {
119 278           return newSVnv(*obj);
120             }
121              
122 1           void _flt_set( float * a, float * b) {
123 1           *a = *b;
124 1           }
125              
126 0           void flt_set_nan( float * a) {
127 0           *a = strtof("NaN", NULL);
128 0           }
129              
130 1           void flt_set_inf( float * a, int is_pos) {
131 1 50         if(is_pos > 0) *a = strtof("Inf", NULL);
132 0           else *a = strtof("-Inf", NULL);
133 1           }
134              
135 0           void flt_set_zero( float * a, int is_pos) {
136 0 0         if(is_pos > 0) *a = strtof("0.0", NULL);
137 0           else *a = strtof("-0.0", NULL);
138 0           }
139              
140              
141 101           SV * _oload_add(pTHX_ float * a, float * b, SV * third) {
142              
143             float * f_obj;
144             SV * obj_ref, * obj;
145              
146 101           Newx(f_obj, 1, float);
147 101 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_add function");
148 101           obj_ref = newSV(0);
149 101           obj = newSVrv(obj_ref, "Math::Float32");
150              
151 101           *f_obj = *a + *b;
152              
153 101           sv_setiv(obj, INT2PTR(IV,f_obj));
154 101           SvREADONLY_on(obj);
155 101           return obj_ref;
156             }
157              
158 181           SV * _oload_sub(pTHX_ float * a, float * b, SV * third) {
159              
160             float * f_obj;
161             SV * obj_ref, * obj;
162              
163 181           Newx(f_obj, 1, float);
164 181 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_sub function");
165 181           obj_ref = newSV(0);
166 181           obj = newSVrv(obj_ref, "Math::Float32");
167              
168 181 100         if(SvTRUE_nomg_NN(third)) *f_obj = *b - *a;
169 72           else *f_obj = *a - *b;
170              
171 181           sv_setiv(obj, INT2PTR(IV,f_obj));
172 181           SvREADONLY_on(obj);
173 181           return obj_ref;
174             }
175              
176 141           SV * _oload_mul(pTHX_ float * a, float * b, SV * third) {
177              
178             float * f_obj;
179             SV * obj_ref, * obj;
180              
181 141           Newx(f_obj, 1, float);
182 141 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_mul function");
183 141           obj_ref = newSV(0);
184 141           obj = newSVrv(obj_ref, "Math::Float32");
185              
186 141           *f_obj = *a * *b;
187              
188 141           sv_setiv(obj, INT2PTR(IV,f_obj));
189 141           SvREADONLY_on(obj);
190 141           return obj_ref;
191             }
192              
193 107           SV * _oload_div(pTHX_ float * a, float * b, SV * third) {
194              
195             float * f_obj;
196             SV * obj_ref, * obj;
197              
198 107           Newx(f_obj, 1, float);
199 107 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_div function");
200 107           obj_ref = newSV(0);
201 107           obj = newSVrv(obj_ref, "Math::Float32");
202              
203 107 100         if(SvTRUE_nomg_NN(third)) *f_obj = *b / *a;
204 70           else *f_obj = *a / *b;
205              
206 107           sv_setiv(obj, INT2PTR(IV,f_obj));
207 107           SvREADONLY_on(obj);
208 107           return obj_ref;
209             }
210              
211 12           SV * _oload_fmod(pTHX_ float * a, float * b, SV * third) {
212              
213             float * f_obj;
214             SV * obj_ref, * obj;
215              
216 12           Newx(f_obj, 1, float);
217 12 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_fmod function");
218 12           obj_ref = newSV(0);
219 12           obj = newSVrv(obj_ref, "Math::Float32");
220              
221 12 100         if(SvTRUE_nomg_NN(third)) *f_obj = fmodf(*b, *a);
222 11           else *f_obj = fmodf(*a, *b);
223              
224 12           sv_setiv(obj, INT2PTR(IV,f_obj));
225 12           SvREADONLY_on(obj);
226 12           return obj_ref;
227             }
228              
229 28           SV * _oload_pow(pTHX_ float * a, float * b, SV * third) {
230              
231             float * f_obj;
232             SV * obj_ref, * obj;
233              
234 28           Newx(f_obj, 1, float);
235 28 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_pow function");
236 28           obj_ref = newSV(0);
237 28           obj = newSVrv(obj_ref, "Math::Float32");
238              
239 28 100         if(SvTRUE_nomg_NN(third)) *f_obj = powf(*b, *a); /* b ** a */
240 26           else *f_obj = powf(*a, *b); /* a ** b */
241              
242 28           sv_setiv(obj, INT2PTR(IV,f_obj));
243 28           SvREADONLY_on(obj);
244 28           return obj_ref;
245             }
246              
247 8662           int _oload_equiv( float * a, float * b, SV * third) {
248 8662 100         if(*a == *b) return 1;
249 12           return 0;
250             }
251              
252 14           int _oload_not_equiv( float * a, float * b, SV * third) {
253 14 50         if(*a != *b) return 1;
254 0           return 0;
255             }
256              
257 26           int _oload_gt(pTHX_ float * a, float * b, SV * third) {
258 26 100         if(SvTRUE_nomg_NN(third)) {
259 1 50         if(*b > *a) return 1;
260 0           return 0;
261             }
262 25 100         if(*a > *b) return 1;
263 10           return 0;
264             }
265              
266 66           int _oload_gte(pTHX_ float * a, float * b, SV * third) {
267 66 100         if(SvTRUE_nomg_NN(third)) {
268 2 50         if(*b >= *a) return 1;
269 0           return 0;
270             }
271 64 100         if(*a >= *b) return 1;
272 6           return 0;
273             }
274              
275 28           int _oload_lt(pTHX_ float * a, float * b, SV * third) {
276 28 100         if(SvTRUE_nomg_NN(third)) {
277 1 50         if(*b < *a) return 1;
278 0           return 0;
279             }
280 27 100         if(*a < *b) return 1;
281 11           return 0;
282             }
283              
284 66           int _oload_lte(pTHX_ float * a, float * b, SV * third) {
285 66 100         if(SvTRUE_nomg_NN(third)) {
286 2 50         if(*b <= *a) return 1;
287 0           return 0;
288             }
289 64 100         if(*a <= *b) return 1;
290 6           return 0;
291             }
292              
293 48           SV * _oload_spaceship(pTHX_ float * a, float * b, SV * third) {
294 48 100         if(*a == *b) return newSViv(0);
295 38 100         if(is_flt_nan(a) || is_flt_nan(b)) return &PL_sv_undef;
    50          
296 30 100         if(SvTRUE_nomg_NN(third)) {
297 1 50         if(*b > *a) return newSViv(1);
298 0           return newSViv(-1);
299             }
300 29 100         if(*a > *b) return newSViv(1);
301 15           return newSViv(-1);
302             }
303              
304 3           int _oload_not( float * a, SV * second, SV * third) {
305 3 100         if(is_flt_nan(a) || *a == 0) return 1;
    100          
306 1           return 0;
307             }
308              
309 3           int _oload_bool( float * a, SV * second, SV * third) {
310 3 100         if(is_flt_nan(a) || *a == 0) return 0;
    100          
311 1           return 1;
312             }
313              
314 1           SV * _oload_int(pTHX_ float * a, SV * second, SV * third) {
315             float * f_obj;
316             SV * obj_ref, * obj;
317              
318 1           Newx(f_obj, 1, float);
319 1 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_int function");
320 1           obj_ref = newSV(0);
321 1           obj = newSVrv(obj_ref, "Math::Float32");
322              
323 1 50         if(*a >= 0) *f_obj = floorf(*a);
324 0           else *f_obj = ceilf(*a);
325              
326 1           sv_setiv(obj, INT2PTR(IV,f_obj));
327 1           SvREADONLY_on(obj);
328 1           return obj_ref;
329             }
330              
331 1           SV * _oload_log(pTHX_ float * a, SV * second, SV * third) {
332             float * f_obj;
333             SV * obj_ref, * obj;
334              
335 1           Newx(f_obj, 1, float);
336 1 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_log function");
337 1           obj_ref = newSV(0);
338 1           obj = newSVrv(obj_ref, "Math::Float32");
339              
340 1           *f_obj = logf(*a);
341              
342 1           sv_setiv(obj, INT2PTR(IV,f_obj));
343 1           SvREADONLY_on(obj);
344 1           return obj_ref;
345             }
346              
347 1           SV * _oload_exp(pTHX_ float * a, SV * second, SV * third) {
348             float * f_obj;
349             SV * obj_ref, * obj;
350              
351 1           Newx(f_obj, 1, float);
352 1 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_exp function");
353 1           obj_ref = newSV(0);
354 1           obj = newSVrv(obj_ref, "Math::Float32");
355              
356 1           *f_obj = expf(*a);
357              
358 1           sv_setiv(obj, INT2PTR(IV,f_obj));
359 1           SvREADONLY_on(obj);
360 1           return obj_ref;
361             }
362              
363 4           SV * _oload_sqrt(pTHX_ float * a, SV * second, SV * third) {
364             float * f_obj;
365             SV * obj_ref, * obj;
366              
367              
368 4           Newx(f_obj, 1, float);
369 4 50         if(f_obj == NULL) croak("Failed to allocate memory in _oload_sqrt function");
370 4           obj_ref = newSV(0);
371 4           obj = newSVrv(obj_ref, "Math::Float32");
372              
373 4           *f_obj = sqrtf(*a);
374              
375 4           sv_setiv(obj, INT2PTR(IV,f_obj));
376 4           SvREADONLY_on(obj);
377 4           return obj_ref;
378             }
379              
380 8310           void _unpack_flt_hex(pTHX_ float * f) {
381 8310           dXSARGS;
382             int i;
383             char * buff;
384 8310           float bf16 = *f;
385 8310           void * p = &bf16;
386              
387 8310           Newx(buff, 8, char);
388 8310 50         if(buff == NULL) croak("Failed to allocate memory in unpack_flt_hex");
389              
390 8310           sp = mark;
391              
392             #ifdef WE_HAVE_BENDIAN /* Big Endian architecture */
393             for (i = 0; i < 4; i++) {
394             #else
395 41550 100         for (i = 3; i >= 0; i--) {
396             #endif
397 33240           sprintf(buff, "%02X", ((unsigned char*)p)[i]);
398 33240 50         XPUSHs(sv_2mortal(newSVpv(buff, 0)));
399             }
400 8310           PUTBACK;
401 8310           Safefree(buff);
402 8310           XSRETURN(4);
403             }
404              
405 0           void nextafter_flt(float * rop, float * op1, float * op2) {
406 0           *rop = nextafterf(*op1, *op2);
407 0           }
408              
409 4147           void flt_nextabove( float * a) {
410 4147           float f = strtof("Inf", NULL);
411 4147           *a = nextafterf(*a, f);
412 4147           }
413              
414 4146           void flt_nextbelow( float * a) {
415 4146           float f = strtof("-Inf", NULL);
416 4146           *a = nextafterf(*a, f);
417 4146           }
418              
419 19003           void DESTROY(SV * obj) {
420             /* printf("Destroying object\n"); *//* debugging check */
421 19003           Safefree(INT2PTR( float *, SvIVX(SvRV(obj))));
422 19003           }
423              
424              
425              
426              
427              
428             MODULE = Math::Float32 PACKAGE = Math::Float32
429              
430             PROTOTYPES: DISABLE
431              
432              
433             SV *
434             _itsa (a)
435             SV * a
436             CODE:
437 27512           RETVAL = _itsa (aTHX_ a);
438             OUTPUT: RETVAL
439              
440             int
441             is_flt_nan (obj)
442             float * obj
443              
444             int
445             is_flt_inf (obj)
446             float * obj
447              
448             SV *
449             _fromFloat32 (in)
450             float * in
451             CODE:
452 8594           RETVAL = _fromFloat32 (aTHX_ in);
453             OUTPUT: RETVAL
454              
455             SV *
456             _fromNV (in)
457             SV * in
458             CODE:
459 394           RETVAL = _fromNV (aTHX_ in);
460             OUTPUT: RETVAL
461              
462             SV *
463             _fromIV (in)
464             SV * in
465             CODE:
466 399           RETVAL = _fromIV (aTHX_ in);
467             OUTPUT: RETVAL
468              
469             SV *
470             _fromPV (in)
471             SV * in
472             CODE:
473 9039           RETVAL = _fromPV (aTHX_ in);
474             OUTPUT: RETVAL
475              
476             SV *
477             flt_to_NV (obj)
478             float * obj
479             CODE:
480 278           RETVAL = flt_to_NV (aTHX_ obj);
481             OUTPUT: RETVAL
482              
483             void
484             _flt_set (a, b)
485             float * a
486             float * b
487             PREINIT:
488             I32* temp;
489             PPCODE:
490 1           temp = PL_markstack_ptr++;
491 1           _flt_set(a, b);
492 1 50         if (PL_markstack_ptr != temp) {
493             /* truly void, because dXSARGS not invoked */
494 1           PL_markstack_ptr = temp;
495 1           XSRETURN_EMPTY; /* return empty stack */
496             }
497             /* must have used dXSARGS; list context implied */
498 0           return;
499              
500             void
501             flt_set_nan (a)
502             float * a
503             PREINIT:
504             I32* temp;
505             PPCODE:
506 0           temp = PL_markstack_ptr++;
507 0           flt_set_nan(a);
508 0 0         if (PL_markstack_ptr != temp) {
509             /* truly void, because dXSARGS not invoked */
510 0           PL_markstack_ptr = temp;
511 0           XSRETURN_EMPTY; /* return empty stack */
512             }
513             /* must have used dXSARGS; list context implied */
514 0           return;
515              
516             void
517             flt_set_inf (a, is_pos)
518             float * a
519             int is_pos
520             PREINIT:
521             I32* temp;
522             PPCODE:
523 1           temp = PL_markstack_ptr++;
524 1           flt_set_inf(a, is_pos);
525 1 50         if (PL_markstack_ptr != temp) {
526             /* truly void, because dXSARGS not invoked */
527 1           PL_markstack_ptr = temp;
528 1           XSRETURN_EMPTY; /* return empty stack */
529             }
530             /* must have used dXSARGS; list context implied */
531 0           return;
532              
533             void
534             flt_set_zero (a, is_pos)
535             float * a
536             int is_pos
537             PREINIT:
538             I32* temp;
539             PPCODE:
540 0           temp = PL_markstack_ptr++;
541 0           flt_set_zero(a, is_pos);
542 0 0         if (PL_markstack_ptr != temp) {
543             /* truly void, because dXSARGS not invoked */
544 0           PL_markstack_ptr = temp;
545 0           XSRETURN_EMPTY; /* return empty stack */
546             }
547             /* must have used dXSARGS; list context implied */
548 0           return;
549              
550             SV *
551             _oload_add (a, b, third)
552             float * a
553             float * b
554             SV * third
555             CODE:
556 101           RETVAL = _oload_add (aTHX_ a, b, third);
557             OUTPUT: RETVAL
558              
559             SV *
560             _oload_sub (a, b, third)
561             float * a
562             float * b
563             SV * third
564             CODE:
565 181           RETVAL = _oload_sub (aTHX_ a, b, third);
566             OUTPUT: RETVAL
567              
568             SV *
569             _oload_mul (a, b, third)
570             float * a
571             float * b
572             SV * third
573             CODE:
574 141           RETVAL = _oload_mul (aTHX_ a, b, third);
575             OUTPUT: RETVAL
576              
577             SV *
578             _oload_div (a, b, third)
579             float * a
580             float * b
581             SV * third
582             CODE:
583 107           RETVAL = _oload_div (aTHX_ a, b, third);
584             OUTPUT: RETVAL
585              
586             SV *
587             _oload_fmod (a, b, third)
588             float * a
589             float * b
590             SV * third
591             CODE:
592 12           RETVAL = _oload_fmod (aTHX_ a, b, third);
593             OUTPUT: RETVAL
594              
595             SV *
596             _oload_pow (a, b, third)
597             float * a
598             float * b
599             SV * third
600             CODE:
601 28           RETVAL = _oload_pow (aTHX_ a, b, third);
602             OUTPUT: RETVAL
603              
604             int
605             _oload_equiv (a, b, third)
606             float * a
607             float * b
608             SV * third
609              
610             int
611             _oload_not_equiv (a, b, third)
612             float * a
613             float * b
614             SV * third
615              
616             int
617             _oload_gt (a, b, third)
618             float * a
619             float * b
620             SV * third
621             CODE:
622 26           RETVAL = _oload_gt (aTHX_ a, b, third);
623             OUTPUT: RETVAL
624              
625             int
626             _oload_gte (a, b, third)
627             float * a
628             float * b
629             SV * third
630             CODE:
631 66           RETVAL = _oload_gte (aTHX_ a, b, third);
632             OUTPUT: RETVAL
633              
634             int
635             _oload_lt (a, b, third)
636             float * a
637             float * b
638             SV * third
639             CODE:
640 28           RETVAL = _oload_lt (aTHX_ a, b, third);
641             OUTPUT: RETVAL
642              
643             int
644             _oload_lte (a, b, third)
645             float * a
646             float * b
647             SV * third
648             CODE:
649 66           RETVAL = _oload_lte (aTHX_ a, b, third);
650             OUTPUT: RETVAL
651              
652             SV *
653             _oload_spaceship (a, b, third)
654             float * a
655             float * b
656             SV * third
657             CODE:
658 48           RETVAL = _oload_spaceship (aTHX_ a, b, third);
659             OUTPUT: RETVAL
660              
661             int
662             _oload_not (a, second, third)
663             float * a
664             SV * second
665             SV * third
666              
667             int
668             _oload_bool (a, second, third)
669             float * a
670             SV * second
671             SV * third
672              
673             SV *
674             _oload_int (a, second, third)
675             float * a
676             SV * second
677             SV * third
678             CODE:
679 1           RETVAL = _oload_int (aTHX_ a, second, third);
680             OUTPUT: RETVAL
681              
682             SV *
683             _oload_log (a, second, third)
684             float * a
685             SV * second
686             SV * third
687             CODE:
688 1           RETVAL = _oload_log (aTHX_ a, second, third);
689             OUTPUT: RETVAL
690              
691             SV *
692             _oload_exp (a, second, third)
693             float * a
694             SV * second
695             SV * third
696             CODE:
697 1           RETVAL = _oload_exp (aTHX_ a, second, third);
698             OUTPUT: RETVAL
699              
700             SV *
701             _oload_sqrt (a, second, third)
702             float * a
703             SV * second
704             SV * third
705             CODE:
706 4           RETVAL = _oload_sqrt (aTHX_ a, second, third);
707             OUTPUT: RETVAL
708              
709             void
710             _unpack_flt_hex (f)
711             float * f
712             PREINIT:
713             I32* temp;
714             PPCODE:
715 8310           temp = PL_markstack_ptr++;
716 8310           _unpack_flt_hex(aTHX_ f);
717 8310 50         if (PL_markstack_ptr != temp) {
718             /* truly void, because dXSARGS not invoked */
719 0           PL_markstack_ptr = temp;
720 0           XSRETURN_EMPTY; /* return empty stack */
721             }
722             /* must have used dXSARGS; list context implied */
723 8310           return;
724              
725             void
726             nextafter_flt (rop, op1, op2)
727             float * rop
728             float * op1
729             float * op2
730             PREINIT:
731             I32* temp;
732             PPCODE:
733 0           temp = PL_markstack_ptr++;
734 0           nextafter_flt(rop, op1, op2);
735 0 0         if (PL_markstack_ptr != temp) {
736             /* truly void, because dXSARGS not invoked */
737 0           PL_markstack_ptr = temp;
738 0           XSRETURN_EMPTY; /* return empty stack */
739             }
740             /* must have used dXSARGS; list context implied */
741 0           return;
742              
743             void
744             flt_nextabove (a)
745             float * a
746             PREINIT:
747             I32* temp;
748             PPCODE:
749 4147           temp = PL_markstack_ptr++;
750 4147           flt_nextabove(a);
751 4147 50         if (PL_markstack_ptr != temp) {
752             /* truly void, because dXSARGS not invoked */
753 4147           PL_markstack_ptr = temp;
754 4147           XSRETURN_EMPTY; /* return empty stack */
755             }
756             /* must have used dXSARGS; list context implied */
757 0           return;
758              
759             void
760             flt_nextbelow (a)
761             float * a
762             PREINIT:
763             I32* temp;
764             PPCODE:
765 4146           temp = PL_markstack_ptr++;
766 4146           flt_nextbelow(a);
767 4146 50         if (PL_markstack_ptr != temp) {
768             /* truly void, because dXSARGS not invoked */
769 4146           PL_markstack_ptr = temp;
770 4146           XSRETURN_EMPTY; /* return empty stack */
771             }
772             /* must have used dXSARGS; list context implied */
773 0           return;
774              
775             void
776             DESTROY (obj)
777             SV * obj
778             PREINIT:
779             I32* temp;
780             PPCODE:
781 19003           temp = PL_markstack_ptr++;
782 19003           DESTROY(obj);
783 19003 50         if (PL_markstack_ptr != temp) {
784             /* truly void, because dXSARGS not invoked */
785 19003           PL_markstack_ptr = temp;
786 19003           XSRETURN_EMPTY; /* return empty stack */
787             }
788             /* must have used dXSARGS; list context implied */
789 0           return;
790