blob: 7b2242b7ca551fcf7274c882b43bef0b710142e9 [file] [log] [blame]
/*
* Copyright (c) 2011 The Native Client Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
/*
* More basic tests for floating point operations
*/
#include <stdio.h>
#include "native_client/tests/toolchain/utils.h"
/* NOTE: we use our own definitions instead of stdint.h's */
/* to ensure compatibility with printf format strings. */
/* Getting this right without casting across all our TCs */
/* is very hard otherwise. */
typedef signed int T_int32;
typedef unsigned int T_uint32;
typedef signed long long T_int64;
typedef unsigned long long T_uint64;
volatile T_int32 i32[] = {5, -5,};
volatile T_int64 i64[] = {5, -5, 1LL << 33, -1 * (1LL << 33)};
volatile T_uint32 u32[] = {5, 1<<31};
volatile T_uint64 u64[] = {5, 1LL<<63};
volatile float f32[] = { 5.6, 5.5, 5.4,
-5.6, -5.5, -5.4,
/* TODO(robertm): make this work across all compilers */
/* 1e50, 1e10 */
/* http://code.google.com/p/nativeclient/issues/detail?id=2040 */
};
volatile double f64[] = { 5.6, 5.5, 5.4,
-5.6, -5.5, -5.4,
/* TODO(robertm): make this work across all compilers */
/* 1e50, 1e10 */
};
int main(int argc, char* argv[]) {
int i;
for (i = 0; i < ARRAY_SIZE_UNSAFE(i32); ++i) {
printf("i32: %d\n", i32[i]);
printf("double %.6f\n", (double)i32[i]);
printf("float %.6f\n", (float)i32[i]);
printf("\n");
}
for (i = 0; i < ARRAY_SIZE_UNSAFE(i64); ++i) {
printf("i64: %lld\n", i64[i]);
printf("double %.6f\n", (double)i64[i]);
printf("float %.6f\n", (float)i64[i]);
printf("\n");
}
for (i = 0; i < ARRAY_SIZE_UNSAFE(u32); ++i) {
printf("u32: %u\n", u32[i]);
printf("double %.6f\n", (double)u32[i]);
printf("float %.6f\n", (float)u32[i]);
printf("\n");
}
for (i = 0; i < ARRAY_SIZE_UNSAFE(u64); ++i) {
printf("u64: %llu\n", u64[i]);
printf("double %.6f\n", (double)u64[i]);
printf("float %.6f\n", (float)u64[i]);
printf("\n");
}
for (i = 0; i < ARRAY_SIZE_UNSAFE(f32); ++i) {
printf("f32: %e\n", f32[i]);
printf("int32_t %d\n", (T_int32)f32[i]);
printf("int64_t %lld\n", (T_int64)f32[i]);
if (f32[i] >= 0.0) {
printf("uint32_t %u\n", (T_uint32)f32[i]);
printf("uint64_t %llu\n", (T_uint64)f32[i]);
}
printf("\n");
}
for (i = 0; i < ARRAY_SIZE_UNSAFE(f64); ++i) {
printf("f64: %e\n", f64[i]);
printf("int32_t %d\n", (T_int32)f64[i]);
printf("int64_t %lld\n", (T_int64)f64[i]);
if (f64[i] >= 0.0) {
printf("uint32_t %u\n", (T_uint32)f64[i]);
printf("uint64_t %llu\n", (T_uint64)f64[i]);
}
printf("\n");
}
return 0;
}