1 | /* |
1 | /* |
2 | * libecb - http://software.schmorp.de/pkg/libecb |
2 | * libecb - http://software.schmorp.de/pkg/libecb |
3 | * |
3 | * |
4 | * Copyright (©) 2009-2012 Marc Alexander Lehmann <libecb@schmorp.de> |
4 | * Copyright (©) 2009-2013 Marc Alexander Lehmann <libecb@schmorp.de> |
5 | * Copyright (©) 2011 Emanuele Giaquinta |
5 | * Copyright (©) 2011 Emanuele Giaquinta |
6 | * All rights reserved. |
6 | * All rights reserved. |
7 | * |
7 | * |
8 | * Redistribution and use in source and binary forms, with or without modifica- |
8 | * Redistribution and use in source and binary forms, with or without modifica- |
9 | * tion, are permitted provided that the following conditions are met: |
9 | * tion, are permitted provided that the following conditions are met: |
… | |
… | |
64 | #define ECB_PTRSIZE 4 |
64 | #define ECB_PTRSIZE 4 |
65 | #endif |
65 | #endif |
66 | #endif |
66 | #endif |
67 | |
67 | |
68 | /* work around x32 idiocy by defining proper macros */ |
68 | /* work around x32 idiocy by defining proper macros */ |
69 | #if __x86_64 || _M_AMD64 |
69 | #if __amd64 || __x86_64 || _M_AMD64 || _M_X64 |
70 | #if _ILP32 |
70 | #if _ILP32 |
71 | #define ECB_AMD64_X32 1 |
71 | #define ECB_AMD64_X32 1 |
72 | #else |
72 | #else |
73 | #define ECB_AMD64 1 |
73 | #define ECB_AMD64 1 |
74 | #endif |
74 | #endif |
… | |
… | |
134 | || defined __ARM_ARCH_6K__ || defined __ARM_ARCH_6ZK__ |
134 | || defined __ARM_ARCH_6K__ || defined __ARM_ARCH_6ZK__ |
135 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mcr p15,0,%0,c7,c10,5" : : "r" (0) : "memory") |
135 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("mcr p15,0,%0,c7,c10,5" : : "r" (0) : "memory") |
136 | #elif defined __ARM_ARCH_7__ || defined __ARM_ARCH_7A__ \ |
136 | #elif defined __ARM_ARCH_7__ || defined __ARM_ARCH_7A__ \ |
137 | || defined __ARM_ARCH_7M__ || defined __ARM_ARCH_7R__ |
137 | || defined __ARM_ARCH_7M__ || defined __ARM_ARCH_7R__ |
138 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb" : : : "memory") |
138 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("dmb" : : : "memory") |
139 | #elif __sparc || __sparc__ |
139 | #elif (__sparc || __sparc__) && !__sparcv8 |
140 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad | #StoreStore | #StoreLoad" : : : "memory") |
140 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad | #StoreStore | #StoreLoad" : : : "memory") |
141 | #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad" : : : "memory") |
141 | #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ ("membar #LoadStore | #LoadLoad" : : : "memory") |
142 | #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("membar #LoadStore | #StoreStore") |
142 | #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ ("membar #LoadStore | #StoreStore") |
143 | #elif defined __s390__ || defined __s390x__ |
143 | #elif defined __s390__ || defined __s390x__ |
144 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("bcr 15,0" : : : "memory") |
144 | #define ECB_MEMORY_FENCE __asm__ __volatile__ ("bcr 15,0" : : : "memory") |
… | |
… | |
587 | |
587 | |
588 | #ifndef ECB_NO_LIBM |
588 | #ifndef ECB_NO_LIBM |
589 | |
589 | |
590 | #include <math.h> /* for frexp*, ldexp*, INFINITY, NAN */ |
590 | #include <math.h> /* for frexp*, ldexp*, INFINITY, NAN */ |
591 | |
591 | |
|
|
592 | /* only the oldest of old doesn't have this one. solaris. */ |
|
|
593 | #ifdef INFINITY |
|
|
594 | #define ECB_INFINITY INFINITY |
|
|
595 | #else |
|
|
596 | #define ECB_INFINITY HUGE_VAL |
|
|
597 | #endif |
|
|
598 | |
592 | #ifdef NEN |
599 | #ifdef NAN |
593 | #define ECB_NAN NAN |
600 | #define ECB_NAN NAN |
594 | #else |
601 | #else |
595 | #define ECB_NAN INFINITY |
602 | #define ECB_NAN ECB_INFINITY |
596 | #endif |
603 | #endif |
597 | |
604 | |
598 | /* converts an ieee half/binary16 to a float */ |
605 | /* converts an ieee half/binary16 to a float */ |
599 | ecb_function_ float ecb_binary16_to_float (uint16_t x) ecb_const; |
606 | ecb_function_ float ecb_binary16_to_float (uint16_t x) ecb_const; |
600 | ecb_function_ float |
607 | ecb_function_ float |
… | |
… | |
605 | float r; |
612 | float r; |
606 | |
613 | |
607 | if (!e ) r = ldexpf (m , -24); |
614 | if (!e ) r = ldexpf (m , -24); |
608 | else if (e != 31) r = ldexpf (m + 0x400, e - 25); |
615 | else if (e != 31) r = ldexpf (m + 0x400, e - 25); |
609 | else if (m ) r = ECB_NAN; |
616 | else if (m ) r = ECB_NAN; |
610 | else r = INFINITY; |
617 | else r = ECB_INFINITY; |
611 | |
618 | |
612 | return x & 0x8000 ? -r : r; |
619 | return x & 0x8000 ? -r : r; |
613 | } |
620 | } |
614 | |
621 | |
615 | /* convert a float to ieee single/binary32 */ |
622 | /* convert a float to ieee single/binary32 */ |