1 /*******************************************************************************
2 Copyright (c) 2016, Michael Wallner <mike@php.net>.
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
8 * Redistributions of source code must retain the above copyright notice,
9 this list of conditions and the following disclaimer.
10 * Redistributions in binary form must reproduce the above copyright
11 notice, this list of conditions and the following disclaimer in the
12 documentation and/or other materials provided with the distribution.
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
15 AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
18 FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
20 SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
21 CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
22 OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23 OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 *******************************************************************************/
30 static inline void psi_calc_cast(token_t in_type
, impl_val
*in_val
, token_t out_type
, impl_val
*out_val
)
36 out_val
->i8
= in_val
->i8
;
39 out_val
->i8
= in_val
->u8
;
42 out_val
->i8
= in_val
->i16
;
45 out_val
->i8
= in_val
->u16
;
48 out_val
->i8
= in_val
->i32
;
51 out_val
->i8
= in_val
->u32
;
54 out_val
->i8
= in_val
->i64
;
57 out_val
->i8
= in_val
->u64
;
61 out_val
->i8
= in_val
->i128
;
67 out_val
->i8
= in_val
->u128
;
72 out_val
->i8
= in_val
->fval
;
75 out_val
->i8
= in_val
->dval
;
78 case PSI_T_LONG_DOUBLE
:
79 out_val
->i8
= in_val
->ldval
;
91 out_val
->u8
= in_val
->i8
;
94 out_val
->u8
= in_val
->u8
;
97 out_val
->u8
= in_val
->i16
;
100 out_val
->u8
= in_val
->u16
;
103 out_val
->u8
= in_val
->i32
;
106 out_val
->u8
= in_val
->u32
;
109 out_val
->u8
= in_val
->i64
;
112 out_val
->u8
= in_val
->u64
;
116 out_val
->u8
= in_val
->i128
;
122 out_val
->u8
= in_val
->u128
;
127 out_val
->u8
= in_val
->fval
;
130 out_val
->u8
= in_val
->dval
;
132 # if HAVE_LONG_DOUBLE
133 case PSI_T_LONG_DOUBLE
:
134 out_val
->u8
= in_val
->ldval
;
146 out_val
->i16
= in_val
->i8
;
149 out_val
->i16
= in_val
->u8
;
152 out_val
->i16
= in_val
->i16
;
155 out_val
->i16
= in_val
->u16
;
158 out_val
->i16
= in_val
->i32
;
161 out_val
->i16
= in_val
->u32
;
164 out_val
->i16
= in_val
->i64
;
167 out_val
->i16
= in_val
->u64
;
171 out_val
->i16
= in_val
->i128
;
177 out_val
->i16
= in_val
->u128
;
182 out_val
->i16
= in_val
->fval
;
185 out_val
->i16
= in_val
->dval
;
187 # if HAVE_LONG_DOUBLE
188 case PSI_T_LONG_DOUBLE
:
189 out_val
->i16
= in_val
->ldval
;
201 out_val
->u16
= in_val
->i8
;
204 out_val
->u16
= in_val
->u8
;
207 out_val
->u16
= in_val
->i16
;
210 out_val
->u16
= in_val
->u16
;
213 out_val
->u16
= in_val
->i32
;
216 out_val
->u16
= in_val
->u32
;
219 out_val
->u16
= in_val
->i64
;
222 out_val
->u16
= in_val
->u64
;
226 out_val
->u16
= in_val
->i128
;
232 out_val
->u16
= in_val
->u128
;
237 out_val
->u16
= in_val
->fval
;
240 out_val
->u16
= in_val
->dval
;
242 # if HAVE_LONG_DOUBLE
243 case PSI_T_LONG_DOUBLE
:
244 out_val
->u16
= in_val
->ldval
;
256 out_val
->i32
= in_val
->i8
;
259 out_val
->i32
= in_val
->u8
;
262 out_val
->i32
= in_val
->i16
;
265 out_val
->i32
= in_val
->u16
;
268 out_val
->i32
= in_val
->i32
;
271 out_val
->i32
= in_val
->u32
;
274 out_val
->i32
= in_val
->i64
;
277 out_val
->i32
= in_val
->u64
;
281 out_val
->i32
= in_val
->i128
;
287 out_val
->i32
= in_val
->u128
;
292 out_val
->i32
= in_val
->fval
;
295 out_val
->i32
= in_val
->dval
;
297 # if HAVE_LONG_DOUBLE
298 case PSI_T_LONG_DOUBLE
:
299 out_val
->i32
= in_val
->ldval
;
311 out_val
->u32
= in_val
->i8
;
314 out_val
->u32
= in_val
->u8
;
317 out_val
->u32
= in_val
->i16
;
320 out_val
->u32
= in_val
->u16
;
323 out_val
->u32
= in_val
->i32
;
326 out_val
->u32
= in_val
->u32
;
329 out_val
->u32
= in_val
->i64
;
332 out_val
->u32
= in_val
->u64
;
336 out_val
->u32
= in_val
->i128
;
342 out_val
->u32
= in_val
->u128
;
347 out_val
->u32
= in_val
->fval
;
350 out_val
->u32
= in_val
->dval
;
352 # if HAVE_LONG_DOUBLE
353 case PSI_T_LONG_DOUBLE
:
354 out_val
->u32
= in_val
->ldval
;
366 out_val
->i64
= in_val
->i8
;
369 out_val
->i64
= in_val
->u8
;
372 out_val
->i64
= in_val
->i16
;
375 out_val
->i64
= in_val
->u16
;
378 out_val
->i64
= in_val
->i32
;
381 out_val
->i64
= in_val
->u32
;
384 out_val
->i64
= in_val
->i64
;
387 out_val
->i64
= in_val
->u64
;
391 out_val
->i64
= in_val
->i128
;
397 out_val
->i64
= in_val
->u128
;
402 out_val
->i64
= in_val
->fval
;
405 out_val
->i64
= in_val
->dval
;
407 # if HAVE_LONG_DOUBLE
408 case PSI_T_LONG_DOUBLE
:
409 out_val
->i64
= in_val
->ldval
;
421 out_val
->u64
= in_val
->i8
;
424 out_val
->u64
= in_val
->u8
;
427 out_val
->u64
= in_val
->i16
;
430 out_val
->u64
= in_val
->u16
;
433 out_val
->u64
= in_val
->i32
;
436 out_val
->u64
= in_val
->u32
;
439 out_val
->u64
= in_val
->i64
;
442 out_val
->u64
= in_val
->u64
;
446 out_val
->u64
= in_val
->i128
;
452 out_val
->u64
= in_val
->u128
;
457 out_val
->u64
= in_val
->fval
;
460 out_val
->u64
= in_val
->dval
;
462 # if HAVE_LONG_DOUBLE
463 case PSI_T_LONG_DOUBLE
:
464 out_val
->u64
= in_val
->ldval
;
477 out_val
->i128
= in_val
->i8
;
480 out_val
->i128
= in_val
->u8
;
483 out_val
->i128
= in_val
->i16
;
486 out_val
->i128
= in_val
->u16
;
489 out_val
->i128
= in_val
->i32
;
492 out_val
->i128
= in_val
->u32
;
495 out_val
->i128
= in_val
->i64
;
498 out_val
->i128
= in_val
->u64
;
502 out_val
->i128
= in_val
->i128
;
508 out_val
->i128
= in_val
->u128
;
513 out_val
->i128
= in_val
->fval
;
516 out_val
->i128
= in_val
->dval
;
518 # if HAVE_LONG_DOUBLE
519 case PSI_T_LONG_DOUBLE
:
520 out_val
->i128
= in_val
->ldval
;
535 out_val
->u128
= in_val
->i8
;
538 out_val
->u128
= in_val
->u8
;
541 out_val
->u128
= in_val
->i16
;
544 out_val
->u128
= in_val
->u16
;
547 out_val
->u128
= in_val
->i32
;
550 out_val
->u128
= in_val
->u32
;
553 out_val
->u128
= in_val
->i64
;
556 out_val
->u128
= in_val
->u64
;
560 out_val
->u128
= in_val
->i128
;
566 out_val
->u128
= in_val
->u128
;
571 out_val
->u128
= in_val
->fval
;
574 out_val
->u128
= in_val
->dval
;
576 # if HAVE_LONG_DOUBLE
577 case PSI_T_LONG_DOUBLE
:
578 out_val
->u128
= in_val
->ldval
;
592 out_val
->fval
= in_val
->i8
;
595 out_val
->fval
= in_val
->u8
;
598 out_val
->fval
= in_val
->i16
;
601 out_val
->fval
= in_val
->u16
;
604 out_val
->fval
= in_val
->i32
;
607 out_val
->fval
= in_val
->u32
;
610 out_val
->fval
= in_val
->i64
;
613 out_val
->fval
= in_val
->u64
;
617 out_val
->fval
= in_val
->i128
;
623 out_val
->fval
= in_val
->u128
;
628 out_val
->fval
= in_val
->fval
;
631 out_val
->fval
= in_val
->dval
;
633 # if HAVE_LONG_DOUBLE
634 case PSI_T_LONG_DOUBLE
:
635 out_val
->fval
= in_val
->ldval
;
647 out_val
->dval
= in_val
->i8
;
650 out_val
->dval
= in_val
->u8
;
653 out_val
->dval
= in_val
->i16
;
656 out_val
->dval
= in_val
->u16
;
659 out_val
->dval
= in_val
->i32
;
662 out_val
->dval
= in_val
->u32
;
665 out_val
->dval
= in_val
->i64
;
668 out_val
->dval
= in_val
->u64
;
672 out_val
->dval
= in_val
->i128
;
678 out_val
->dval
= in_val
->u128
;
683 out_val
->dval
= in_val
->fval
;
686 out_val
->dval
= in_val
->dval
;
688 # if HAVE_LONG_DOUBLE
689 case PSI_T_LONG_DOUBLE
:
690 out_val
->dval
= in_val
->ldval
;
700 case PSI_T_LONG_DOUBLE
:
703 out_val
->ldval
= in_val
->i8
;
706 out_val
->ldval
= in_val
->u8
;
709 out_val
->ldval
= in_val
->i16
;
712 out_val
->ldval
= in_val
->u16
;
715 out_val
->ldval
= in_val
->i32
;
718 out_val
->ldval
= in_val
->u32
;
721 out_val
->ldval
= in_val
->i64
;
724 out_val
->ldval
= in_val
->u64
;
728 out_val
->ldval
= in_val
->i128
;
734 out_val
->ldval
= in_val
->u128
;
739 out_val
->ldval
= in_val
->fval
;
742 out_val
->ldval
= in_val
->dval
;
744 # if HAVE_LONG_DOUBLE
745 case PSI_T_LONG_DOUBLE
:
746 out_val
->ldval
= in_val
->ldval
;