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