|  | /* | 
|  | This Software is provided under the Zope Public License (ZPL) Version 2.1. | 
|  |  | 
|  | Copyright (c) 2009 - 2013 by the mingw-w64 project | 
|  |  | 
|  | See the AUTHORS file for the list of contributors to the mingw-w64 project. | 
|  |  | 
|  | This license has been certified as open source. It has also been designated | 
|  | as GPL compatible by the Free Software Foundation (FSF). | 
|  |  | 
|  | Redistribution and use in source and binary forms, with or without | 
|  | modification, are permitted provided that the following conditions are met: | 
|  |  | 
|  | 1. Redistributions in source code must retain the accompanying copyright | 
|  | notice, this list of conditions, and the following disclaimer. | 
|  | 2. Redistributions in binary form must reproduce the accompanying | 
|  | copyright notice, this list of conditions, and the following disclaimer | 
|  | in the documentation and/or other materials provided with the | 
|  | distribution. | 
|  | 3. Names of the copyright holders must not be used to endorse or promote | 
|  | products derived from this software without prior written permission | 
|  | from the copyright holders. | 
|  | 4. The right to distribute this software or to use it for any purpose does | 
|  | not give you the right to use Servicemarks (sm) or Trademarks (tm) of | 
|  | the copyright holders.  Use of them is covered by separate agreement | 
|  | with the copyright holders. | 
|  | 5. If any files are modified, you must cause the modified files to carry | 
|  | prominent notices stating that you changed the files and the date of | 
|  | any change. | 
|  |  | 
|  | Disclaimer | 
|  |  | 
|  | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY EXPRESSED | 
|  | OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | 
|  | OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | 
|  | EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, | 
|  | INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | 
|  | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, | 
|  | OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | 
|  | LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | 
|  | NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | 
|  | EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
|  | */ | 
|  |  | 
|  | #ifndef __STDC_WANT_DEC_FP__ | 
|  | #define __STDC_WANT_DEC_FP__ 1 | 
|  | #endif | 
|  | #include <math.h> | 
|  | #include <fenv.h> | 
|  | #include <errno.h> | 
|  | #include <inttypes.h> | 
|  |  | 
|  | #ifndef _MSC_VER | 
|  | #ifndef __DECIMAL_BID_FORMAT__ | 
|  | #error Only BID DFP supported! | 
|  | #endif | 
|  |  | 
|  | #if (__BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__) || (__FLOAT_WORD_ORDER__ != __ORDER_LITTLE_ENDIAN__) | 
|  | #error Only little endian supported! | 
|  | #endif | 
|  | #endif /* _MSC_VER */ | 
|  |  | 
|  | /* We need to check the BID encoding format | 
|  |  | 
|  | _Decimal32: | 
|  | MSB-----------------------------------------------------------------LSB | 
|  | s         | 00eeeeee                      |(0)TTTtttttttttttttttttttt | | 
|  | [sign bit]|[ proble bits must not be "11"]|[Implicit "0" MSB]         | | 
|  | |[ 8-bit exponent, "00" probed ]|[23-bit True Siginifcant  ]| | 
|  |  | 
|  | If probed bits form "11" exponent is 10-bits instead of 8-bits. | 
|  | s         | 11 00eeeeee       |(100) Ttttttttttttttttttttt | | 
|  | [sign bit]|["11" proble bits ]|                            | | 
|  | |[ 10-bit exponent ]|[Implicit "100" as MSB]     | | 
|  | |                   |[21-bit True Significant   ]| | 
|  |  | 
|  | DFP = -1^s x tttt x [ 10 ^ (eeee - (101(base10))] | 
|  |  | 
|  | Use type0d32 to probe the 2 bits, if not 11, use type1d32, else use type2d32. | 
|  | The 11 bits are ignored when computing exponents. | 
|  |  | 
|  | Examples: | 
|  |  | 
|  | s 00eeeeee (0)TTTtttttttttttttttttttt | 
|  | s 01eeeeee (0)TTTtttttttttttttttttttt | 
|  | s 10eeeeee (0)TTTtttttttttttttttttttt | 
|  | s 11 01eeeeee (100)Ttttttttttttttttttttt | 
|  | s 11 10eeeeee (100)Ttttttttttttttttttttt | 
|  |  | 
|  | NAN types: | 
|  |  | 
|  | s 11110 xxxxxxxxxxxxxxxxxxxxxxxxxx   +-Infinity | 
|  | s 111110 xxxxxxxxxxxxxxxxxxxxxxxxx   quiet NaN | 
|  | s 111111 xxxxxxxxxxxxxxxxxxxxxxxxx   signaling NaN | 
|  |  | 
|  | _Decimal64: | 
|  |  | 
|  | s 00eeeeeeee TTTtttttttttttttttttttt tttttttttttttttttttttttttttttt | 
|  | s 01eeeeeeee TTTtttttttttttttttttttt tttttttttttttttttttttttttttttt | 
|  | s 10eeeeeeee TTTtttttttttttttttttttt tttttttttttttttttttttttttttttt | 
|  | s 11 00eeeeeeee (100)Ttttttttttttttttttttt tttttttttttttttttttttttttttttt | 
|  | s 11 01eeeeeeee (100)Ttttttttttttttttttttt tttttttttttttttttttttttttttttt | 
|  | s 11 10eeeeeeee (100)Ttttttttttttttttttttt tttttttttttttttttttttttttttttt | 
|  |  | 
|  | DFP = -1^s x tttt x [ 10 ^ (eeee - (398(base10))] | 
|  |  | 
|  | _Decimal128: | 
|  |  | 
|  | s 00eeeeeeeeeeee TTTtttttttttttttttttttt tttttttttttttttttttttttttttttt tttttttttttttttttttttttttttttttttttttttttttttttttttttttt | 
|  | s 01eeeeeeeeeeee TTTtttttttttttttttttttt tttttttttttttttttttttttttttttt tttttttttttttttttttttttttttttttttttttttttttttttttttttttt | 
|  | s 10eeeeeeeeeeee TTTtttttttttttttttttttt tttttttttttttttttttttttttttttt tttttttttttttttttttttttttttttttttttttttttttttttttttttttt | 
|  | s 11 00eeeeeeeeeeee (100)Ttttttttttttttttttttt tttttttttttttttttttttttttttttt tttttttttttttttttttttttttttttttttttttttttttttttttttttttt | 
|  | s 11 01eeeeeeeeeeee (100)Ttttttttttttttttttttt tttttttttttttttttttttttttttttt tttttttttttttttttttttttttttttttttttttttttttttttttttttttt | 
|  | s 11 10eeeeeeeeeeee (100)Ttttttttttttttttttttt tttttttttttttttttttttttttttttt tttttttttttttttttttttttttttttttttttttttttttttttttttttttt | 
|  |  | 
|  | DFP = -1^s x tttt x [ 10 ^ (eeee - (6176(base10))] | 
|  |  | 
|  | */ | 
|  |  | 
|  | #include <pshpack1.h> | 
|  | #ifdef __GNUC__ | 
|  | #define structpack __attribute__((gcc_struct)) | 
|  | #else | 
|  | #define structpack | 
|  | #endif | 
|  |  | 
|  | typedef struct structpack type0d32 { | 
|  | uint64_t blob:25; | 
|  | uint32_t flag:4; | 
|  | uint32_t bits:2; | 
|  | uint32_t sign:1; | 
|  | } type0d32; | 
|  |  | 
|  | /* case not 11 */ | 
|  | typedef struct structpack type1d32 { | 
|  | uint64_t mantissa:23; | 
|  | uint32_t exponent:8; | 
|  | uint32_t sign:1; | 
|  | } type1d32; | 
|  |  | 
|  | /* case 11 */ | 
|  | typedef struct structpack type2d32 { | 
|  | /* implicit (100) MSB for mantissa */ | 
|  | uint64_t mantissa:21; | 
|  | uint32_t exponent:8; | 
|  | uint32_t bits:2; | 
|  | uint32_t sign:1; | 
|  | } type2d32; | 
|  |  | 
|  | typedef struct structpack type0d64 { | 
|  | uint64_t blob:57; | 
|  | uint32_t flag:4; | 
|  | uint32_t bits:2; | 
|  | uint32_t sign:1; | 
|  | } type0d64; | 
|  |  | 
|  | /* case not 11 */ | 
|  | typedef struct structpack type1d64 {; | 
|  | uint64_t mantissa:53; | 
|  | uint32_t exponent:10; | 
|  | uint32_t sign:1; | 
|  | } type1d64; | 
|  |  | 
|  | /* case 11 */ | 
|  | typedef struct structpack type2d64 { | 
|  | /* implicit (100) MSB for mantissa */ | 
|  | uint64_t mantissa:51; | 
|  | uint32_t exponent:10; | 
|  | uint32_t bits:2; | 
|  | uint32_t sign:1; | 
|  | } type2d64; | 
|  |  | 
|  | typedef struct structpack type0d128 { | 
|  | uint64_t blobL:64; | 
|  | uint64_t blobH:57; | 
|  | uint32_t flag:4; | 
|  | uint32_t bits:2; | 
|  | uint32_t sign:1; | 
|  | } type0d128; | 
|  |  | 
|  | /* case not 11 */ | 
|  | typedef struct structpack type1d128 { | 
|  | uint64_t mantissaL:64; | 
|  | uint64_t mantissaH:49; | 
|  | uint32_t exponent:14; | 
|  | uint32_t sign:1; | 
|  | } type1d128; | 
|  |  | 
|  | /* case 11 */ | 
|  | typedef struct structpack type2d128 { | 
|  | uint64_t mantissaL:64; | 
|  | /* implicit (100) MSB for mantissa */ | 
|  | uint64_t mantissaH:47; | 
|  | uint32_t exponent:14; | 
|  | uint32_t bits:2; | 
|  | uint32_t sign:1; | 
|  | } type2d128; | 
|  |  | 
|  | #ifdef _MSC_VER | 
|  | typedef type0d32 _Decimal32; | 
|  | typedef type0d64 _Decimal64; | 
|  | typedef type0d128 _Decimal128; | 
|  | #endif /* _MSC_VER */ | 
|  |  | 
|  | #include <poppack.h> | 
|  |  | 
|  | typedef union ud32 { | 
|  | _Decimal32 d; | 
|  | type0d32 t0; | 
|  | type1d32 t1; | 
|  | type2d32 t2; | 
|  | unsigned char b[sizeof(_Decimal32)]; | 
|  | } ud32; | 
|  |  | 
|  | typedef union ud64 { | 
|  | _Decimal64 d; | 
|  | type0d64 t0; | 
|  | type1d64 t1; | 
|  | type2d64 t2; | 
|  | unsigned char b[sizeof(_Decimal64)]; | 
|  | } ud64; | 
|  |  | 
|  | typedef union ud128 { | 
|  | _Decimal128 d; | 
|  | type0d128 t0; | 
|  | type1d128 t1; | 
|  | type2d128 t2; | 
|  | unsigned char b[sizeof(_Decimal128)]; | 
|  | } ud128; |