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