1
2 #include <stdio.h>
3
s_to_f32_imm1(int x)4 __attribute__((noinline)) float s_to_f32_imm1(int x)
5 {
6 float y;
7 __asm__ ("vcvt.f32.s32 %0, %1, #1" : "=w"(y) : "0"(x));
8 return y;
9 }
10
s_to_f32_imm32(int x)11 __attribute__((noinline)) float s_to_f32_imm32(int x)
12 {
13 float y;
14 __asm__ ("vcvt.f32.s32 %0, %1, #32" : "=w"(y) : "0"(x));
15 return y;
16 }
17
try_s_to_f32(int x)18 void try_s_to_f32 ( int x )
19 {
20 float f32 = s_to_f32_imm32(x);
21 printf("s_to_f32_imm32: %11d -> %18.14e\n", x, (double)f32);
22 f32 = s_to_f32_imm1(x);
23 printf("s_to_f32_imm1: %11d -> %18.14e\n", x, (double)f32);
24 }
25
26
27
u_to_f32_imm1(int x)28 __attribute__((noinline)) float u_to_f32_imm1(int x)
29 {
30 float y;
31 __asm__ ("vcvt.f32.u32 %0, %1, #1" : "=w"(y) : "0"(x));
32 return y;
33 }
34
u_to_f32_imm32(int x)35 __attribute__((noinline)) float u_to_f32_imm32(int x)
36 {
37 float y;
38 __asm__ ("vcvt.f32.u32 %0, %1, #32" : "=w"(y) : "0"(x));
39 return y;
40 }
41
try_u_to_f32(unsigned int x)42 void try_u_to_f32 ( unsigned int x )
43 {
44 float f32 = u_to_f32_imm32(x);
45 printf("u_to_f32_imm32: %11u -> %18.14e\n", x, (double)f32);
46 f32 = u_to_f32_imm1(x);
47 printf("u_to_f32_imm1: %11u -> %18.14e\n", x, (double)f32);
48 }
49
50
51 //__attribute__((noinline)) double s_to_f64_imm1(int x)
52 //{
53 // double y;
54 // __asm__ ("vcvt.f64.s32 %P0, %1, #4" : "=w"(y) : "0"((long long)x));
55 // return y;
56 //}
57
58
59
60
main(void)61 int main ( void )
62 {
63 int i;
64 //float f = foo(1);
65 //__asm__ __volatile__("" : : "r"(f) : "cc","memory");
66 try_s_to_f32(0);
67 try_s_to_f32(1);
68 for (i = 100; i < 200; i++) {
69 try_s_to_f32(i);
70 }
71 try_s_to_f32(0x7FFFFFFE);
72 try_s_to_f32(0x7FFFFFFF);
73 try_s_to_f32(0x80000000);
74 try_s_to_f32(0x80000001);
75 try_s_to_f32(0xFFFFFFFE);
76 try_s_to_f32(0xFFFFFFFF);
77 printf("\n");
78 try_u_to_f32(0);
79 try_u_to_f32(1);
80 for (i = 100; i < 200; i++) {
81 try_u_to_f32(i);
82 }
83 try_u_to_f32(0x7FFFFFFE);
84 try_u_to_f32(0x7FFFFFFF);
85 try_u_to_f32(0x80000000);
86 try_u_to_f32(0x80000001);
87 try_u_to_f32(0xFFFFFFFE);
88 try_u_to_f32(0xFFFFFFFF);
89 return 0;
90 }
91