vcvt_fixed_float_VFP.c revision 436e89c602e787e7a27dd6624b09beed41a0da8a
1 2#include <stdio.h> 3#include <string.h> 4 5typedef unsigned long long int ULong; 6 7__attribute__((noinline)) float s32_to_f32_imm1(int x) 8{ 9 float y; 10 __asm__ ("vcvt.f32.s32 %0, %1, #1" : "=w"(y) : "0"(x)); 11 return y; 12} 13 14__attribute__((noinline)) float s32_to_f32_imm32(int x) 15{ 16 float y; 17 __asm__ ("vcvt.f32.s32 %0, %1, #32" : "=w"(y) : "0"(x)); 18 return y; 19} 20 21void try_s32_to_f32 ( int x ) 22{ 23 float f32 = s32_to_f32_imm32(x); 24 printf("s32_to_f32_imm32: %11d -> %18.14e\n", x, (double)f32); 25 f32 = s32_to_f32_imm1(x); 26 printf("s32_to_f32_imm1: %11d -> %18.14e\n", x, (double)f32); 27} 28 29 30 31__attribute__((noinline)) float u32_to_f32_imm1(int x) 32{ 33 float y; 34 __asm__ ("vcvt.f32.u32 %0, %1, #1" : "=w"(y) : "0"(x)); 35 return y; 36} 37 38__attribute__((noinline)) float u32_to_f32_imm32(int x) 39{ 40 float y; 41 __asm__ ("vcvt.f32.u32 %0, %1, #32" : "=w"(y) : "0"(x)); 42 return y; 43} 44 45void try_u32_to_f32 ( unsigned int x ) 46{ 47 float f32 = u32_to_f32_imm32(x); 48 printf("u32_to_f32_imm32: %11u -> %18.14e\n", x, (double)f32); 49 f32 = u32_to_f32_imm1(x); 50 printf("u32_to_f32_imm1: %11u -> %18.14e\n", x, (double)f32); 51} 52 53 54 55__attribute__((noinline)) double s32_to_f64_imm1(int x) 56{ 57 double block[2]; 58 memset(block, 0x55, sizeof(block)); 59 __asm__ __volatile__( 60 "mov r8, %1" "\n\t" 61 "vldr d14, [%0, #8]" "\n\t" // d14 <- junk 62 "vmov s1, r8" "\n\t" 63 "vcvt.f64.s32 d14,d14,#1" "\n\t" 64 "vstr d14, [%0]" "\n\t" 65 : : /*IN*/"r"(&block[0]), "r"(x) : /*TRASH*/"r8","s28","d14","memory" 66 ); 67 return block[0]; 68} 69 70__attribute__((noinline)) double s32_to_f64_imm32(int x) 71{ 72 double block[2]; 73 memset(block, 0x55, sizeof(block)); 74 __asm__ __volatile__( 75 "mov r8, %1" "\n\t" 76 "vldr d14, [%0, #8]" "\n\t" // d14 <- junk 77 "vmov s28, r8" "\n\t" 78 "vcvt.f64.s32 d14,d14,#32" "\n\t" 79 "vstr d14, [%0]" "\n\t" 80 : : /*IN*/"r"(&block[0]), "r"(x) : /*TRASH*/"r8","s28","d14","memory" 81 ); 82 return block[0]; 83} 84 85void try_s32_to_f64 ( int x ) 86{ 87 double f64 = s32_to_f64_imm32(x); 88 printf("s32_to_f64_imm32: %11d -> %18.14e\n", x, f64); 89 f64 = s32_to_f64_imm1(x); 90 printf("s32_to_f64_imm1: %11d -> %18.14e\n", x, f64); 91} 92 93 94 95__attribute__((noinline)) double u32_to_f64_imm1(int x) 96{ 97 double block[2]; 98 memset(block, 0x55, sizeof(block)); 99 __asm__ __volatile__( 100 "mov r8, %1" "\n\t" 101 "vldr d14, [%0, #8]" "\n\t" // d14 <- junk 102 "vmov s28, r8" "\n\t" 103 "vcvt.f64.u32 d14,d14,#1" "\n\t" 104 "vstr d14, [%0]" "\n\t" 105 : : /*IN*/"r"(&block[0]), "r"(x) : /*TRASH*/"r8","s28","d14","memory" 106 ); 107 return block[0]; 108} 109 110__attribute__((noinline)) double u32_to_f64_imm32(int x) 111{ 112 double block[2]; 113 memset(block, 0x55, sizeof(block)); 114 __asm__ __volatile__( 115 "mov r8, %1" "\n\t" 116 "vldr d14, [%0, #8]" "\n\t" // d14 <- junk 117 "vmov s28, r8" "\n\t" 118 "vcvt.f64.u32 d14,d14,#32" "\n\t" 119 "vstr d14, [%0]" "\n\t" 120 : : /*IN*/"r"(&block[0]), "r"(x) : /*TRASH*/"r8","s28","d14","memory" 121 ); 122 return block[0]; 123} 124 125void try_u32_to_f64 ( int x ) 126{ 127 double f64 = u32_to_f64_imm32(x); 128 printf("u32_to_f64_imm32: %11d -> %18.14e\n", x, f64); 129 f64 = u32_to_f64_imm1(x); 130 printf("u32_to_f64_imm1: %11d -> %18.14e\n", x, f64); 131} 132 133 134 135__attribute__((noinline)) ULong f64_to_s32_imm1 ( double d ) 136{ 137 double block[5]; 138 memset(block, 0x55, sizeof(block)); 139 block[1] = d; 140 __asm__ __volatile__( 141 "mov r8, %0" "\n\t" 142 "vldr d14, [r8, #8]" "\n\t" 143 "vcvt.s32.f64 d14,d14,#1" "\n\t" 144 "vstr d14, [r8,#24]" "\n\t" 145 : : /*IN*/"r"(&block[0]) : /*TRASH*/"d14","r8","memory" 146 ); 147 return *(ULong*)(&block[3]); 148} 149 150__attribute__((noinline)) ULong f64_to_s32_imm32 ( double d ) 151{ 152 double block[5]; 153 memset(block, 0x55, sizeof(block)); 154 block[1] = d; 155 __asm__ __volatile__( 156 "mov r8, %0" "\n\t" 157 "vldr d14, [r8, #8]" "\n\t" 158 "vcvt.s32.f64 d14,d14,#32" "\n\t" 159 "vstr d14, [r8,#24]" "\n\t" 160 : : /*IN*/"r"(&block[0]) : /*TRASH*/"d14","r8","memory" 161 ); 162 return *(ULong*)(&block[3]); 163} 164 165void try_f64_to_s32 ( double d ) 166{ 167 ULong res = f64_to_s32_imm32(d); 168 printf("f64_to_s32_imm32: %18.14e -> 0x%016llx\n", d, res); 169 res = f64_to_s32_imm1(d); 170 printf("f64_to_s32_imm1: %18.14e -> 0x%016llx\n", d, res); 171} 172 173 174 175__attribute__((noinline)) ULong f64_to_u32_imm1 ( double d ) 176{ 177 double block[5]; 178 memset(block, 0x55, sizeof(block)); 179 block[1] = d; 180 __asm__ __volatile__( 181 "mov r8, %0" "\n\t" 182 "vldr d14, [r8, #8]" "\n\t" 183 "vcvt.u32.f64 d14,d14,#1" "\n\t" 184 "vstr d14, [r8,#24]" "\n\t" 185 : : /*IN*/"r"(&block[0]) : /*TRASH*/"d14","r8","memory" 186 ); 187 return *(ULong*)(&block[3]); 188} 189 190__attribute__((noinline)) ULong f64_to_u32_imm32 ( double d ) 191{ 192 double block[5]; 193 memset(block, 0x55, sizeof(block)); 194 block[1] = d; 195 __asm__ __volatile__( 196 "mov r8, %0" "\n\t" 197 "vldr d14, [r8, #8]" "\n\t" 198 "vcvt.u32.f64 d14,d14,#32" "\n\t" 199 "vstr d14, [r8,#24]" "\n\t" 200 : : /*IN*/"r"(&block[0]) : /*TRASH*/"d14","r8","memory" 201 ); 202 return *(ULong*)(&block[3]); 203} 204 205void try_f64_to_u32 ( double d ) 206{ 207 ULong res = f64_to_u32_imm32(d); 208 printf("f64_to_u32_imm32: %18.14e -> 0x%016llx\n", d, res); 209 res = f64_to_u32_imm1(d); 210 printf("f64_to_u32_imm1: %18.14e -> 0x%016llx\n", d, res); 211} 212 213 214 215int main ( void ) 216{ 217 int i; 218 double d; 219 220 try_s32_to_f32(0); 221 try_s32_to_f32(1); 222 for (i = 100; i < 200; i++) { 223 try_s32_to_f32(i); 224 } 225 try_s32_to_f32(0x7FFFFFFE); 226 try_s32_to_f32(0x7FFFFFFF); 227 try_s32_to_f32(0x80000000); 228 try_s32_to_f32(0x80000001); 229 try_s32_to_f32(0xFFFFFFFE); 230 try_s32_to_f32(0xFFFFFFFF); 231 232 printf("\n"); 233 234 try_u32_to_f32(0); 235 try_u32_to_f32(1); 236 for (i = 100; i < 200; i++) { 237 try_u32_to_f32(i); 238 } 239 try_u32_to_f32(0x7FFFFFFE); 240 try_u32_to_f32(0x7FFFFFFF); 241 try_u32_to_f32(0x80000000); 242 try_u32_to_f32(0x80000001); 243 try_u32_to_f32(0xFFFFFFFE); 244 try_u32_to_f32(0xFFFFFFFF); 245 246 printf("\n"); 247 248 try_s32_to_f64(0); 249 try_s32_to_f64(1); 250 for (i = 100; i < 200; i++) { 251 try_s32_to_f64(i); 252 } 253 try_s32_to_f64(0x7FFFFFFE); 254 try_s32_to_f64(0x7FFFFFFF); 255 try_s32_to_f64(0x80000000); 256 try_s32_to_f64(0x80000001); 257 try_s32_to_f64(0xFFFFFFFE); 258 try_s32_to_f64(0xFFFFFFFF); 259 260 printf("\n"); 261 262 try_u32_to_f64(0); 263 try_u32_to_f64(1); 264 for (i = 100; i < 200; i++) { 265 try_u32_to_f64(i); 266 } 267 try_u32_to_f64(0x7FFFFFFE); 268 try_u32_to_f64(0x7FFFFFFF); 269 try_u32_to_f64(0x80000000); 270 try_u32_to_f64(0x80000001); 271 try_u32_to_f64(0xFFFFFFFE); 272 try_u32_to_f64(0xFFFFFFFF); 273 274 printf("\n"); 275 try_f64_to_s32(0.0); 276 try_f64_to_s32(1.0); 277 try_f64_to_s32(-1.0); 278 try_f64_to_s32(0.0 / 0.0); 279 for (d = -100000.01; d < 100000.0; d += 10000.0) { 280 try_f64_to_s32(d); 281 } 282 283 printf("\n"); 284 try_f64_to_u32(0.0); 285 try_f64_to_u32(1.0); 286 try_f64_to_u32(-1.0); 287 try_f64_to_u32(0.0 / 0.0); 288 for (d = -100000.01; d < 100000.0; d += 10000.0) { 289 try_f64_to_u32(d); 290 } 291 292 return 0; 293} 294