| 1 | /* Copyright (c) 2012, Oracle and/or its affiliates. All rights reserved. |
| 2 | |
| 3 | This program is free software; you can redistribute it and/or modify |
| 4 | it under the terms of the GNU General Public License as published by |
| 5 | the Free Software Foundation; version 2 of the License. |
| 6 | |
| 7 | This program is distributed in the hope that it will be useful, |
| 8 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 9 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| 10 | GNU General Public License for more details. |
| 11 | |
| 12 | You should have received a copy of the GNU General Public License |
| 13 | along with this program; if not, write to the Free Software |
| 14 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02111-1307 USA */ |
| 15 | |
| 16 | /* |
| 17 | Data in little-endian format. |
| 18 | */ |
| 19 | |
| 20 | #ifndef MY_BYTE_ORDER_ARCH_OPTIMIZED |
| 21 | #define float4get(V,M) memcpy(&V, (M), sizeof(float)) |
| 22 | #define float4store(V,M) memcpy(V, (&M), sizeof(float)) |
| 23 | #define float8get(V,M) doubleget((V),(M)) |
| 24 | #define float8store(V,M) doublestore((V),(M)) |
| 25 | |
| 26 | /* Bi-endian hardware.... */ |
| 27 | #if defined(__FLOAT_WORD_ORDER) && (__FLOAT_WORD_ORDER == __BIG_ENDIAN) |
| 28 | #define doublestore(T,V) do { *(((char*)T)+0)=(char) ((uchar *) &V)[4];\ |
| 29 | *(((char*)T)+1)=(char) ((uchar *) &V)[5];\ |
| 30 | *(((char*)T)+2)=(char) ((uchar *) &V)[6];\ |
| 31 | *(((char*)T)+3)=(char) ((uchar *) &V)[7];\ |
| 32 | *(((char*)T)+4)=(char) ((uchar *) &V)[0];\ |
| 33 | *(((char*)T)+5)=(char) ((uchar *) &V)[1];\ |
| 34 | *(((char*)T)+6)=(char) ((uchar *) &V)[2];\ |
| 35 | *(((char*)T)+7)=(char) ((uchar *) &V)[3]; }\ |
| 36 | while(0) |
| 37 | #define doubleget(V,M) do { double def_temp;\ |
| 38 | ((uchar*) &def_temp)[0]=(M)[4];\ |
| 39 | ((uchar*) &def_temp)[1]=(M)[5];\ |
| 40 | ((uchar*) &def_temp)[2]=(M)[6];\ |
| 41 | ((uchar*) &def_temp)[3]=(M)[7];\ |
| 42 | ((uchar*) &def_temp)[4]=(M)[0];\ |
| 43 | ((uchar*) &def_temp)[5]=(M)[1];\ |
| 44 | ((uchar*) &def_temp)[6]=(M)[2];\ |
| 45 | ((uchar*) &def_temp)[7]=(M)[3];\ |
| 46 | (V) = def_temp; } while(0) |
| 47 | #else /* Bi-endian hardware.... */ |
| 48 | |
| 49 | /* Cast away type qualifiers (necessary as macro takes argument by value). */ |
| 50 | #define doublestore(T,V) memcpy((T), (void*) &V, sizeof(double)) |
| 51 | #define doubleget(V,M) memcpy(&V, (M), sizeof(double)) |
| 52 | |
| 53 | #endif /* Bi-endian hardware.... */ |
| 54 | |
| 55 | #endif /* !MY_BYTE_ORDER_ARCH_OPTIMIZED */ |
| 56 | |
| 57 | #define ushortget(V,M) do { uchar *pM= (uchar*)(M);V = uint2korr(pM);} while(0) |
| 58 | #define shortget(V,M) do { uchar *pM= (uchar*)(M);V = sint2korr(pM);} while(0) |
| 59 | #define longget(V,M) do { uchar *pM= (uchar*)(M);V = sint4korr(pM);} while(0) |
| 60 | #define ulongget(V,M) do { uchar *pM= (uchar*)(M);V = uint4korr(pM);} while(0) |
| 61 | #define shortstore(T,V) int2store(T,V) |
| 62 | #define longstore(T,V) int4store(T,V) |
| 63 | |
| 64 | #ifndef floatstore |
| 65 | /* Cast away type qualifiers (necessary as macro takes argument by value). */ |
| 66 | #define floatstore(T,V) memcpy((T), (void*) (&V), sizeof(float)) |
| 67 | #define floatget(V,M) memcpy(&V, (M), sizeof(float)) |
| 68 | #endif |
| 69 | #ifndef doubleget |
| 70 | #define doubleget(V,M) memcpy(&V, (M), sizeof(double)) |
| 71 | #define doublestore(T,V) memcpy((T), (void *) &V, sizeof(double)) |
| 72 | #endif /* doubleget */ |
| 73 | |
| 74 | #define longlongget(V,M) memcpy(&V, (M), sizeof(ulonglong)) |
| 75 | #define longlongstore(T,V) memcpy((T), &V, sizeof(ulonglong)) |
| 76 | |