// { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
|
// { dg-do run { target { { i?86-*-* x86_64-*-* } && ilp32 } } }
|
// { dg-options "-O2" }
|
// { dg-options "-O2" }
|
|
|
// Endian sensitive. This is a little-endian redux.
|
// Endian sensitive. This is a little-endian redux.
|
|
|
typedef long long int64;
|
typedef long long int64;
|
typedef unsigned long long uint64;
|
typedef unsigned long long uint64;
|
typedef __SIZE_TYPE__ size_t;
|
typedef __SIZE_TYPE__ size_t;
|
|
|
extern "C" {
|
extern "C" {
|
extern void *memcpy (void *__restrict __dest,
|
extern void *memcpy (void *__restrict __dest,
|
__const void *__restrict __src, size_t __n) /*throw ()*/;
|
__const void *__restrict __src, size_t __n) /*throw ()*/;
|
extern void abort (void);
|
extern void abort (void);
|
}
|
}
|
|
|
inline uint64 Swap64(uint64 ull) {
|
inline uint64 Swap64(uint64 ull) {
|
uint64 b0 = (ull >> 0) & 0xff;
|
uint64 b0 = (ull >> 0) & 0xff;
|
uint64 b1 = (ull >> 8) & 0xff;
|
uint64 b1 = (ull >> 8) & 0xff;
|
uint64 b2 = (ull >> 16) & 0xff;
|
uint64 b2 = (ull >> 16) & 0xff;
|
uint64 b3 = (ull >> 24) & 0xff;
|
uint64 b3 = (ull >> 24) & 0xff;
|
uint64 b4 = (ull >> 32) & 0xff;
|
uint64 b4 = (ull >> 32) & 0xff;
|
uint64 b5 = (ull >> 40) & 0xff;
|
uint64 b5 = (ull >> 40) & 0xff;
|
uint64 b6 = (ull >> 48) & 0xff;
|
uint64 b6 = (ull >> 48) & 0xff;
|
uint64 b7 = (ull >> 56) & 0xff;
|
uint64 b7 = (ull >> 56) & 0xff;
|
return (b0 << 56) | (b1 << 48) | (b2 << 40) | (b3 << 32) |
|
return (b0 << 56) | (b1 << 48) | (b2 << 40) | (b3 << 32) |
|
(b4 << 24) | (b5 << 16) | (b6 << 8) | (b7 << 0);
|
(b4 << 24) | (b5 << 16) | (b6 << 8) | (b7 << 0);
|
}
|
}
|
|
|
inline void KeyFromUint64(uint64 ull, unsigned char* key) {
|
inline void KeyFromUint64(uint64 ull, unsigned char* key) {
|
uint64 ull_swap = Swap64(ull);
|
uint64 ull_swap = Swap64(ull);
|
memcpy(key, &ull_swap, sizeof(uint64));
|
memcpy(key, &ull_swap, sizeof(uint64));
|
}
|
}
|
|
|
inline int64 int64_from_double(const double& source) {
|
inline int64 int64_from_double(const double& source) {
|
int64 dest;
|
int64 dest;
|
memcpy(&dest, &source, sizeof(dest));
|
memcpy(&dest, &source, sizeof(dest));
|
return dest;
|
return dest;
|
}
|
}
|
|
|
void KeyFromDouble(double x, unsigned char* key) __attribute__ ((noinline));
|
void KeyFromDouble(double x, unsigned char* key) __attribute__ ((noinline));
|
void KeyFromDouble(double x, unsigned char* key) {
|
void KeyFromDouble(double x, unsigned char* key) {
|
int64 n = int64_from_double(x);
|
int64 n = int64_from_double(x);
|
if (n >= 0) {
|
if (n >= 0) {
|
n += 1ull << 63;
|
n += 1ull << 63;
|
} else {
|
} else {
|
n = -n;
|
n = -n;
|
}
|
}
|
KeyFromUint64(n, key);
|
KeyFromUint64(n, key);
|
}
|
}
|
|
|
|
|
void TestKeyFromDouble(uint64 ull) {
|
void TestKeyFromDouble(uint64 ull) {
|
double d;
|
double d;
|
memcpy(&d, &ull, sizeof(d));
|
memcpy(&d, &ull, sizeof(d));
|
|
|
unsigned char key[sizeof(uint64)];
|
unsigned char key[sizeof(uint64)];
|
unsigned char expected_key[sizeof(uint64)] = { 0x81, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
|
unsigned char expected_key[sizeof(uint64)] = { 0x81, 0x23, 0x45, 0x67, 0x89, 0xab, 0xcd, 0xef };
|
|
|
KeyFromDouble(d, key);
|
KeyFromDouble(d, key);
|
|
|
for (size_t i = 0; i < sizeof(key); ++i) {
|
for (size_t i = 0; i < sizeof(key); ++i) {
|
if ((key[i] & 0xff) != expected_key[i])
|
if ((key[i] & 0xff) != expected_key[i])
|
abort ();
|
abort ();
|
}
|
}
|
}
|
}
|
|
|
int main() {
|
int main() {
|
TestKeyFromDouble(0x0123456789abcdefull);
|
TestKeyFromDouble(0x0123456789abcdefull);
|
return 0;
|
return 0;
|
}
|
}
|
|
|