| OLD | NEW |
| (Empty) |
| 1 ; This tries to be a comprehensive test of f32 and f64 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 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4 | |
| 10 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4 | |
| 11 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8 | |
| 12 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4 | |
| 13 | |
| 14 define internal i32 @doubleArgs(double %a, i32 %b, double %c) { | |
| 15 entry: | |
| 16 ret i32 %b | |
| 17 } | |
| 18 ; CHECK-LABEL: doubleArgs | |
| 19 ; CHECK: mov eax,DWORD PTR [esp+0xc] | |
| 20 ; CHECK-NEXT: ret | |
| 21 | |
| 22 define internal i32 @floatArgs(float %a, i32 %b, float %c) { | |
| 23 entry: | |
| 24 ret i32 %b | |
| 25 } | |
| 26 ; CHECK-LABEL: floatArgs | |
| 27 ; CHECK: mov eax,DWORD PTR [esp+0x8] | |
| 28 ; CHECK-NEXT: ret | |
| 29 | |
| 30 define internal i32 @passFpArgs(float %a, double %b, float %c, double %d, float
%e, double %f) { | |
| 31 entry: | |
| 32 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double %b) | |
| 33 %call1 = call i32 @ignoreFpArgsNoInline(float %c, i32 123, double %d) | |
| 34 %call2 = call i32 @ignoreFpArgsNoInline(float %e, i32 123, double %f) | |
| 35 %add = add i32 %call1, %call | |
| 36 %add3 = add i32 %add, %call2 | |
| 37 ret i32 %add3 | |
| 38 } | |
| 39 ; CHECK-LABEL: passFpArgs | |
| 40 ; CHECK: mov DWORD PTR [esp+0x4],0x7b | |
| 41 ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline | |
| 42 ; CHECK: mov DWORD PTR [esp+0x4],0x7b | |
| 43 ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline | |
| 44 ; CHECK: mov DWORD PTR [esp+0x4],0x7b | |
| 45 ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline | |
| 46 | |
| 47 declare i32 @ignoreFpArgsNoInline(float %x, i32 %y, double %z) | |
| 48 | |
| 49 define internal i32 @passFpConstArg(float %a, double %b) { | |
| 50 entry: | |
| 51 %call = call i32 @ignoreFpArgsNoInline(float %a, i32 123, double 2.340000e+00) | |
| 52 ret i32 %call | |
| 53 } | |
| 54 ; CHECK-LABEL: passFpConstArg | |
| 55 ; CHECK: mov DWORD PTR [esp+0x4],0x7b | |
| 56 ; CHECK: call {{.*}} R_{{.*}} ignoreFpArgsNoInline | |
| 57 | |
| 58 define internal i32 @passFp32ConstArg(float %a) { | |
| 59 entry: | |
| 60 %call = call i32 @ignoreFp32ArgsNoInline(float %a, i32 123, float 2.0) | |
| 61 ret i32 %call | |
| 62 } | |
| 63 ; CHECK-LABEL: passFp32ConstArg | |
| 64 ; CHECK: mov DWORD PTR [esp+0x4],0x7b | |
| 65 ; CHECK: movss DWORD PTR [esp+0x8] | |
| 66 ; CHECK: call {{.*}} R_{{.*}} ignoreFp32ArgsNoInline | |
| 67 | |
| 68 declare i32 @ignoreFp32ArgsNoInline(float %x, i32 %y, float %z) | |
| 69 | |
| 70 define internal float @returnFloatArg(float %a) { | |
| 71 entry: | |
| 72 ret float %a | |
| 73 } | |
| 74 ; CHECK-LABEL: returnFloatArg | |
| 75 ; CHECK: fld DWORD PTR [esp | |
| 76 | |
| 77 define internal double @returnDoubleArg(double %a) { | |
| 78 entry: | |
| 79 ret double %a | |
| 80 } | |
| 81 ; CHECK-LABEL: returnDoubleArg | |
| 82 ; CHECK: fld QWORD PTR [esp | |
| 83 | |
| 84 define internal float @returnFloatConst() { | |
| 85 entry: | |
| 86 ret float 0x3FF3AE1480000000 | |
| 87 } | |
| 88 ; CHECK-LABEL: returnFloatConst | |
| 89 ; CHECK: fld | |
| 90 | |
| 91 define internal double @returnDoubleConst() { | |
| 92 entry: | |
| 93 ret double 1.230000e+00 | |
| 94 } | |
| 95 ; CHECK-LABEL: returnDoubleConst | |
| 96 ; CHECK: fld | |
| 97 | |
| 98 define internal float @addFloat(float %a, float %b) { | |
| 99 entry: | |
| 100 %add = fadd float %a, %b | |
| 101 ret float %add | |
| 102 } | |
| 103 ; CHECK-LABEL: addFloat | |
| 104 ; CHECK: addss | |
| 105 ; CHECK: fld | |
| 106 | |
| 107 define internal double @addDouble(double %a, double %b) { | |
| 108 entry: | |
| 109 %add = fadd double %a, %b | |
| 110 ret double %add | |
| 111 } | |
| 112 ; CHECK-LABEL: addDouble | |
| 113 ; CHECK: addsd | |
| 114 ; CHECK: fld | |
| 115 | |
| 116 define internal float @subFloat(float %a, float %b) { | |
| 117 entry: | |
| 118 %sub = fsub float %a, %b | |
| 119 ret float %sub | |
| 120 } | |
| 121 ; CHECK-LABEL: subFloat | |
| 122 ; CHECK: subss | |
| 123 ; CHECK: fld | |
| 124 | |
| 125 define internal double @subDouble(double %a, double %b) { | |
| 126 entry: | |
| 127 %sub = fsub double %a, %b | |
| 128 ret double %sub | |
| 129 } | |
| 130 ; CHECK-LABEL: subDouble | |
| 131 ; CHECK: subsd | |
| 132 ; CHECK: fld | |
| 133 | |
| 134 define internal float @mulFloat(float %a, float %b) { | |
| 135 entry: | |
| 136 %mul = fmul float %a, %b | |
| 137 ret float %mul | |
| 138 } | |
| 139 ; CHECK-LABEL: mulFloat | |
| 140 ; CHECK: mulss | |
| 141 ; CHECK: fld | |
| 142 | |
| 143 define internal double @mulDouble(double %a, double %b) { | |
| 144 entry: | |
| 145 %mul = fmul double %a, %b | |
| 146 ret double %mul | |
| 147 } | |
| 148 ; CHECK-LABEL: mulDouble | |
| 149 ; CHECK: mulsd | |
| 150 ; CHECK: fld | |
| 151 | |
| 152 define internal float @divFloat(float %a, float %b) { | |
| 153 entry: | |
| 154 %div = fdiv float %a, %b | |
| 155 ret float %div | |
| 156 } | |
| 157 ; CHECK-LABEL: divFloat | |
| 158 ; CHECK: divss | |
| 159 ; CHECK: fld | |
| 160 | |
| 161 define internal double @divDouble(double %a, double %b) { | |
| 162 entry: | |
| 163 %div = fdiv double %a, %b | |
| 164 ret double %div | |
| 165 } | |
| 166 ; CHECK-LABEL: divDouble | |
| 167 ; CHECK: divsd | |
| 168 ; CHECK: fld | |
| 169 | |
| 170 define internal float @remFloat(float %a, float %b) { | |
| 171 entry: | |
| 172 %div = frem float %a, %b | |
| 173 ret float %div | |
| 174 } | |
| 175 ; CHECK-LABEL: remFloat | |
| 176 ; CHECK: call {{.*}} R_{{.*}} fmodf | |
| 177 | |
| 178 define internal double @remDouble(double %a, double %b) { | |
| 179 entry: | |
| 180 %div = frem double %a, %b | |
| 181 ret double %div | |
| 182 } | |
| 183 ; CHECK-LABEL: remDouble | |
| 184 ; CHECK: call {{.*}} R_{{.*}} fmod | |
| 185 | |
| 186 define internal float @fptrunc(double %a) { | |
| 187 entry: | |
| 188 %conv = fptrunc double %a to float | |
| 189 ret float %conv | |
| 190 } | |
| 191 ; CHECK-LABEL: fptrunc | |
| 192 ; CHECK: cvtsd2ss | |
| 193 ; CHECK: fld | |
| 194 | |
| 195 define internal double @fpext(float %a) { | |
| 196 entry: | |
| 197 %conv = fpext float %a to double | |
| 198 ret double %conv | |
| 199 } | |
| 200 ; CHECK-LABEL: fpext | |
| 201 ; CHECK: cvtss2sd | |
| 202 ; CHECK: fld | |
| 203 | |
| 204 define internal i64 @doubleToSigned64(double %a) { | |
| 205 entry: | |
| 206 %conv = fptosi double %a to i64 | |
| 207 ret i64 %conv | |
| 208 } | |
| 209 ; CHECK-LABEL: doubleToSigned64 | |
| 210 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptosi_f64_i64 | |
| 211 | |
| 212 define internal i64 @floatToSigned64(float %a) { | |
| 213 entry: | |
| 214 %conv = fptosi float %a to i64 | |
| 215 ret i64 %conv | |
| 216 } | |
| 217 ; CHECK-LABEL: floatToSigned64 | |
| 218 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptosi_f32_i64 | |
| 219 | |
| 220 define internal i64 @doubleToUnsigned64(double %a) { | |
| 221 entry: | |
| 222 %conv = fptoui double %a to i64 | |
| 223 ret i64 %conv | |
| 224 } | |
| 225 ; CHECK-LABEL: doubleToUnsigned64 | |
| 226 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f64_i64 | |
| 227 | |
| 228 define internal i64 @floatToUnsigned64(float %a) { | |
| 229 entry: | |
| 230 %conv = fptoui float %a to i64 | |
| 231 ret i64 %conv | |
| 232 } | |
| 233 ; CHECK-LABEL: floatToUnsigned64 | |
| 234 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f32_i64 | |
| 235 | |
| 236 define internal i32 @doubleToSigned32(double %a) { | |
| 237 entry: | |
| 238 %conv = fptosi double %a to i32 | |
| 239 ret i32 %conv | |
| 240 } | |
| 241 ; CHECK-LABEL: doubleToSigned32 | |
| 242 ; CHECK: cvttsd2si | |
| 243 | |
| 244 define internal i32 @doubleToSigned32Const() { | |
| 245 entry: | |
| 246 %conv = fptosi double 867.5309 to i32 | |
| 247 ret i32 %conv | |
| 248 } | |
| 249 ; CHECK-LABEL: doubleToSigned32Const | |
| 250 ; CHECK: cvttsd2si | |
| 251 | |
| 252 define internal i32 @floatToSigned32(float %a) { | |
| 253 entry: | |
| 254 %conv = fptosi float %a to i32 | |
| 255 ret i32 %conv | |
| 256 } | |
| 257 ; CHECK-LABEL: floatToSigned32 | |
| 258 ; CHECK: cvttss2si | |
| 259 | |
| 260 define internal i32 @doubleToUnsigned32(double %a) { | |
| 261 entry: | |
| 262 %conv = fptoui double %a to i32 | |
| 263 ret i32 %conv | |
| 264 } | |
| 265 ; CHECK-LABEL: doubleToUnsigned32 | |
| 266 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f64_i32 | |
| 267 | |
| 268 define internal i32 @floatToUnsigned32(float %a) { | |
| 269 entry: | |
| 270 %conv = fptoui float %a to i32 | |
| 271 ret i32 %conv | |
| 272 } | |
| 273 ; CHECK-LABEL: floatToUnsigned32 | |
| 274 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f32_i32 | |
| 275 | |
| 276 define internal i32 @doubleToSigned16(double %a) { | |
| 277 entry: | |
| 278 %conv = fptosi double %a to i16 | |
| 279 %conv.ret_ext = sext i16 %conv to i32 | |
| 280 ret i32 %conv.ret_ext | |
| 281 } | |
| 282 ; CHECK-LABEL: doubleToSigned16 | |
| 283 ; CHECK: cvttsd2si | |
| 284 ; CHECK: movsx | |
| 285 | |
| 286 define internal i32 @floatToSigned16(float %a) { | |
| 287 entry: | |
| 288 %conv = fptosi float %a to i16 | |
| 289 %conv.ret_ext = sext i16 %conv to i32 | |
| 290 ret i32 %conv.ret_ext | |
| 291 } | |
| 292 ; CHECK-LABEL: floatToSigned16 | |
| 293 ; CHECK: cvttss2si | |
| 294 ; CHECK: movsx | |
| 295 | |
| 296 define internal i32 @doubleToUnsigned16(double %a) { | |
| 297 entry: | |
| 298 %conv = fptoui double %a to i16 | |
| 299 %conv.ret_ext = zext i16 %conv to i32 | |
| 300 ret i32 %conv.ret_ext | |
| 301 } | |
| 302 ; CHECK-LABEL: doubleToUnsigned16 | |
| 303 ; CHECK: cvttsd2si | |
| 304 ; CHECK: movzx | |
| 305 | |
| 306 define internal i32 @floatToUnsigned16(float %a) { | |
| 307 entry: | |
| 308 %conv = fptoui float %a to i16 | |
| 309 %conv.ret_ext = zext i16 %conv to i32 | |
| 310 ret i32 %conv.ret_ext | |
| 311 } | |
| 312 ; CHECK-LABEL: floatToUnsigned16 | |
| 313 ; CHECK: cvttss2si | |
| 314 ; CHECK: movzx | |
| 315 | |
| 316 define internal i32 @doubleToSigned8(double %a) { | |
| 317 entry: | |
| 318 %conv = fptosi double %a to i8 | |
| 319 %conv.ret_ext = sext i8 %conv to i32 | |
| 320 ret i32 %conv.ret_ext | |
| 321 } | |
| 322 ; CHECK-LABEL: doubleToSigned8 | |
| 323 ; CHECK: cvttsd2si | |
| 324 ; CHECK: movsx | |
| 325 | |
| 326 define internal i32 @floatToSigned8(float %a) { | |
| 327 entry: | |
| 328 %conv = fptosi float %a to i8 | |
| 329 %conv.ret_ext = sext i8 %conv to i32 | |
| 330 ret i32 %conv.ret_ext | |
| 331 } | |
| 332 ; CHECK-LABEL: floatToSigned8 | |
| 333 ; CHECK: cvttss2si | |
| 334 ; CHECK: movsx | |
| 335 | |
| 336 define internal i32 @doubleToUnsigned8(double %a) { | |
| 337 entry: | |
| 338 %conv = fptoui double %a to i8 | |
| 339 %conv.ret_ext = zext i8 %conv to i32 | |
| 340 ret i32 %conv.ret_ext | |
| 341 } | |
| 342 ; CHECK-LABEL: doubleToUnsigned8 | |
| 343 ; CHECK: cvttsd2si | |
| 344 ; CHECK: movzx | |
| 345 | |
| 346 define internal i32 @floatToUnsigned8(float %a) { | |
| 347 entry: | |
| 348 %conv = fptoui float %a to i8 | |
| 349 %conv.ret_ext = zext i8 %conv to i32 | |
| 350 ret i32 %conv.ret_ext | |
| 351 } | |
| 352 ; CHECK-LABEL: floatToUnsigned8 | |
| 353 ; CHECK: cvttss2si | |
| 354 ; CHECK: movzx | |
| 355 | |
| 356 define internal i32 @doubleToUnsigned1(double %a) { | |
| 357 entry: | |
| 358 %tobool = fptoui double %a to i1 | |
| 359 %tobool.ret_ext = zext i1 %tobool to i32 | |
| 360 ret i32 %tobool.ret_ext | |
| 361 } | |
| 362 ; CHECK-LABEL: doubleToUnsigned1 | |
| 363 ; CHECK: cvttsd2si | |
| 364 ; CHECK: and eax,0x1 | |
| 365 | |
| 366 define internal i32 @floatToUnsigned1(float %a) { | |
| 367 entry: | |
| 368 %tobool = fptoui float %a to i1 | |
| 369 %tobool.ret_ext = zext i1 %tobool to i32 | |
| 370 ret i32 %tobool.ret_ext | |
| 371 } | |
| 372 ; CHECK-LABEL: floatToUnsigned1 | |
| 373 ; CHECK: cvttss2si | |
| 374 ; CHECK: and eax,0x1 | |
| 375 | |
| 376 define internal double @signed64ToDouble(i64 %a) { | |
| 377 entry: | |
| 378 %conv = sitofp i64 %a to double | |
| 379 ret double %conv | |
| 380 } | |
| 381 ; CHECK-LABEL: signed64ToDouble | |
| 382 ; CHECK: call {{.*}} R_{{.*}} __Sz_sitofp_i64_f64 | |
| 383 ; CHECK: fstp QWORD | |
| 384 | |
| 385 define internal float @signed64ToFloat(i64 %a) { | |
| 386 entry: | |
| 387 %conv = sitofp i64 %a to float | |
| 388 ret float %conv | |
| 389 } | |
| 390 ; CHECK-LABEL: signed64ToFloat | |
| 391 ; CHECK: call {{.*}} R_{{.*}} __Sz_sitofp_i64_f32 | |
| 392 ; CHECK: fstp DWORD | |
| 393 | |
| 394 define internal double @unsigned64ToDouble(i64 %a) { | |
| 395 entry: | |
| 396 %conv = uitofp i64 %a to double | |
| 397 ret double %conv | |
| 398 } | |
| 399 ; CHECK-LABEL: unsigned64ToDouble | |
| 400 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f64 | |
| 401 ; CHECK: fstp | |
| 402 | |
| 403 define internal float @unsigned64ToFloat(i64 %a) { | |
| 404 entry: | |
| 405 %conv = uitofp i64 %a to float | |
| 406 ret float %conv | |
| 407 } | |
| 408 ; CHECK-LABEL: unsigned64ToFloat | |
| 409 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f32 | |
| 410 ; CHECK: fstp | |
| 411 | |
| 412 define internal double @unsigned64ToDoubleConst() { | |
| 413 entry: | |
| 414 %conv = uitofp i64 12345678901234 to double | |
| 415 ret double %conv | |
| 416 } | |
| 417 ; CHECK-LABEL: unsigned64ToDouble | |
| 418 ; CHECK: mov DWORD PTR [esp+0x4],0xb3a | |
| 419 ; CHECK: mov DWORD PTR [esp],0x73ce2ff2 | |
| 420 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f64 | |
| 421 ; CHECK: fstp | |
| 422 | |
| 423 define internal double @signed32ToDouble(i32 %a) { | |
| 424 entry: | |
| 425 %conv = sitofp i32 %a to double | |
| 426 ret double %conv | |
| 427 } | |
| 428 ; CHECK-LABEL: signed32ToDouble | |
| 429 ; CHECK: cvtsi2sd | |
| 430 ; CHECK: fld | |
| 431 | |
| 432 define internal double @signed32ToDoubleConst() { | |
| 433 entry: | |
| 434 %conv = sitofp i32 123 to double | |
| 435 ret double %conv | |
| 436 } | |
| 437 ; CHECK-LABEL: signed32ToDoubleConst | |
| 438 ; CHECK: cvtsi2sd {{.*[^1]}} | |
| 439 ; CHECK: fld | |
| 440 | |
| 441 define internal float @signed32ToFloat(i32 %a) { | |
| 442 entry: | |
| 443 %conv = sitofp i32 %a to float | |
| 444 ret float %conv | |
| 445 } | |
| 446 ; CHECK-LABEL: signed32ToFloat | |
| 447 ; CHECK: cvtsi2ss | |
| 448 ; CHECK: fld | |
| 449 | |
| 450 define internal double @unsigned32ToDouble(i32 %a) { | |
| 451 entry: | |
| 452 %conv = uitofp i32 %a to double | |
| 453 ret double %conv | |
| 454 } | |
| 455 ; CHECK-LABEL: unsigned32ToDouble | |
| 456 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i32_f64 | |
| 457 ; CHECK: fstp QWORD | |
| 458 | |
| 459 define internal float @unsigned32ToFloat(i32 %a) { | |
| 460 entry: | |
| 461 %conv = uitofp i32 %a to float | |
| 462 ret float %conv | |
| 463 } | |
| 464 ; CHECK-LABEL: unsigned32ToFloat | |
| 465 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i32_f32 | |
| 466 ; CHECK: fstp DWORD | |
| 467 | |
| 468 define internal double @signed16ToDouble(i32 %a) { | |
| 469 entry: | |
| 470 %a.arg_trunc = trunc i32 %a to i16 | |
| 471 %conv = sitofp i16 %a.arg_trunc to double | |
| 472 ret double %conv | |
| 473 } | |
| 474 ; CHECK-LABEL: signed16ToDouble | |
| 475 ; CHECK: cvtsi2sd | |
| 476 ; CHECK: fld QWORD | |
| 477 | |
| 478 define internal float @signed16ToFloat(i32 %a) { | |
| 479 entry: | |
| 480 %a.arg_trunc = trunc i32 %a to i16 | |
| 481 %conv = sitofp i16 %a.arg_trunc to float | |
| 482 ret float %conv | |
| 483 } | |
| 484 ; CHECK-LABEL: signed16ToFloat | |
| 485 ; CHECK: cvtsi2ss | |
| 486 ; CHECK: fld DWORD | |
| 487 | |
| 488 define internal double @unsigned16ToDouble(i32 %a) { | |
| 489 entry: | |
| 490 %a.arg_trunc = trunc i32 %a to i16 | |
| 491 %conv = uitofp i16 %a.arg_trunc to double | |
| 492 ret double %conv | |
| 493 } | |
| 494 ; CHECK-LABEL: unsigned16ToDouble | |
| 495 ; CHECK: cvtsi2sd | |
| 496 ; CHECK: fld | |
| 497 | |
| 498 define internal double @unsigned16ToDoubleConst() { | |
| 499 entry: | |
| 500 %conv = uitofp i16 12345 to double | |
| 501 ret double %conv | |
| 502 } | |
| 503 ; CHECK-LABEL: unsigned16ToDoubleConst | |
| 504 ; CHECK: cvtsi2sd | |
| 505 ; CHECK: fld | |
| 506 | |
| 507 define internal float @unsigned16ToFloat(i32 %a) { | |
| 508 entry: | |
| 509 %a.arg_trunc = trunc i32 %a to i16 | |
| 510 %conv = uitofp i16 %a.arg_trunc to float | |
| 511 ret float %conv | |
| 512 } | |
| 513 ; CHECK-LABEL: unsigned16ToFloat | |
| 514 ; CHECK: cvtsi2ss | |
| 515 ; CHECK: fld | |
| 516 | |
| 517 define internal double @signed8ToDouble(i32 %a) { | |
| 518 entry: | |
| 519 %a.arg_trunc = trunc i32 %a to i8 | |
| 520 %conv = sitofp i8 %a.arg_trunc to double | |
| 521 ret double %conv | |
| 522 } | |
| 523 ; CHECK-LABEL: signed8ToDouble | |
| 524 ; CHECK: cvtsi2sd | |
| 525 ; CHECK: fld | |
| 526 | |
| 527 define internal float @signed8ToFloat(i32 %a) { | |
| 528 entry: | |
| 529 %a.arg_trunc = trunc i32 %a to i8 | |
| 530 %conv = sitofp i8 %a.arg_trunc to float | |
| 531 ret float %conv | |
| 532 } | |
| 533 ; CHECK-LABEL: signed8ToFloat | |
| 534 ; CHECK: cvtsi2ss | |
| 535 ; CHECK: fld | |
| 536 | |
| 537 define internal double @unsigned8ToDouble(i32 %a) { | |
| 538 entry: | |
| 539 %a.arg_trunc = trunc i32 %a to i8 | |
| 540 %conv = uitofp i8 %a.arg_trunc to double | |
| 541 ret double %conv | |
| 542 } | |
| 543 ; CHECK-LABEL: unsigned8ToDouble | |
| 544 ; CHECK: cvtsi2sd | |
| 545 ; CHECK: fld | |
| 546 | |
| 547 define internal float @unsigned8ToFloat(i32 %a) { | |
| 548 entry: | |
| 549 %a.arg_trunc = trunc i32 %a to i8 | |
| 550 %conv = uitofp i8 %a.arg_trunc to float | |
| 551 ret float %conv | |
| 552 } | |
| 553 ; CHECK-LABEL: unsigned8ToFloat | |
| 554 ; CHECK: cvtsi2ss | |
| 555 ; CHECK: fld | |
| 556 | |
| 557 define internal double @unsigned1ToDouble(i32 %a) { | |
| 558 entry: | |
| 559 %a.arg_trunc = trunc i32 %a to i1 | |
| 560 %conv = uitofp i1 %a.arg_trunc to double | |
| 561 ret double %conv | |
| 562 } | |
| 563 ; CHECK-LABEL: unsigned1ToDouble | |
| 564 ; CHECK: cvtsi2sd | |
| 565 ; CHECK: fld | |
| 566 | |
| 567 define internal float @unsigned1ToFloat(i32 %a) { | |
| 568 entry: | |
| 569 %a.arg_trunc = trunc i32 %a to i1 | |
| 570 %conv = uitofp i1 %a.arg_trunc to float | |
| 571 ret float %conv | |
| 572 } | |
| 573 ; CHECK-LABEL: unsigned1ToFloat | |
| 574 ; CHECK: cvtsi2ss | |
| 575 ; CHECK: fld | |
| 576 | |
| 577 define internal float @int32BitcastToFloat(i32 %a) { | |
| 578 entry: | |
| 579 %conv = bitcast i32 %a to float | |
| 580 ret float %conv | |
| 581 } | |
| 582 ; CHECK-LABEL: int32BitcastToFloat | |
| 583 ; CHECK: mov | |
| 584 | |
| 585 define internal float @int32BitcastToFloatConst() { | |
| 586 entry: | |
| 587 %conv = bitcast i32 8675309 to float | |
| 588 ret float %conv | |
| 589 } | |
| 590 ; CHECK-LABEL: int32BitcastToFloatConst | |
| 591 ; CHECK: mov | |
| 592 | |
| 593 define internal double @int64BitcastToDouble(i64 %a) { | |
| 594 entry: | |
| 595 %conv = bitcast i64 %a to double | |
| 596 ret double %conv | |
| 597 } | |
| 598 ; CHECK-LABEL: int64BitcastToDouble | |
| 599 ; CHECK: mov | |
| 600 | |
| 601 define internal double @int64BitcastToDoubleConst() { | |
| 602 entry: | |
| 603 %conv = bitcast i64 9035768 to double | |
| 604 ret double %conv | |
| 605 } | |
| 606 ; CHECK-LABEL: int64BitcastToDoubleConst | |
| 607 ; CHECK: mov | |
| 608 | |
| 609 define internal void @fcmpEq(float %a, float %b, double %c, double %d) { | |
| 610 entry: | |
| 611 %cmp = fcmp oeq float %a, %b | |
| 612 br i1 %cmp, label %if.then, label %if.end | |
| 613 | |
| 614 if.then: ; preds = %entry | |
| 615 call void @func() | |
| 616 br label %if.end | |
| 617 | |
| 618 if.end: ; preds = %if.then, %entry | |
| 619 %cmp1 = fcmp oeq double %c, %d | |
| 620 br i1 %cmp1, label %if.then2, label %if.end3 | |
| 621 | |
| 622 if.then2: ; preds = %if.end | |
| 623 call void @func() | |
| 624 br label %if.end3 | |
| 625 | |
| 626 if.end3: ; preds = %if.then2, %if.end | |
| 627 ret void | |
| 628 } | |
| 629 ; CHECK-LABEL: fcmpEq | |
| 630 ; CHECK: ucomiss | |
| 631 ; CHECK: jne | |
| 632 ; CHECK-NEXT: jp | |
| 633 ; CHECK: call {{.*}} R_{{.*}} func | |
| 634 ; CHECK: ucomisd | |
| 635 ; CHECK: jne | |
| 636 ; CHECK-NEXT: jp | |
| 637 ; CHECK: call {{.*}} R_{{.*}} func | |
| 638 | |
| 639 declare void @func() | |
| 640 | |
| 641 define internal void @fcmpNe(float %a, float %b, double %c, double %d) { | |
| 642 entry: | |
| 643 %cmp = fcmp une float %a, %b | |
| 644 br i1 %cmp, label %if.then, label %if.end | |
| 645 | |
| 646 if.then: ; preds = %entry | |
| 647 call void @func() | |
| 648 br label %if.end | |
| 649 | |
| 650 if.end: ; preds = %if.then, %entry | |
| 651 %cmp1 = fcmp une double %c, %d | |
| 652 br i1 %cmp1, label %if.then2, label %if.end3 | |
| 653 | |
| 654 if.then2: ; preds = %if.end | |
| 655 call void @func() | |
| 656 br label %if.end3 | |
| 657 | |
| 658 if.end3: ; preds = %if.then2, %if.end | |
| 659 ret void | |
| 660 } | |
| 661 ; CHECK-LABEL: fcmpNe | |
| 662 ; CHECK: ucomiss | |
| 663 ; CHECK: jne | |
| 664 ; CHECK-NEXT: jp | |
| 665 ; CHECK: call {{.*}} R_{{.*}} func | |
| 666 ; CHECK: ucomisd | |
| 667 ; CHECK: jne | |
| 668 ; CHECK-NEXT: jp | |
| 669 ; CHECK: call {{.*}} R_{{.*}} func | |
| 670 | |
| 671 define internal void @fcmpGt(float %a, float %b, double %c, double %d) { | |
| 672 entry: | |
| 673 %cmp = fcmp ogt float %a, %b | |
| 674 br i1 %cmp, label %if.then, label %if.end | |
| 675 | |
| 676 if.then: ; preds = %entry | |
| 677 call void @func() | |
| 678 br label %if.end | |
| 679 | |
| 680 if.end: ; preds = %if.then, %entry | |
| 681 %cmp1 = fcmp ogt double %c, %d | |
| 682 br i1 %cmp1, label %if.then2, label %if.end3 | |
| 683 | |
| 684 if.then2: ; preds = %if.end | |
| 685 call void @func() | |
| 686 br label %if.end3 | |
| 687 | |
| 688 if.end3: ; preds = %if.then2, %if.end | |
| 689 ret void | |
| 690 } | |
| 691 ; CHECK-LABEL: fcmpGt | |
| 692 ; CHECK: ucomiss | |
| 693 ; CHECK: seta | |
| 694 ; CHECK: call {{.*}} R_{{.*}} func | |
| 695 ; CHECK: ucomisd | |
| 696 ; CHECK: seta | |
| 697 ; CHECK: call {{.*}} R_{{.*}} func | |
| 698 | |
| 699 define internal void @fcmpGe(float %a, float %b, double %c, double %d) { | |
| 700 entry: | |
| 701 %cmp = fcmp ult float %a, %b | |
| 702 br i1 %cmp, label %if.end, label %if.then | |
| 703 | |
| 704 if.then: ; preds = %entry | |
| 705 call void @func() | |
| 706 br label %if.end | |
| 707 | |
| 708 if.end: ; preds = %entry, %if.then | |
| 709 %cmp1 = fcmp ult double %c, %d | |
| 710 br i1 %cmp1, label %if.end3, label %if.then2 | |
| 711 | |
| 712 if.then2: ; preds = %if.end | |
| 713 call void @func() | |
| 714 br label %if.end3 | |
| 715 | |
| 716 if.end3: ; preds = %if.end, %if.then2 | |
| 717 ret void | |
| 718 } | |
| 719 ; CHECK-LABEL: fcmpGe | |
| 720 ; CHECK: ucomiss | |
| 721 ; CHECK: setb | |
| 722 ; CHECK: call {{.*}} R_{{.*}} func | |
| 723 ; CHECK: ucomisd | |
| 724 ; CHECK: setb | |
| 725 ; CHECK: call {{.*}} R_{{.*}} func | |
| 726 | |
| 727 define internal void @fcmpLt(float %a, float %b, double %c, double %d) { | |
| 728 entry: | |
| 729 %cmp = fcmp olt float %a, %b | |
| 730 br i1 %cmp, label %if.then, label %if.end | |
| 731 | |
| 732 if.then: ; preds = %entry | |
| 733 call void @func() | |
| 734 br label %if.end | |
| 735 | |
| 736 if.end: ; preds = %if.then, %entry | |
| 737 %cmp1 = fcmp olt double %c, %d | |
| 738 br i1 %cmp1, label %if.then2, label %if.end3 | |
| 739 | |
| 740 if.then2: ; preds = %if.end | |
| 741 call void @func() | |
| 742 br label %if.end3 | |
| 743 | |
| 744 if.end3: ; preds = %if.then2, %if.end | |
| 745 ret void | |
| 746 } | |
| 747 ; CHECK-LABEL: fcmpLt | |
| 748 ; CHECK: ucomiss | |
| 749 ; CHECK: seta | |
| 750 ; CHECK: call {{.*}} R_{{.*}} func | |
| 751 ; CHECK: ucomisd | |
| 752 ; CHECK: seta | |
| 753 ; CHECK: call {{.*}} R_{{.*}} func | |
| 754 | |
| 755 define internal void @fcmpLe(float %a, float %b, double %c, double %d) { | |
| 756 entry: | |
| 757 %cmp = fcmp ugt float %a, %b | |
| 758 br i1 %cmp, label %if.end, label %if.then | |
| 759 | |
| 760 if.then: ; preds = %entry | |
| 761 call void @func() | |
| 762 br label %if.end | |
| 763 | |
| 764 if.end: ; preds = %entry, %if.then | |
| 765 %cmp1 = fcmp ugt double %c, %d | |
| 766 br i1 %cmp1, label %if.end3, label %if.then2 | |
| 767 | |
| 768 if.then2: ; preds = %if.end | |
| 769 call void @func() | |
| 770 br label %if.end3 | |
| 771 | |
| 772 if.end3: ; preds = %if.end, %if.then2 | |
| 773 ret void | |
| 774 } | |
| 775 ; CHECK-LABEL: fcmpLe | |
| 776 ; CHECK: ucomiss | |
| 777 ; CHECK: setb | |
| 778 ; CHECK: call {{.*}} R_{{.*}} func | |
| 779 ; CHECK: ucomisd | |
| 780 ; CHECK: setb | |
| 781 ; CHECK: call {{.*}} R_{{.*}} func | |
| 782 | |
| 783 define internal i32 @fcmpFalseFloat(float %a, float %b) { | |
| 784 entry: | |
| 785 %cmp = fcmp false float %a, %b | |
| 786 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 787 ret i32 %cmp.ret_ext | |
| 788 } | |
| 789 ; CHECK-LABEL: fcmpFalseFloat | |
| 790 ; CHECK: mov {{.*}},0x0 | |
| 791 | |
| 792 define internal i32 @fcmpFalseDouble(double %a, double %b) { | |
| 793 entry: | |
| 794 %cmp = fcmp false double %a, %b | |
| 795 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 796 ret i32 %cmp.ret_ext | |
| 797 } | |
| 798 ; CHECK-LABEL: fcmpFalseDouble | |
| 799 ; CHECK: mov {{.*}},0x0 | |
| 800 | |
| 801 define internal i32 @fcmpOeqFloat(float %a, float %b) { | |
| 802 entry: | |
| 803 %cmp = fcmp oeq float %a, %b | |
| 804 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 805 ret i32 %cmp.ret_ext | |
| 806 } | |
| 807 ; CHECK-LABEL: fcmpOeqFloat | |
| 808 ; CHECK: ucomiss | |
| 809 ; CHECK: jne | |
| 810 ; CHECK: jp | |
| 811 | |
| 812 define internal i32 @fcmpOeqDouble(double %a, double %b) { | |
| 813 entry: | |
| 814 %cmp = fcmp oeq double %a, %b | |
| 815 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 816 ret i32 %cmp.ret_ext | |
| 817 } | |
| 818 ; CHECK-LABEL: fcmpOeqDouble | |
| 819 ; CHECK: ucomisd | |
| 820 ; CHECK: jne | |
| 821 ; CHECK: jp | |
| 822 | |
| 823 define internal i32 @fcmpOgtFloat(float %a, float %b) { | |
| 824 entry: | |
| 825 %cmp = fcmp ogt float %a, %b | |
| 826 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 827 ret i32 %cmp.ret_ext | |
| 828 } | |
| 829 ; CHECK-LABEL: fcmpOgtFloat | |
| 830 ; CHECK: ucomiss | |
| 831 ; CHECK: seta | |
| 832 | |
| 833 define internal i32 @fcmpOgtDouble(double %a, double %b) { | |
| 834 entry: | |
| 835 %cmp = fcmp ogt double %a, %b | |
| 836 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 837 ret i32 %cmp.ret_ext | |
| 838 } | |
| 839 ; CHECK-LABEL: fcmpOgtDouble | |
| 840 ; CHECK: ucomisd | |
| 841 ; CHECK: seta | |
| 842 | |
| 843 define internal i32 @fcmpOgeFloat(float %a, float %b) { | |
| 844 entry: | |
| 845 %cmp = fcmp oge float %a, %b | |
| 846 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 847 ret i32 %cmp.ret_ext | |
| 848 } | |
| 849 ; CHECK-LABEL: fcmpOgeFloat | |
| 850 ; CHECK: ucomiss | |
| 851 ; CHECK: setae | |
| 852 | |
| 853 define internal i32 @fcmpOgeDouble(double %a, double %b) { | |
| 854 entry: | |
| 855 %cmp = fcmp oge double %a, %b | |
| 856 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 857 ret i32 %cmp.ret_ext | |
| 858 } | |
| 859 ; CHECK-LABEL: fcmpOgeDouble | |
| 860 ; CHECK: ucomisd | |
| 861 ; CHECK: setae | |
| 862 | |
| 863 define internal i32 @fcmpOltFloat(float %a, float %b) { | |
| 864 entry: | |
| 865 %cmp = fcmp olt float %a, %b | |
| 866 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 867 ret i32 %cmp.ret_ext | |
| 868 } | |
| 869 ; CHECK-LABEL: fcmpOltFloat | |
| 870 ; CHECK: ucomiss | |
| 871 ; CHECK: seta | |
| 872 | |
| 873 define internal i32 @fcmpOltDouble(double %a, double %b) { | |
| 874 entry: | |
| 875 %cmp = fcmp olt double %a, %b | |
| 876 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 877 ret i32 %cmp.ret_ext | |
| 878 } | |
| 879 ; CHECK-LABEL: fcmpOltDouble | |
| 880 ; CHECK: ucomisd | |
| 881 ; CHECK: seta | |
| 882 | |
| 883 define internal i32 @fcmpOleFloat(float %a, float %b) { | |
| 884 entry: | |
| 885 %cmp = fcmp ole float %a, %b | |
| 886 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 887 ret i32 %cmp.ret_ext | |
| 888 } | |
| 889 ; CHECK-LABEL: fcmpOleFloat | |
| 890 ; CHECK: ucomiss | |
| 891 ; CHECK: setae | |
| 892 | |
| 893 define internal i32 @fcmpOleDouble(double %a, double %b) { | |
| 894 entry: | |
| 895 %cmp = fcmp ole double %a, %b | |
| 896 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 897 ret i32 %cmp.ret_ext | |
| 898 } | |
| 899 ; CHECK-LABEL: fcmpOleDouble | |
| 900 ; CHECK: ucomisd | |
| 901 ; CHECK: setae | |
| 902 | |
| 903 define internal i32 @fcmpOneFloat(float %a, float %b) { | |
| 904 entry: | |
| 905 %cmp = fcmp one float %a, %b | |
| 906 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 907 ret i32 %cmp.ret_ext | |
| 908 } | |
| 909 ; CHECK-LABEL: fcmpOneFloat | |
| 910 ; CHECK: ucomiss | |
| 911 ; CHECK: setne | |
| 912 | |
| 913 define internal i32 @fcmpOneDouble(double %a, double %b) { | |
| 914 entry: | |
| 915 %cmp = fcmp one double %a, %b | |
| 916 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 917 ret i32 %cmp.ret_ext | |
| 918 } | |
| 919 ; CHECK-LABEL: fcmpOneDouble | |
| 920 ; CHECK: ucomisd | |
| 921 ; CHECK: setne | |
| 922 | |
| 923 define internal i32 @fcmpOrdFloat(float %a, float %b) { | |
| 924 entry: | |
| 925 %cmp = fcmp ord float %a, %b | |
| 926 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 927 ret i32 %cmp.ret_ext | |
| 928 } | |
| 929 ; CHECK-LABEL: fcmpOrdFloat | |
| 930 ; CHECK: ucomiss | |
| 931 ; CHECK: setnp | |
| 932 | |
| 933 define internal i32 @fcmpOrdDouble(double %a, double %b) { | |
| 934 entry: | |
| 935 %cmp = fcmp ord double %a, %b | |
| 936 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 937 ret i32 %cmp.ret_ext | |
| 938 } | |
| 939 ; CHECK-LABEL: fcmpOrdDouble | |
| 940 ; CHECK: ucomisd | |
| 941 ; CHECK: setnp | |
| 942 | |
| 943 define internal i32 @fcmpUeqFloat(float %a, float %b) { | |
| 944 entry: | |
| 945 %cmp = fcmp ueq float %a, %b | |
| 946 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 947 ret i32 %cmp.ret_ext | |
| 948 } | |
| 949 ; CHECK-LABEL: fcmpUeqFloat | |
| 950 ; CHECK: ucomiss | |
| 951 ; CHECK: sete | |
| 952 | |
| 953 define internal i32 @fcmpUeqDouble(double %a, double %b) { | |
| 954 entry: | |
| 955 %cmp = fcmp ueq double %a, %b | |
| 956 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 957 ret i32 %cmp.ret_ext | |
| 958 } | |
| 959 ; CHECK-LABEL: fcmpUeqDouble | |
| 960 ; CHECK: ucomisd | |
| 961 ; CHECK: sete | |
| 962 | |
| 963 define internal i32 @fcmpUgtFloat(float %a, float %b) { | |
| 964 entry: | |
| 965 %cmp = fcmp ugt float %a, %b | |
| 966 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 967 ret i32 %cmp.ret_ext | |
| 968 } | |
| 969 ; CHECK-LABEL: fcmpUgtFloat | |
| 970 ; CHECK: ucomiss | |
| 971 ; CHECK: setb | |
| 972 | |
| 973 define internal i32 @fcmpUgtDouble(double %a, double %b) { | |
| 974 entry: | |
| 975 %cmp = fcmp ugt double %a, %b | |
| 976 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 977 ret i32 %cmp.ret_ext | |
| 978 } | |
| 979 ; CHECK-LABEL: fcmpUgtDouble | |
| 980 ; CHECK: ucomisd | |
| 981 ; CHECK: setb | |
| 982 | |
| 983 define internal i32 @fcmpUgeFloat(float %a, float %b) { | |
| 984 entry: | |
| 985 %cmp = fcmp uge float %a, %b | |
| 986 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 987 ret i32 %cmp.ret_ext | |
| 988 } | |
| 989 ; CHECK-LABEL: fcmpUgeFloat | |
| 990 ; CHECK: ucomiss | |
| 991 ; CHECK: setbe | |
| 992 | |
| 993 define internal i32 @fcmpUgeDouble(double %a, double %b) { | |
| 994 entry: | |
| 995 %cmp = fcmp uge double %a, %b | |
| 996 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 997 ret i32 %cmp.ret_ext | |
| 998 } | |
| 999 ; CHECK-LABEL: fcmpUgeDouble | |
| 1000 ; CHECK: ucomisd | |
| 1001 ; CHECK: setbe | |
| 1002 | |
| 1003 define internal i32 @fcmpUltFloat(float %a, float %b) { | |
| 1004 entry: | |
| 1005 %cmp = fcmp ult float %a, %b | |
| 1006 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 1007 ret i32 %cmp.ret_ext | |
| 1008 } | |
| 1009 ; CHECK-LABEL: fcmpUltFloat | |
| 1010 ; CHECK: ucomiss | |
| 1011 ; CHECK: setb | |
| 1012 | |
| 1013 define internal i32 @fcmpUltDouble(double %a, double %b) { | |
| 1014 entry: | |
| 1015 %cmp = fcmp ult double %a, %b | |
| 1016 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 1017 ret i32 %cmp.ret_ext | |
| 1018 } | |
| 1019 ; CHECK-LABEL: fcmpUltDouble | |
| 1020 ; CHECK: ucomisd | |
| 1021 ; CHECK: setb | |
| 1022 | |
| 1023 define internal i32 @fcmpUleFloat(float %a, float %b) { | |
| 1024 entry: | |
| 1025 %cmp = fcmp ule float %a, %b | |
| 1026 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 1027 ret i32 %cmp.ret_ext | |
| 1028 } | |
| 1029 ; CHECK-LABEL: fcmpUleFloat | |
| 1030 ; CHECK: ucomiss | |
| 1031 ; CHECK: setbe | |
| 1032 | |
| 1033 define internal i32 @fcmpUleDouble(double %a, double %b) { | |
| 1034 entry: | |
| 1035 %cmp = fcmp ule double %a, %b | |
| 1036 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 1037 ret i32 %cmp.ret_ext | |
| 1038 } | |
| 1039 ; CHECK-LABEL: fcmpUleDouble | |
| 1040 ; CHECK: ucomisd | |
| 1041 ; CHECK: setbe | |
| 1042 | |
| 1043 define internal i32 @fcmpUneFloat(float %a, float %b) { | |
| 1044 entry: | |
| 1045 %cmp = fcmp une float %a, %b | |
| 1046 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 1047 ret i32 %cmp.ret_ext | |
| 1048 } | |
| 1049 ; CHECK-LABEL: fcmpUneFloat | |
| 1050 ; CHECK: ucomiss | |
| 1051 ; CHECK: jne | |
| 1052 ; CHECK: jp | |
| 1053 | |
| 1054 define internal i32 @fcmpUneDouble(double %a, double %b) { | |
| 1055 entry: | |
| 1056 %cmp = fcmp une double %a, %b | |
| 1057 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 1058 ret i32 %cmp.ret_ext | |
| 1059 } | |
| 1060 ; CHECK-LABEL: fcmpUneDouble | |
| 1061 ; CHECK: ucomisd | |
| 1062 ; CHECK: jne | |
| 1063 ; CHECK: jp | |
| 1064 | |
| 1065 define internal i32 @fcmpUnoFloat(float %a, float %b) { | |
| 1066 entry: | |
| 1067 %cmp = fcmp uno float %a, %b | |
| 1068 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 1069 ret i32 %cmp.ret_ext | |
| 1070 } | |
| 1071 ; CHECK-LABEL: fcmpUnoFloat | |
| 1072 ; CHECK: ucomiss | |
| 1073 ; CHECK: setp | |
| 1074 | |
| 1075 define internal i32 @fcmpUnoDouble(double %a, double %b) { | |
| 1076 entry: | |
| 1077 %cmp = fcmp uno double %a, %b | |
| 1078 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 1079 ret i32 %cmp.ret_ext | |
| 1080 } | |
| 1081 ; CHECK-LABEL: fcmpUnoDouble | |
| 1082 ; CHECK: ucomisd | |
| 1083 ; CHECK: setp | |
| 1084 | |
| 1085 define internal i32 @fcmpTrueFloat(float %a, float %b) { | |
| 1086 entry: | |
| 1087 %cmp = fcmp true float %a, %b | |
| 1088 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 1089 ret i32 %cmp.ret_ext | |
| 1090 } | |
| 1091 ; CHECK-LABEL: fcmpTrueFloat | |
| 1092 ; CHECK: mov {{.*}},0x1 | |
| 1093 | |
| 1094 define internal i32 @fcmpTrueDouble(double %a, double %b) { | |
| 1095 entry: | |
| 1096 %cmp = fcmp true double %a, %b | |
| 1097 %cmp.ret_ext = zext i1 %cmp to i32 | |
| 1098 ret i32 %cmp.ret_ext | |
| 1099 } | |
| 1100 ; CHECK-LABEL: fcmpTrueDouble | |
| 1101 ; CHECK: mov {{.*}},0x1 | |
| 1102 | |
| 1103 define internal float @loadFloat(i32 %a) { | |
| 1104 entry: | |
| 1105 %__1 = inttoptr i32 %a to float* | |
| 1106 %v0 = load float, float* %__1, align 4 | |
| 1107 ret float %v0 | |
| 1108 } | |
| 1109 ; CHECK-LABEL: loadFloat | |
| 1110 ; CHECK: movss | |
| 1111 ; CHECK: fld | |
| 1112 | |
| 1113 define internal double @loadDouble(i32 %a) { | |
| 1114 entry: | |
| 1115 %__1 = inttoptr i32 %a to double* | |
| 1116 %v0 = load double, double* %__1, align 8 | |
| 1117 ret double %v0 | |
| 1118 } | |
| 1119 ; CHECK-LABEL: loadDouble | |
| 1120 ; CHECK: movsd | |
| 1121 ; CHECK: fld | |
| 1122 | |
| 1123 define internal void @storeFloat(i32 %a, float %value) { | |
| 1124 entry: | |
| 1125 %__2 = inttoptr i32 %a to float* | |
| 1126 store float %value, float* %__2, align 4 | |
| 1127 ret void | |
| 1128 } | |
| 1129 ; CHECK-LABEL: storeFloat | |
| 1130 ; CHECK: movss | |
| 1131 ; CHECK: movss | |
| 1132 | |
| 1133 define internal void @storeDouble(i32 %a, double %value) { | |
| 1134 entry: | |
| 1135 %__2 = inttoptr i32 %a to double* | |
| 1136 store double %value, double* %__2, align 8 | |
| 1137 ret void | |
| 1138 } | |
| 1139 ; CHECK-LABEL: storeDouble | |
| 1140 ; CHECK: movsd | |
| 1141 ; CHECK: movsd | |
| 1142 | |
| 1143 define internal void @storeFloatConst(i32 %a) { | |
| 1144 entry: | |
| 1145 %a.asptr = inttoptr i32 %a to float* | |
| 1146 store float 0x3FF3AE1480000000, float* %a.asptr, align 4 | |
| 1147 ret void | |
| 1148 } | |
| 1149 ; CHECK-LABEL: storeFloatConst | |
| 1150 ; CHECK: movss | |
| 1151 ; CHECK: movss | |
| 1152 | |
| 1153 define internal void @storeDoubleConst(i32 %a) { | |
| 1154 entry: | |
| 1155 %a.asptr = inttoptr i32 %a to double* | |
| 1156 store double 1.230000e+00, double* %a.asptr, align 8 | |
| 1157 ret void | |
| 1158 } | |
| 1159 ; CHECK-LABEL: storeDoubleConst | |
| 1160 ; CHECK: movsd | |
| 1161 ; CHECK: movsd | |
| 1162 | |
| 1163 define internal float @selectFloatVarVar(float %a, float %b) { | |
| 1164 entry: | |
| 1165 %cmp = fcmp olt float %a, %b | |
| 1166 %cond = select i1 %cmp, float %a, float %b | |
| 1167 ret float %cond | |
| 1168 } | |
| 1169 ; CHECK-LABEL: selectFloatVarVar | |
| 1170 ; CHECK: ucomiss | |
| 1171 ; CHECK: seta | |
| 1172 ; CHECK: fld | |
| 1173 | |
| 1174 define internal double @selectDoubleVarVar(double %a, double %b) { | |
| 1175 entry: | |
| 1176 %cmp = fcmp olt double %a, %b | |
| 1177 %cond = select i1 %cmp, double %a, double %b | |
| 1178 ret double %cond | |
| 1179 } | |
| 1180 ; CHECK-LABEL: selectDoubleVarVar | |
| 1181 ; CHECK: ucomisd | |
| 1182 ; CHECK: seta | |
| 1183 ; CHECK: fld | |
| OLD | NEW |