OLD | NEW |
(Empty) | |
| 1 ; This tries to be a comprehensive test of f32 and f64 convert operations. |
| 2 ; The CHECK lines are only checking for basic instruction patterns |
| 3 ; that should be present regardless of the optimization level, so |
| 4 ; there are no special OPTM1 match lines. |
| 5 |
| 6 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -O2 | FileCheck %s |
| 7 ; RUN: %p2i --filetype=obj --disassemble -i %s --args -Om1 | FileCheck %s |
| 8 |
| 9 define internal float @fptrunc(double %a) { |
| 10 entry: |
| 11 %conv = fptrunc double %a to float |
| 12 ret float %conv |
| 13 } |
| 14 ; CHECK-LABEL: fptrunc |
| 15 ; CHECK: cvtsd2ss |
| 16 ; CHECK: fld |
| 17 |
| 18 define internal double @fpext(float %a) { |
| 19 entry: |
| 20 %conv = fpext float %a to double |
| 21 ret double %conv |
| 22 } |
| 23 ; CHECK-LABEL: fpext |
| 24 ; CHECK: cvtss2sd |
| 25 ; CHECK: fld |
| 26 |
| 27 define internal i64 @doubleToSigned64(double %a) { |
| 28 entry: |
| 29 %conv = fptosi double %a to i64 |
| 30 ret i64 %conv |
| 31 } |
| 32 ; CHECK-LABEL: doubleToSigned64 |
| 33 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptosi_f64_i64 |
| 34 |
| 35 define internal i64 @floatToSigned64(float %a) { |
| 36 entry: |
| 37 %conv = fptosi float %a to i64 |
| 38 ret i64 %conv |
| 39 } |
| 40 ; CHECK-LABEL: floatToSigned64 |
| 41 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptosi_f32_i64 |
| 42 |
| 43 define internal i64 @doubleToUnsigned64(double %a) { |
| 44 entry: |
| 45 %conv = fptoui double %a to i64 |
| 46 ret i64 %conv |
| 47 } |
| 48 ; CHECK-LABEL: doubleToUnsigned64 |
| 49 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f64_i64 |
| 50 |
| 51 define internal i64 @floatToUnsigned64(float %a) { |
| 52 entry: |
| 53 %conv = fptoui float %a to i64 |
| 54 ret i64 %conv |
| 55 } |
| 56 ; CHECK-LABEL: floatToUnsigned64 |
| 57 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f32_i64 |
| 58 |
| 59 define internal i32 @doubleToSigned32(double %a) { |
| 60 entry: |
| 61 %conv = fptosi double %a to i32 |
| 62 ret i32 %conv |
| 63 } |
| 64 ; CHECK-LABEL: doubleToSigned32 |
| 65 ; CHECK: cvttsd2si |
| 66 |
| 67 define internal i32 @doubleToSigned32Const() { |
| 68 entry: |
| 69 %conv = fptosi double 867.5309 to i32 |
| 70 ret i32 %conv |
| 71 } |
| 72 ; CHECK-LABEL: doubleToSigned32Const |
| 73 ; CHECK: cvttsd2si |
| 74 |
| 75 define internal i32 @floatToSigned32(float %a) { |
| 76 entry: |
| 77 %conv = fptosi float %a to i32 |
| 78 ret i32 %conv |
| 79 } |
| 80 ; CHECK-LABEL: floatToSigned32 |
| 81 ; CHECK: cvttss2si |
| 82 |
| 83 define internal i32 @doubleToUnsigned32(double %a) { |
| 84 entry: |
| 85 %conv = fptoui double %a to i32 |
| 86 ret i32 %conv |
| 87 } |
| 88 ; CHECK-LABEL: doubleToUnsigned32 |
| 89 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f64_i32 |
| 90 |
| 91 define internal i32 @floatToUnsigned32(float %a) { |
| 92 entry: |
| 93 %conv = fptoui float %a to i32 |
| 94 ret i32 %conv |
| 95 } |
| 96 ; CHECK-LABEL: floatToUnsigned32 |
| 97 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f32_i32 |
| 98 |
| 99 define internal i32 @doubleToSigned16(double %a) { |
| 100 entry: |
| 101 %conv = fptosi double %a to i16 |
| 102 %conv.ret_ext = sext i16 %conv to i32 |
| 103 ret i32 %conv.ret_ext |
| 104 } |
| 105 ; CHECK-LABEL: doubleToSigned16 |
| 106 ; CHECK: cvttsd2si |
| 107 ; CHECK: movsx |
| 108 |
| 109 define internal i32 @floatToSigned16(float %a) { |
| 110 entry: |
| 111 %conv = fptosi float %a to i16 |
| 112 %conv.ret_ext = sext i16 %conv to i32 |
| 113 ret i32 %conv.ret_ext |
| 114 } |
| 115 ; CHECK-LABEL: floatToSigned16 |
| 116 ; CHECK: cvttss2si |
| 117 ; CHECK: movsx |
| 118 |
| 119 define internal i32 @doubleToUnsigned16(double %a) { |
| 120 entry: |
| 121 %conv = fptoui double %a to i16 |
| 122 %conv.ret_ext = zext i16 %conv to i32 |
| 123 ret i32 %conv.ret_ext |
| 124 } |
| 125 ; CHECK-LABEL: doubleToUnsigned16 |
| 126 ; CHECK: cvttsd2si |
| 127 ; CHECK: movzx |
| 128 |
| 129 define internal i32 @floatToUnsigned16(float %a) { |
| 130 entry: |
| 131 %conv = fptoui float %a to i16 |
| 132 %conv.ret_ext = zext i16 %conv to i32 |
| 133 ret i32 %conv.ret_ext |
| 134 } |
| 135 ; CHECK-LABEL: floatToUnsigned16 |
| 136 ; CHECK: cvttss2si |
| 137 ; CHECK: movzx |
| 138 |
| 139 define internal i32 @doubleToSigned8(double %a) { |
| 140 entry: |
| 141 %conv = fptosi double %a to i8 |
| 142 %conv.ret_ext = sext i8 %conv to i32 |
| 143 ret i32 %conv.ret_ext |
| 144 } |
| 145 ; CHECK-LABEL: doubleToSigned8 |
| 146 ; CHECK: cvttsd2si |
| 147 ; CHECK: movsx |
| 148 |
| 149 define internal i32 @floatToSigned8(float %a) { |
| 150 entry: |
| 151 %conv = fptosi float %a to i8 |
| 152 %conv.ret_ext = sext i8 %conv to i32 |
| 153 ret i32 %conv.ret_ext |
| 154 } |
| 155 ; CHECK-LABEL: floatToSigned8 |
| 156 ; CHECK: cvttss2si |
| 157 ; CHECK: movsx |
| 158 |
| 159 define internal i32 @doubleToUnsigned8(double %a) { |
| 160 entry: |
| 161 %conv = fptoui double %a to i8 |
| 162 %conv.ret_ext = zext i8 %conv to i32 |
| 163 ret i32 %conv.ret_ext |
| 164 } |
| 165 ; CHECK-LABEL: doubleToUnsigned8 |
| 166 ; CHECK: cvttsd2si |
| 167 ; CHECK: movzx |
| 168 |
| 169 define internal i32 @floatToUnsigned8(float %a) { |
| 170 entry: |
| 171 %conv = fptoui float %a to i8 |
| 172 %conv.ret_ext = zext i8 %conv to i32 |
| 173 ret i32 %conv.ret_ext |
| 174 } |
| 175 ; CHECK-LABEL: floatToUnsigned8 |
| 176 ; CHECK: cvttss2si |
| 177 ; CHECK: movzx |
| 178 |
| 179 define internal i32 @doubleToUnsigned1(double %a) { |
| 180 entry: |
| 181 %tobool = fptoui double %a to i1 |
| 182 %tobool.ret_ext = zext i1 %tobool to i32 |
| 183 ret i32 %tobool.ret_ext |
| 184 } |
| 185 ; CHECK-LABEL: doubleToUnsigned1 |
| 186 ; CHECK: cvttsd2si |
| 187 ; CHECK: and eax,0x1 |
| 188 |
| 189 define internal i32 @floatToUnsigned1(float %a) { |
| 190 entry: |
| 191 %tobool = fptoui float %a to i1 |
| 192 %tobool.ret_ext = zext i1 %tobool to i32 |
| 193 ret i32 %tobool.ret_ext |
| 194 } |
| 195 ; CHECK-LABEL: floatToUnsigned1 |
| 196 ; CHECK: cvttss2si |
| 197 ; CHECK: and eax,0x1 |
| 198 |
| 199 define internal double @signed64ToDouble(i64 %a) { |
| 200 entry: |
| 201 %conv = sitofp i64 %a to double |
| 202 ret double %conv |
| 203 } |
| 204 ; CHECK-LABEL: signed64ToDouble |
| 205 ; CHECK: call {{.*}} R_{{.*}} __Sz_sitofp_i64_f64 |
| 206 ; CHECK: fstp QWORD |
| 207 |
| 208 define internal float @signed64ToFloat(i64 %a) { |
| 209 entry: |
| 210 %conv = sitofp i64 %a to float |
| 211 ret float %conv |
| 212 } |
| 213 ; CHECK-LABEL: signed64ToFloat |
| 214 ; CHECK: call {{.*}} R_{{.*}} __Sz_sitofp_i64_f32 |
| 215 ; CHECK: fstp DWORD |
| 216 |
| 217 define internal double @unsigned64ToDouble(i64 %a) { |
| 218 entry: |
| 219 %conv = uitofp i64 %a to double |
| 220 ret double %conv |
| 221 } |
| 222 ; CHECK-LABEL: unsigned64ToDouble |
| 223 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f64 |
| 224 ; CHECK: fstp |
| 225 |
| 226 define internal float @unsigned64ToFloat(i64 %a) { |
| 227 entry: |
| 228 %conv = uitofp i64 %a to float |
| 229 ret float %conv |
| 230 } |
| 231 ; CHECK-LABEL: unsigned64ToFloat |
| 232 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f32 |
| 233 ; CHECK: fstp |
| 234 |
| 235 define internal double @unsigned64ToDoubleConst() { |
| 236 entry: |
| 237 %conv = uitofp i64 12345678901234 to double |
| 238 ret double %conv |
| 239 } |
| 240 ; CHECK-LABEL: unsigned64ToDouble |
| 241 ; CHECK: mov DWORD PTR [esp+0x4],0xb3a |
| 242 ; CHECK: mov DWORD PTR [esp],0x73ce2ff2 |
| 243 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f64 |
| 244 ; CHECK: fstp |
| 245 |
| 246 define internal double @signed32ToDouble(i32 %a) { |
| 247 entry: |
| 248 %conv = sitofp i32 %a to double |
| 249 ret double %conv |
| 250 } |
| 251 ; CHECK-LABEL: signed32ToDouble |
| 252 ; CHECK: cvtsi2sd |
| 253 ; CHECK: fld |
| 254 |
| 255 define internal double @signed32ToDoubleConst() { |
| 256 entry: |
| 257 %conv = sitofp i32 123 to double |
| 258 ret double %conv |
| 259 } |
| 260 ; CHECK-LABEL: signed32ToDoubleConst |
| 261 ; CHECK: cvtsi2sd {{.*[^1]}} |
| 262 ; CHECK: fld |
| 263 |
| 264 define internal float @signed32ToFloat(i32 %a) { |
| 265 entry: |
| 266 %conv = sitofp i32 %a to float |
| 267 ret float %conv |
| 268 } |
| 269 ; CHECK-LABEL: signed32ToFloat |
| 270 ; CHECK: cvtsi2ss |
| 271 ; CHECK: fld |
| 272 |
| 273 define internal double @unsigned32ToDouble(i32 %a) { |
| 274 entry: |
| 275 %conv = uitofp i32 %a to double |
| 276 ret double %conv |
| 277 } |
| 278 ; CHECK-LABEL: unsigned32ToDouble |
| 279 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i32_f64 |
| 280 ; CHECK: fstp QWORD |
| 281 |
| 282 define internal float @unsigned32ToFloat(i32 %a) { |
| 283 entry: |
| 284 %conv = uitofp i32 %a to float |
| 285 ret float %conv |
| 286 } |
| 287 ; CHECK-LABEL: unsigned32ToFloat |
| 288 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i32_f32 |
| 289 ; CHECK: fstp DWORD |
| 290 |
| 291 define internal double @signed16ToDouble(i32 %a) { |
| 292 entry: |
| 293 %a.arg_trunc = trunc i32 %a to i16 |
| 294 %conv = sitofp i16 %a.arg_trunc to double |
| 295 ret double %conv |
| 296 } |
| 297 ; CHECK-LABEL: signed16ToDouble |
| 298 ; CHECK: cvtsi2sd |
| 299 ; CHECK: fld QWORD |
| 300 |
| 301 define internal float @signed16ToFloat(i32 %a) { |
| 302 entry: |
| 303 %a.arg_trunc = trunc i32 %a to i16 |
| 304 %conv = sitofp i16 %a.arg_trunc to float |
| 305 ret float %conv |
| 306 } |
| 307 ; CHECK-LABEL: signed16ToFloat |
| 308 ; CHECK: cvtsi2ss |
| 309 ; CHECK: fld DWORD |
| 310 |
| 311 define internal double @unsigned16ToDouble(i32 %a) { |
| 312 entry: |
| 313 %a.arg_trunc = trunc i32 %a to i16 |
| 314 %conv = uitofp i16 %a.arg_trunc to double |
| 315 ret double %conv |
| 316 } |
| 317 ; CHECK-LABEL: unsigned16ToDouble |
| 318 ; CHECK: cvtsi2sd |
| 319 ; CHECK: fld |
| 320 |
| 321 define internal double @unsigned16ToDoubleConst() { |
| 322 entry: |
| 323 %conv = uitofp i16 12345 to double |
| 324 ret double %conv |
| 325 } |
| 326 ; CHECK-LABEL: unsigned16ToDoubleConst |
| 327 ; CHECK: cvtsi2sd |
| 328 ; CHECK: fld |
| 329 |
| 330 define internal float @unsigned16ToFloat(i32 %a) { |
| 331 entry: |
| 332 %a.arg_trunc = trunc i32 %a to i16 |
| 333 %conv = uitofp i16 %a.arg_trunc to float |
| 334 ret float %conv |
| 335 } |
| 336 ; CHECK-LABEL: unsigned16ToFloat |
| 337 ; CHECK: cvtsi2ss |
| 338 ; CHECK: fld |
| 339 |
| 340 define internal double @signed8ToDouble(i32 %a) { |
| 341 entry: |
| 342 %a.arg_trunc = trunc i32 %a to i8 |
| 343 %conv = sitofp i8 %a.arg_trunc to double |
| 344 ret double %conv |
| 345 } |
| 346 ; CHECK-LABEL: signed8ToDouble |
| 347 ; CHECK: cvtsi2sd |
| 348 ; CHECK: fld |
| 349 |
| 350 define internal float @signed8ToFloat(i32 %a) { |
| 351 entry: |
| 352 %a.arg_trunc = trunc i32 %a to i8 |
| 353 %conv = sitofp i8 %a.arg_trunc to float |
| 354 ret float %conv |
| 355 } |
| 356 ; CHECK-LABEL: signed8ToFloat |
| 357 ; CHECK: cvtsi2ss |
| 358 ; CHECK: fld |
| 359 |
| 360 define internal double @unsigned8ToDouble(i32 %a) { |
| 361 entry: |
| 362 %a.arg_trunc = trunc i32 %a to i8 |
| 363 %conv = uitofp i8 %a.arg_trunc to double |
| 364 ret double %conv |
| 365 } |
| 366 ; CHECK-LABEL: unsigned8ToDouble |
| 367 ; CHECK: cvtsi2sd |
| 368 ; CHECK: fld |
| 369 |
| 370 define internal float @unsigned8ToFloat(i32 %a) { |
| 371 entry: |
| 372 %a.arg_trunc = trunc i32 %a to i8 |
| 373 %conv = uitofp i8 %a.arg_trunc to float |
| 374 ret float %conv |
| 375 } |
| 376 ; CHECK-LABEL: unsigned8ToFloat |
| 377 ; CHECK: cvtsi2ss |
| 378 ; CHECK: fld |
| 379 |
| 380 define internal double @unsigned1ToDouble(i32 %a) { |
| 381 entry: |
| 382 %a.arg_trunc = trunc i32 %a to i1 |
| 383 %conv = uitofp i1 %a.arg_trunc to double |
| 384 ret double %conv |
| 385 } |
| 386 ; CHECK-LABEL: unsigned1ToDouble |
| 387 ; CHECK: cvtsi2sd |
| 388 ; CHECK: fld |
| 389 |
| 390 define internal float @unsigned1ToFloat(i32 %a) { |
| 391 entry: |
| 392 %a.arg_trunc = trunc i32 %a to i1 |
| 393 %conv = uitofp i1 %a.arg_trunc to float |
| 394 ret float %conv |
| 395 } |
| 396 ; CHECK-LABEL: unsigned1ToFloat |
| 397 ; CHECK: cvtsi2ss |
| 398 ; CHECK: fld |
| 399 |
| 400 define internal float @int32BitcastToFloat(i32 %a) { |
| 401 entry: |
| 402 %conv = bitcast i32 %a to float |
| 403 ret float %conv |
| 404 } |
| 405 ; CHECK-LABEL: int32BitcastToFloat |
| 406 ; CHECK: mov |
| 407 |
| 408 define internal float @int32BitcastToFloatConst() { |
| 409 entry: |
| 410 %conv = bitcast i32 8675309 to float |
| 411 ret float %conv |
| 412 } |
| 413 ; CHECK-LABEL: int32BitcastToFloatConst |
| 414 ; CHECK: mov |
| 415 |
| 416 define internal double @int64BitcastToDouble(i64 %a) { |
| 417 entry: |
| 418 %conv = bitcast i64 %a to double |
| 419 ret double %conv |
| 420 } |
| 421 ; CHECK-LABEL: int64BitcastToDouble |
| 422 ; CHECK: mov |
| 423 |
| 424 define internal double @int64BitcastToDoubleConst() { |
| 425 entry: |
| 426 %conv = bitcast i64 9035768 to double |
| 427 ret double %conv |
| 428 } |
| 429 ; CHECK-LABEL: int64BitcastToDoubleConst |
| 430 ; CHECK: mov |
OLD | NEW |