1663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
2663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng#include <stdio.h>
3663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
4663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng__attribute__((noinline)) float s_to_f32_imm1(int x)
5663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
6663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    float y;
7663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    __asm__ ("vcvt.f32.s32 %0, %1, #1" : "=w"(y) : "0"(x));
8663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    return y;
9663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
10663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
11663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng__attribute__((noinline)) float s_to_f32_imm32(int x)
12663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
13663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    float y;
14663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    __asm__ ("vcvt.f32.s32 %0, %1, #32" : "=w"(y) : "0"(x));
15663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    return y;
16663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
17663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
18663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid try_s_to_f32 ( int x )
19663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
20663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  float f32 = s_to_f32_imm32(x);
21663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  printf("s_to_f32_imm32:  %11d  ->  %18.14e\n", x, (double)f32);
22663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  f32 = s_to_f32_imm1(x);
23663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  printf("s_to_f32_imm1:   %11d  ->  %18.14e\n", x, (double)f32);
24663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
25663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
26663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
27663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
28663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng__attribute__((noinline)) float u_to_f32_imm1(int x)
29663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
30663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    float y;
31663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    __asm__ ("vcvt.f32.u32 %0, %1, #1" : "=w"(y) : "0"(x));
32663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    return y;
33663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
34663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
35663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng__attribute__((noinline)) float u_to_f32_imm32(int x)
36663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
37663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    float y;
38663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    __asm__ ("vcvt.f32.u32 %0, %1, #32" : "=w"(y) : "0"(x));
39663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng    return y;
40663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
41663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
42663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengvoid try_u_to_f32 ( unsigned int x )
43663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
44663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  float f32 = u_to_f32_imm32(x);
45663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  printf("u_to_f32_imm32:  %11u  ->  %18.14e\n", x, (double)f32);
46663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  f32 = u_to_f32_imm1(x);
47663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  printf("u_to_f32_imm1:   %11u  ->  %18.14e\n", x, (double)f32);
48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
49663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
50663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
51663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//__attribute__((noinline)) double s_to_f64_imm1(int x)
52663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//{
53663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//    double y;
54663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//    __asm__ ("vcvt.f64.s32 %P0, %1, #4" : "=w"(y) : "0"((long long)x));
55663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//    return y;
56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng//}
57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng
61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengint main ( void  )
62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng{
63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  int i;
64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  //float f = foo(1);
65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  //__asm__ __volatile__("" : : "r"(f) : "cc","memory");
66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_s_to_f32(0);
67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_s_to_f32(1);
68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  for (i = 100; i < 200; i++) {
69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     try_s_to_f32(i);
70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  }
71663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_s_to_f32(0x7FFFFFFE);
72663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_s_to_f32(0x7FFFFFFF);
73663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_s_to_f32(0x80000000);
74663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_s_to_f32(0x80000001);
75663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_s_to_f32(0xFFFFFFFE);
76663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_s_to_f32(0xFFFFFFFF);
77663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  printf("\n");
78663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_u_to_f32(0);
79663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_u_to_f32(1);
80663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  for (i = 100; i < 200; i++) {
81663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng     try_u_to_f32(i);
82663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  }
83663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_u_to_f32(0x7FFFFFFE);
84663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_u_to_f32(0x7FFFFFFF);
85663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_u_to_f32(0x80000000);
86663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_u_to_f32(0x80000001);
87663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_u_to_f32(0xFFFFFFFE);
88663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  try_u_to_f32(0xFFFFFFFF);
89663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng  return 0;
90663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}
91