Home | History | Annotate | Download | only in llvm2ice_tests
      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 ; RUN: %if --need=target_ARM32 --command %p2i --filetype=obj --disassemble \
     10 ; RUN:   --target arm32 -i %s --args -O2 \
     11 ; RUN:   | %if --need=target_ARM32 --command FileCheck %s \
     12 ; RUN:   --check-prefix=ARM32
     13 
     14 ; RUN: %if --need=target_ARM32 --command %p2i --filetype=obj --disassemble \
     15 ; RUN:   --target arm32 -i %s --args -Om1 \
     16 ; RUN:   | %if --need=target_ARM32 --command FileCheck %s \
     17 ; RUN:   --check-prefix=ARM32
     18 
     19 ; RUN: %if --need=allow_dump --need=target_MIPS32 --command %p2i \
     20 ; RUN:   --filetype=asm --target mips32 -i %s --args -Om1 \
     21 ; RUN:   | %if --need=allow_dump --need=target_MIPS32 --command FileCheck %s \
     22 ; RUN:   --check-prefix=MIPS32
     23 
     24 ; RUN: %if --need=allow_dump --need=target_MIPS32 --command %p2i \
     25 ; RUN:   --filetype=asm --target mips32 -i %s --args -O2 \
     26 ; RUN:   | %if --need=allow_dump --need=target_MIPS32 --command FileCheck %s \
     27 ; RUN:   --check-prefix=MIPS32O2
     28 
     29 define internal float @fptrunc(double %a) {
     30 entry:
     31   %conv = fptrunc double %a to float
     32   ret float %conv
     33 }
     34 ; CHECK-LABEL: fptrunc
     35 ; CHECK: cvtsd2ss
     36 ; CHECK: fld
     37 ; ARM32-LABEL: fptrunc
     38 ; ARM32: vcvt.f32.f64 {{s[0-9]+}}, {{d[0-9]+}}
     39 ; MIPS32-LABEL: fptrunc
     40 ; MIPS32: cvt.s.d
     41 ; MIPS32O2-LABEL: fptrunc
     42 ; MIPS32O2: cvt.s.d
     43 
     44 define internal double @fpext(float %a) {
     45 entry:
     46   %conv = fpext float %a to double
     47   ret double %conv
     48 }
     49 ; CHECK-LABEL: fpext
     50 ; CHECK: cvtss2sd
     51 ; CHECK: fld
     52 ; ARM32-LABEL: fpext
     53 ; ARM32: vcvt.f64.f32 {{d[0-9]+}}, {{s[0-9]+}}
     54 ; MIPS32-LABEL: fpext
     55 ; MIPS32: cvt.d.s
     56 ; MIPS32O2-LABEL: fpext
     57 ; MIPS32O2: cvt.d.s
     58 
     59 define internal i64 @doubleToSigned64(double %a) {
     60 entry:
     61   %conv = fptosi double %a to i64
     62   ret i64 %conv
     63 }
     64 ; CHECK-LABEL: doubleToSigned64
     65 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptosi_f64_i64
     66 ; ARM32-LABEL: doubleToSigned64
     67 ; TODO(jpp): implement this test.
     68 ; MIPS32-LABEL: doubleToSigned64
     69 ; MIPS32: jal __Sz_fptosi_f64_i64
     70 ; MIPS32O2-LABEL: doubleToSigned64
     71 ; MIPS32O2: jal __Sz_fptosi_f64_i64
     72 
     73 define internal i64 @floatToSigned64(float %a) {
     74 entry:
     75   %conv = fptosi float %a to i64
     76   ret i64 %conv
     77 }
     78 ; CHECK-LABEL: floatToSigned64
     79 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptosi_f32_i64
     80 ; ARM32-LABEL: floatToSigned64
     81 ; TODO(jpp): implement this test.
     82 ; MIPS32-LABEL: floatToSigned64
     83 ; MIPS32: jal __Sz_fptosi_f32_i64
     84 ; MIPS32O2-LABEL: floatToSigned64
     85 ; MIPS32O2: jal __Sz_fptosi_f32_i64
     86 
     87 define internal i64 @doubleToUnsigned64(double %a) {
     88 entry:
     89   %conv = fptoui double %a to i64
     90   ret i64 %conv
     91 }
     92 ; CHECK-LABEL: doubleToUnsigned64
     93 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f64_i64
     94 ; ARM32-LABEL: doubleToUnsigned64
     95 ; TODO(jpp): implement this test.
     96 ; MIPS32-LABEL: doubleToUnsigned64
     97 ; MIPS32: jal __Sz_fptoui_f64_i64
     98 ; MIPS32O2-LABEL: doubleToUnsigned64
     99 ; MIPS32O2: jal __Sz_fptoui_f64_i64
    100 
    101 define internal i64 @floatToUnsigned64(float %a) {
    102 entry:
    103   %conv = fptoui float %a to i64
    104   ret i64 %conv
    105 }
    106 ; CHECK-LABEL: floatToUnsigned64
    107 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f32_i64
    108 ; ARM32-LABEL: floatToUnsigned64
    109 ; TODO(jpp): implement this test.
    110 ; MIPS32-LABEL: floatToUnsigned64
    111 ; MIPS32: jal __Sz_fptoui_f32_i64
    112 ; MIPS32O2-LABEL: floatToUnsigned64
    113 ; MIPS32O2: jal __Sz_fptoui_f32_i64
    114 
    115 define internal i32 @doubleToSigned32(double %a) {
    116 entry:
    117   %conv = fptosi double %a to i32
    118   ret i32 %conv
    119 }
    120 ; CHECK-LABEL: doubleToSigned32
    121 ; CHECK: cvttsd2si
    122 ; ARM32-LABEL: doubleToSigned32
    123 ; ARM32-DAG: vcvt.s32.f64 [[REG:s[0-9]*]], {{d[0-9]*}}
    124 ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]]
    125 ; MIPS32-LABEL: doubleToSigned32
    126 ; MIPS32: trunc.w.d
    127 ; MIPS32O2-LABEL: doubleToSigned32
    128 ; MIPS32O2: trunc.w.d
    129 
    130 define internal i32 @doubleToSigned32Const() {
    131 entry:
    132   %conv = fptosi double 867.5309 to i32
    133   ret i32 %conv
    134 }
    135 ; CHECK-LABEL: doubleToSigned32Const
    136 ; CHECK: cvttsd2si
    137 ; ARM32-LABEL: doubleToSigned32Const
    138 ; ARM32-DAG: movw [[ADDR:r[0-9]+]], #{{.*_MOVW_}}
    139 ; ARM32-DAG: movt [[ADDR]], #{{.*_MOVT_}}
    140 ; ARM32-DAG: vldr [[DREG:d[0-9]+]], {{\[}}[[ADDR]]{{\]}}
    141 ; ARM32-DAG: vcvt.s32.f64 [[REG:s[0-9]+]], [[DREG]]
    142 ; ARM32-DAF: vmov {{r[0-9]+}}, [[REG]]
    143 ; MIPS32-LABEL: doubleToSigned32Const
    144 ; MIPS32: lui
    145 ; MIPS32: ldc1
    146 ; MIPS32: trunc.w.d
    147 ; MIPS32O2-LABEL: doubleToSigned32Const
    148 ; MIPS32O2: lui
    149 ; MIPS32O2: ldc1
    150 ; MIPS32O2: trunc.w.d
    151 
    152 define internal i32 @floatToSigned32(float %a) {
    153 entry:
    154   %conv = fptosi float %a to i32
    155   ret i32 %conv
    156 }
    157 ; CHECK-LABEL: floatToSigned32
    158 ; CHECK: cvttss2si
    159 ; ARM32-LABEL: floatToSigned32
    160 ; ARM32-DAG: vcvt.s32.f32 [[REG:s[0-9]+]], {{s[0-9]+}}
    161 ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]]
    162 ; MIPS32-LABEL: floatToSigned32
    163 ; MIPS32: trunc.w.s $f{{.*}}, $f{{.*}}
    164 ; MIPS32O2-LABEL: floatToSigned32
    165 ; MIPS32O2: trunc.w.s $[[REG:f[0-9]+]], $f{{.*}}
    166 ; MIPS32O2: mfc1 $v0, $[[REG]]
    167 
    168 define internal i32 @doubleToUnsigned32(double %a) {
    169 entry:
    170   %conv = fptoui double %a to i32
    171   ret i32 %conv
    172 }
    173 ; CHECK-LABEL: doubleToUnsigned32
    174 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f64_i32
    175 ; ARM32-LABEL: doubleToUnsigned32
    176 ; ARM32-DAG: vcvt.u32.f64 [[REG:s[0-9]+]], {{d[0-9]+}}
    177 ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]]
    178 ; MIPS32-LABEL: doubleToUnsigned32
    179 ; MIPS32: jal __Sz_fptoui_f64_i32
    180 ; MIPS32O2-LABEL: doubleToUnsigned32
    181 ; MIPS32O2: jal __Sz_fptoui_f64_i32
    182 
    183 define internal i32 @floatToUnsigned32(float %a) {
    184 entry:
    185   %conv = fptoui float %a to i32
    186   ret i32 %conv
    187 }
    188 ; CHECK-LABEL: floatToUnsigned32
    189 ; CHECK: call {{.*}} R_{{.*}} __Sz_fptoui_f32_i32
    190 ; ARM32-LABEL: floatToUnsigned32
    191 ; ARM32-DAG: vcvt.u32.f32 [[REG:s[0-9]+]], {{s[0-9]+}}
    192 ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]]
    193 ; MIPS32-LABEL: floatToUnsigned32
    194 ; MIPS32: jal __Sz_fptoui_f32_i32
    195 ; MIPS32O2-LABEL: floatToUnsigned32
    196 ; MIPS32O2: jal __Sz_fptoui_f32_i32
    197 
    198 define internal i32 @doubleToSigned16(double %a) {
    199 entry:
    200   %conv = fptosi double %a to i16
    201   %conv.ret_ext = sext i16 %conv to i32
    202   ret i32 %conv.ret_ext
    203 }
    204 ; CHECK-LABEL: doubleToSigned16
    205 ; CHECK: cvttsd2si
    206 ; CHECK: movsx
    207 ; ARM32-LABEL: doubleToSigned16
    208 ; ARM32-DAG: vcvt.s32.f64 [[REG:s[0-9]*]], {{d[0-9]*}}
    209 ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]]
    210 ; ARM32: sxth
    211 ; MIPS32-LABEL: doubleToSigned16
    212 ; MIPS32: trunc.w.d
    213 ; MIPS32O2-LABEL: doubleToSigned16
    214 ; MIPS32O2: trunc.w.d
    215 
    216 define internal i32 @floatToSigned16(float %a) {
    217 entry:
    218   %conv = fptosi float %a to i16
    219   %conv.ret_ext = sext i16 %conv to i32
    220   ret i32 %conv.ret_ext
    221 }
    222 ; CHECK-LABEL: floatToSigned16
    223 ; CHECK: cvttss2si
    224 ; CHECK: movsx
    225 ; ARM32-LABEL: floatToSigned16
    226 ; ARM32-DAG: vcvt.s32.f32 [[REG:s[0-9]*]], {{s[0-9]*}}
    227 ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]]
    228 ; ARM32: sxth
    229 ; MIPS32-LABEL: floatToSigned16
    230 ; MIPS32: trunc.w.s
    231 ; MIPS32O2-LABEL: floatToSigned16
    232 ; MIPS32O2: trunc.w.s
    233 
    234 define internal i32 @doubleToUnsigned16(double %a) {
    235 entry:
    236   %conv = fptoui double %a to i16
    237   %conv.ret_ext = zext i16 %conv to i32
    238   ret i32 %conv.ret_ext
    239 }
    240 ; CHECK-LABEL: doubleToUnsigned16
    241 ; CHECK: cvttsd2si
    242 ; CHECK: movzx
    243 ; ARM32-LABEL: doubleToUnsigned16
    244 ; ARM32-DAG: vcvt.u32.f64 [[REG:s[0-9]*]], {{d[0-9]*}}
    245 ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]]
    246 ; ARM32: uxth
    247 ; MIPS32-LABEL: doubleToUnsigned16
    248 ; MIPS32: trunc.w.d
    249 ; MIPS32O2-LABEL: doubleToUnsigned16
    250 ; MIPS32O2: trunc.w.d
    251 
    252 define internal i32 @floatToUnsigned16(float %a) {
    253 entry:
    254   %conv = fptoui float %a to i16
    255   %conv.ret_ext = zext i16 %conv to i32
    256   ret i32 %conv.ret_ext
    257 }
    258 ; CHECK-LABEL: floatToUnsigned16
    259 ; CHECK: cvttss2si
    260 ; CHECK: movzx
    261 ; ARM32-LABEL: floatToUnsigned16
    262 ; ARM32-DAG: vcvt.u32.f32 [[REG:s[0-9]*]], {{s[0-9]*}}
    263 ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]]
    264 ; ARM32: uxth
    265 ; MIPS32-LABEL: floatToUnsigned16
    266 ; MIPS32: trunc.w.s
    267 ; MIPS32O2-LABEL: floatToUnsigned16
    268 ; MIPS32O2: trunc.w.s
    269 
    270 define internal i32 @doubleToSigned8(double %a) {
    271 entry:
    272   %conv = fptosi double %a to i8
    273   %conv.ret_ext = sext i8 %conv to i32
    274   ret i32 %conv.ret_ext
    275 }
    276 ; CHECK-LABEL: doubleToSigned8
    277 ; CHECK: cvttsd2si
    278 ; CHECK: movsx
    279 ; ARM32-LABEL: doubleToSigned8
    280 ; ARM32-DAG: vcvt.s32.f64 [[REG:s[0-9]*]], {{d[0-9]*}}
    281 ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]]
    282 ; ARM32: sxtb
    283 ; MIPS32-LABEL: doubleToSigned8
    284 ; MIPS32: trunc.w.d
    285 ; MIPS32O2-LABEL: doubleToSigned8
    286 ; MIPS32O2: trunc.w.d
    287 
    288 define internal i32 @floatToSigned8(float %a) {
    289 entry:
    290   %conv = fptosi float %a to i8
    291   %conv.ret_ext = sext i8 %conv to i32
    292   ret i32 %conv.ret_ext
    293 }
    294 ; CHECK-LABEL: floatToSigned8
    295 ; CHECK: cvttss2si
    296 ; CHECK: movsx
    297 ; ARM32-LABEL: floatToSigned8
    298 ; ARM32-DAG: vcvt.s32.f32 [[REG:s[0-9]*]], {{s[0-9]*}}
    299 ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]]
    300 ; ARM32: sxtb
    301 ; MIPS32-LABEL: floatToSigned8
    302 ; MIPS32: trunc.w.s
    303 ; MIPS32O2-LABEL: floatToSigned8
    304 ; MIPS32O2: trunc.w.s
    305 
    306 define internal i32 @doubleToUnsigned8(double %a) {
    307 entry:
    308   %conv = fptoui double %a to i8
    309   %conv.ret_ext = zext i8 %conv to i32
    310   ret i32 %conv.ret_ext
    311 }
    312 ; CHECK-LABEL: doubleToUnsigned8
    313 ; CHECK: cvttsd2si
    314 ; CHECK: movzx
    315 ; ARM32-LABEL: doubleToUnsigned8
    316 ; ARM32-DAG: vcvt.u32.f64 [[REG:s[0-9]*]], {{d[0-9]*}}
    317 ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]]
    318 ; ARM32: uxtb
    319 ; MIPS32-LABEL: doubleToUnsigned8
    320 ; MIPS32: trunc.w.d
    321 ; MIPS32O2-LABEL: doubleToUnsigned8
    322 ; MIPS32O2: trunc.w.d
    323 
    324 define internal i32 @floatToUnsigned8(float %a) {
    325 entry:
    326   %conv = fptoui float %a to i8
    327   %conv.ret_ext = zext i8 %conv to i32
    328   ret i32 %conv.ret_ext
    329 }
    330 ; CHECK-LABEL: floatToUnsigned8
    331 ; CHECK: cvttss2si
    332 ; CHECK: movzx
    333 ; ARM32-LABEL: floatToUnsigned8
    334 ; ARM32-DAG: vcvt.u32.f32 [[REG:s[0-9]*]], {{s[0-9]*}}
    335 ; ARM32-DAG: vmov {{r[0-9]+}}, [[REG]]
    336 ; ARM32: uxtb
    337 ; MIPS32-LABEL: floatToUnsigned8
    338 ; MIPS32: trunc.w.s
    339 ; MIPS32O2-LABEL: floatToUnsigned8
    340 ; MIPS32O2: trunc.w.s
    341 
    342 define internal i32 @doubleToUnsigned1(double %a) {
    343 entry:
    344   %tobool = fptoui double %a to i1
    345   %tobool.ret_ext = zext i1 %tobool to i32
    346   ret i32 %tobool.ret_ext
    347 }
    348 ; CHECK-LABEL: doubleToUnsigned1
    349 ; CHECK: cvttsd2si
    350 ; CHECK-NOT: and eax,0x1
    351 ; ARM32-LABEL: doubleToUnsigned1
    352 ; ARM32-DAG: vcvt.u32.f64 [[REG:s[0-9]*]], {{d[0-9]*}}
    353 ; ARM32-DAG: vmov [[RES:r[0-9]+]], [[REG]]
    354 ; ARM32-DAG: and {{r[0-9]+}}, [[RES]], #1
    355 ; ARM32-NOT: uxth
    356 ; ARM32-NOT: uxtb
    357 ; MIPS32-LABEL: doubleToUnsigned1
    358 ; MIPS32: trunc.w.d
    359 ; MIPS32O2-LABEL: doubleToUnsigned1
    360 ; MIPS32O2: trunc.w.d
    361 
    362 define internal i32 @floatToUnsigned1(float %a) {
    363 entry:
    364   %tobool = fptoui float %a to i1
    365   %tobool.ret_ext = zext i1 %tobool to i32
    366   ret i32 %tobool.ret_ext
    367 }
    368 ; CHECK-LABEL: floatToUnsigned1
    369 ; CHECK: cvttss2si
    370 ; CHECK-NOT: and eax,0x1
    371 ; ARM32-LABEL: floatToUnsigned1
    372 ; ARM32-DAG: vcvt.u32.f32 [[REG:s[0-9]*]], {{s[0-9]*}}
    373 ; ARM32-DAG: vmov [[RES:r[0-9]+]], [[REG]]
    374 ; ARM32-DAG: and {{r[0-9]+}}, [[RES]], #1
    375 ; ARM32-NOT: uxth
    376 ; ARM32-NOT: uxtb
    377 ; MIPS32-LABEL: floatToUnsigned1
    378 ; MIPS32: trunc.w.s
    379 ; MIPS32O2-LABEL: floatToUnsigned1
    380 ; MIPS32O2: trunc.w.s
    381 
    382 define internal double @signed64ToDouble(i64 %a) {
    383 entry:
    384   %conv = sitofp i64 %a to double
    385   ret double %conv
    386 }
    387 ; CHECK-LABEL: signed64ToDouble
    388 ; CHECK: call {{.*}} R_{{.*}} __Sz_sitofp_i64_f64
    389 ; CHECK: fstp QWORD
    390 ; ARM32-LABEL: signed64ToDouble
    391 ; TODO(jpp): implement this test.
    392 ; MIPS32-LABEL: signed64ToDouble
    393 ; MIPS32: jal __Sz_sitofp_i64_f64
    394 ; MIPS32O2-LABEL: signed64ToDouble
    395 ; MIPS32O2: jal __Sz_sitofp_i64_f64
    396 
    397 define internal float @signed64ToFloat(i64 %a) {
    398 entry:
    399   %conv = sitofp i64 %a to float
    400   ret float %conv
    401 }
    402 ; CHECK-LABEL: signed64ToFloat
    403 ; CHECK: call {{.*}} R_{{.*}} __Sz_sitofp_i64_f32
    404 ; CHECK: fstp DWORD
    405 ; ARM32-LABEL: signed64ToFloat
    406 ; TODO(jpp): implement this test.
    407 ; MIPS32-LABEL: signed64ToFloat
    408 ; MIPS32: jal __Sz_sitofp_i64_f32
    409 ; MIPS32O2-LABEL: signed64ToFloat
    410 ; MIPS32O2: jal __Sz_sitofp_i64_f32
    411 
    412 define internal double @unsigned64ToDouble(i64 %a) {
    413 entry:
    414   %conv = uitofp i64 %a to double
    415   ret double %conv
    416 }
    417 ; CHECK-LABEL: unsigned64ToDouble
    418 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f64
    419 ; CHECK: fstp
    420 ; ARM32-LABEL: unsigned64ToDouble
    421 ; TODO(jpp): implement this test.
    422 ; MIPS32-LABEL: unsigned64ToDouble
    423 ; MIPS32: jal __Sz_uitofp_i64_f64
    424 ; MIPS32O2-LABEL: unsigned64ToDouble
    425 ; MIPS32O2: jal __Sz_uitofp_i64_f64
    426 
    427 define internal float @unsigned64ToFloat(i64 %a) {
    428 entry:
    429   %conv = uitofp i64 %a to float
    430   ret float %conv
    431 }
    432 ; CHECK-LABEL: unsigned64ToFloat
    433 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f32
    434 ; CHECK: fstp
    435 ; ARM32-LABEL: unsigned64ToFloat
    436 ; TODO(jpp): implement this test.
    437 ; MIPS32-LABEL: unsigned64ToFloat
    438 ; MIPS32: jal __Sz_uitofp_i64_f32
    439 ; MIPS32O2-LABEL: unsigned64ToFloat
    440 ; MIPS32O2: jal __Sz_uitofp_i64_f32
    441 
    442 define internal double @unsigned64ToDoubleConst() {
    443 entry:
    444   %conv = uitofp i64 12345678901234 to double
    445   ret double %conv
    446 }
    447 ; CHECK-LABEL: unsigned64ToDoubleConst
    448 ; CHECK: mov DWORD PTR [esp+0x4],0xb3a
    449 ; CHECK: mov DWORD PTR [esp],0x73ce2ff2
    450 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i64_f64
    451 ; CHECK: fstp
    452 ; ARM32-LABEL: unsigned64ToDoubleConst
    453 ; TODO(jpp): implement this test.
    454 ; MIPS32-LABEL: unsigned64ToDoubleConst
    455 ; MIPS32: jal __Sz_uitofp_i64_f64
    456 ; MIPS32O2-LABEL: unsigned64ToDoubleConst
    457 ; MIPS32O2: jal __Sz_uitofp_i64_f64
    458 
    459 define internal double @signed32ToDouble(i32 %a) {
    460 entry:
    461   %conv = sitofp i32 %a to double
    462   ret double %conv
    463 }
    464 ; CHECK-LABEL: signed32ToDouble
    465 ; CHECK: cvtsi2sd
    466 ; CHECK: fld
    467 ; ARM32-LABEL: signed32ToDouble
    468 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], {{r[0-9]+}}
    469 ; ARM32-DAG: vcvt.f64.s32 {{d[0-9]+}}, [[SRC]]
    470 ; MIPS32-LABEL: signed32ToDouble
    471 ; MIPS32: cvt.d.w
    472 ; MIPS32O2-LABEL: signed32ToDouble
    473 ; MIPS32O2: cvt.d.w
    474 
    475 define internal double @signed32ToDoubleConst() {
    476 entry:
    477   %conv = sitofp i32 123 to double
    478   ret double %conv
    479 }
    480 ; CHECK-LABEL: signed32ToDoubleConst
    481 ; CHECK: cvtsi2sd {{.*[^1]}}
    482 ; CHECK: fld
    483 ; ARM32-LABEL: signed32ToDoubleConst
    484 ; ARM32-DAG: mov [[CONST:r[0-9]+]], #123
    485 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[CONST]]
    486 ; ARM32-DAG: vcvt.f64.s32 {{d[0-9]+}}, [[SRC]]
    487 ; MIPS32-LABEL: signed32ToDoubleConst
    488 ; MIPS32: cvt.d.w
    489 ; MIPS32O2-LABEL: signed32ToDoubleConst
    490 ; MIPS32O2: cvt.d.w
    491 
    492 define internal float @signed32ToFloat(i32 %a) {
    493 entry:
    494   %conv = sitofp i32 %a to float
    495   ret float %conv
    496 }
    497 ; CHECK-LABEL: signed32ToFloat
    498 ; CHECK: cvtsi2ss
    499 ; CHECK: fld
    500 ; ARM32-LABEL: signed32ToFloat
    501 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], {{r[0-9]+}}
    502 ; ARM32-DAG: vcvt.f32.s32 {{s[0-9]+}}, [[SRC]]
    503 ; MIPS32-LABEL: signed32ToFloat
    504 ; MIPS32: cvt.s.w $f{{.*}}, $f{{.*}}
    505 ; MIPS32O2-LABEL: signed32ToFloat
    506 ; MIPS32O2: mtc1 $a0, $[[REG:f[0-9]+]]
    507 ; MIPS32O2: cvt.s.w $f{{.*}}, $[[REG]]
    508 
    509 define internal double @unsigned32ToDouble(i32 %a) {
    510 entry:
    511   %conv = uitofp i32 %a to double
    512   ret double %conv
    513 }
    514 ; CHECK-LABEL: unsigned32ToDouble
    515 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i32_f64
    516 ; CHECK: fstp QWORD
    517 ; ARM32-LABEL: unsigned32ToDouble
    518 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], {{r[0-9]+}}
    519 ; ARM32-DAG: vcvt.f64.u32 {{d[0-9]+}}, [[SRC]]
    520 ; MIPS32-LABEL: unsigned32ToDouble
    521 ; MIPS32: jal __Sz_uitofp_i32_f64
    522 ; MIPS32O2-LABEL: unsigned32ToDouble
    523 ; MIPS32O2: jal __Sz_uitofp_i32_f64
    524 
    525 define internal float @unsigned32ToFloat(i32 %a) {
    526 entry:
    527   %conv = uitofp i32 %a to float
    528   ret float %conv
    529 }
    530 ; CHECK-LABEL: unsigned32ToFloat
    531 ; CHECK: call {{.*}} R_{{.*}} __Sz_uitofp_i32_f32
    532 ; CHECK: fstp DWORD
    533 ; ARM32-LABEL: unsigned32ToFloat
    534 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], {{r[0-9]+}}
    535 ; ARM32-DAG: vcvt.f32.u32 {{s[0-9]+}}, [[SRC]]
    536 ; MIPS32-LABEL: unsigned32ToFloat
    537 ; MIPS32: jal __Sz_uitofp_i32_f32
    538 ; MIPS32O2-LABEL: unsigned32ToFloat
    539 ; MIPS32O2: jal __Sz_uitofp_i32_f32
    540 
    541 define internal double @signed16ToDouble(i32 %a) {
    542 entry:
    543   %a.arg_trunc = trunc i32 %a to i16
    544   %conv = sitofp i16 %a.arg_trunc to double
    545   ret double %conv
    546 }
    547 ; CHECK-LABEL: signed16ToDouble
    548 ; CHECK: cvtsi2sd
    549 ; CHECK: fld QWORD
    550 ; ARM32-LABEL: signed16ToDouble
    551 ; ARM32-DAG: sxth [[INT:r[0-9]+]]
    552 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]]
    553 ; ARM32-DAG: vcvt.f64.s32 {{d[0-9]+}}, [[SRC]]
    554 ; MIPS32-LABEL: signed16ToDouble
    555 ; MIPS32: cvt.d.w
    556 ; MIPS32O2-LABEL: signed16ToDouble
    557 ; MIPS32O2: cvt.d.w
    558 
    559 define internal float @signed16ToFloat(i32 %a) {
    560 entry:
    561   %a.arg_trunc = trunc i32 %a to i16
    562   %conv = sitofp i16 %a.arg_trunc to float
    563   ret float %conv
    564 }
    565 ; CHECK-LABEL: signed16ToFloat
    566 ; CHECK: cvtsi2ss
    567 ; CHECK: fld DWORD
    568 ; ARM32-LABEL: signed16ToFloat
    569 ; ARM32-DAG: sxth [[INT:r[0-9]+]]
    570 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]]
    571 ; ARM32-DAG: vcvt.f32.s32 {{s[0-9]+}}, [[SRC]]
    572 ; MIPS32-LABEL: signed16ToFloat
    573 ; MIPS32: cvt.s.w
    574 ; MIPS32O2-LABEL: signed16ToFloat
    575 ; MIPS32O2: cvt.s.w
    576 
    577 define internal double @unsigned16ToDouble(i32 %a) {
    578 entry:
    579   %a.arg_trunc = trunc i32 %a to i16
    580   %conv = uitofp i16 %a.arg_trunc to double
    581   ret double %conv
    582 }
    583 ; CHECK-LABEL: unsigned16ToDouble
    584 ; CHECK: cvtsi2sd
    585 ; CHECK: fld
    586 ; ARM32-LABEL: unsigned16ToDouble
    587 ; ARM32-DAG: uxth [[INT:r[0-9]+]]
    588 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]]
    589 ; ARM32-DAG: vcvt.f64.u32 {{d[0-9]+}}, [[SRC]]
    590 ; MIPS32-LABEL: unsigned16ToDouble
    591 ; MIPS32: cvt.d.w
    592 ; MIPS32O2-LABEL: unsigned16ToDouble
    593 ; MIPS32O2: cvt.d.w
    594 
    595 define internal double @unsigned16ToDoubleConst() {
    596 entry:
    597   %conv = uitofp i16 12345 to double
    598   ret double %conv
    599 }
    600 ; CHECK-LABEL: unsigned16ToDoubleConst
    601 ; CHECK: cvtsi2sd
    602 ; CHECK: fld
    603 ; ARM32-LABEL: unsigned16ToDoubleConst
    604 ; ARM32-DAG: movw [[INT:r[0-9]+]], #12345
    605 ; ARM32-DAG: uxth [[INT]]
    606 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]]
    607 ; ARM32-DAG: vcvt.f64.u32 {{d[0-9]+}}, [[SRC]]
    608 ; MIPS32-LABEL: unsigned16ToDoubleConst
    609 ; MIPS32: cvt.d.w
    610 ; MIPS32O2-LABEL: unsigned16ToDoubleConst
    611 ; MIPS32O2: cvt.d.w
    612 
    613 define internal float @unsigned16ToFloat(i32 %a) {
    614 entry:
    615   %a.arg_trunc = trunc i32 %a to i16
    616   %conv = uitofp i16 %a.arg_trunc to float
    617   ret float %conv
    618 }
    619 ; CHECK-LABEL: unsigned16ToFloat
    620 ; CHECK: cvtsi2ss
    621 ; CHECK: fld
    622 ; ARM32-LABEL: unsigned16ToFloat
    623 ; ARM32-DAG: uxth [[INT:r[0-9]+]]
    624 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]]
    625 ; ARM32-DAG: vcvt.f32.u32 {{s[0-9]+}}, [[SRC]]
    626 ; MIPS32-LABEL: unsigned16ToFloat
    627 ; MIPS32: cvt.s.w
    628 ; MIPS32O2-LABEL: unsigned16ToFloat
    629 ; MIPS32O2: cvt.s.w
    630 
    631 define internal double @signed8ToDouble(i32 %a) {
    632 entry:
    633   %a.arg_trunc = trunc i32 %a to i8
    634   %conv = sitofp i8 %a.arg_trunc to double
    635   ret double %conv
    636 }
    637 ; CHECK-LABEL: signed8ToDouble
    638 ; CHECK: cvtsi2sd
    639 ; CHECK: fld
    640 ; ARM32-LABEL: signed8ToDouble
    641 ; ARM32-DAG: sxtb [[INT:r[0-9]+]]
    642 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]]
    643 ; ARM32-DAG: vcvt.f64.s32 {{d[0-9]+}}, [[SRC]]
    644 ; MIPS32-LABEL: signed8ToDouble
    645 ; MIPS32: cvt.d.w
    646 ; MIPS32O2-LABEL: signed8ToDouble
    647 ; MIPS32O2: cvt.d.w
    648 
    649 define internal float @signed8ToFloat(i32 %a) {
    650 entry:
    651   %a.arg_trunc = trunc i32 %a to i8
    652   %conv = sitofp i8 %a.arg_trunc to float
    653   ret float %conv
    654 }
    655 ; CHECK-LABEL: signed8ToFloat
    656 ; CHECK: cvtsi2ss
    657 ; CHECK: fld
    658 ; ARM32-LABEL: signed8ToFloat
    659 ; ARM32-DAG: sxtb [[INT:r[0-9]+]]
    660 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]]
    661 ; ARM32-DAG: vcvt.f32.s32 {{s[0-9]+}}, [[SRC]]
    662 ; MIPS32-LABEL: signed8ToFloat
    663 ; MIPS32: cvt.s.w
    664 ; MIPS32O2-LABEL: signed8ToFloat
    665 ; MIPS32O2: cvt.s.w
    666 
    667 define internal double @unsigned8ToDouble(i32 %a) {
    668 entry:
    669   %a.arg_trunc = trunc i32 %a to i8
    670   %conv = uitofp i8 %a.arg_trunc to double
    671   ret double %conv
    672 }
    673 ; CHECK-LABEL: unsigned8ToDouble
    674 ; CHECK: cvtsi2sd
    675 ; CHECK: fld
    676 ; ARM32-LABEL: unsigned8ToDouble
    677 ; ARM32-DAG: uxtb [[INT:r[0-9]+]]
    678 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]]
    679 ; ARM32-DAG: vcvt.f64.u32 {{d[0-9]+}}, [[SRC]]
    680 ; MIPS32-LABEL: unsigned8ToDouble
    681 ; MIPS32: cvt.d.w
    682 ; MIPS32O2-LABEL: unsigned8ToDouble
    683 ; MIPS32O2: cvt.d.w
    684 
    685 define internal float @unsigned8ToFloat(i32 %a) {
    686 entry:
    687   %a.arg_trunc = trunc i32 %a to i8
    688   %conv = uitofp i8 %a.arg_trunc to float
    689   ret float %conv
    690 }
    691 ; CHECK-LABEL: unsigned8ToFloat
    692 ; CHECK: cvtsi2ss
    693 ; CHECK: fld
    694 ; ARM32-LABEL: unsigned8ToFloat
    695 ; ARM32-DAG: uxtb [[INT:r[0-9]+]]
    696 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]]
    697 ; ARM32-DAG: vcvt.f32.u32 {{s[0-9]+}}, [[SRC]]
    698 ; MIPS32-LABEL: unsigned8ToFloat
    699 ; MIPS32: cvt.s.w
    700 ; MIPS32O2-LABEL: unsigned8ToFloat
    701 ; MIPS32O2: cvt.s.w
    702 
    703 define internal double @unsigned1ToDouble(i32 %a) {
    704 entry:
    705   %a.arg_trunc = trunc i32 %a to i1
    706   %conv = uitofp i1 %a.arg_trunc to double
    707   ret double %conv
    708 }
    709 ; CHECK-LABEL: unsigned1ToDouble
    710 ; CHECK: cvtsi2sd
    711 ; CHECK: fld
    712 ; ARM32-LABEL: unsigned1ToDouble
    713 ; ARM32-DAG: and [[INT:r[0-9]+]], {{r[0-9]+}}, #1
    714 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]]
    715 ; ARM32-DAG: vcvt.f64.u32 {{d[0-9]+}}, [[SRC]]
    716 ; MIPS32-LABEL: unsigned1ToDouble
    717 ; MIPS32: cvt.d.w
    718 ; MIPS32O2-LABEL: unsigned1ToDouble
    719 ; MIPS32O2: cvt.d.w
    720 
    721 define internal float @unsigned1ToFloat(i32 %a) {
    722 entry:
    723   %a.arg_trunc = trunc i32 %a to i1
    724   %conv = uitofp i1 %a.arg_trunc to float
    725   ret float %conv
    726 }
    727 ; CHECK-LABEL: unsigned1ToFloat
    728 ; CHECK: cvtsi2ss
    729 ; CHECK: fld
    730 ; ARM32-LABEL: unsigned1ToFloat
    731 ; ARM32-DAG: and [[INT:r[0-9]+]], {{r[0-9]+}}, #1
    732 ; ARM32-DAG: vmov [[SRC:s[0-9]+]], [[INT]]
    733 ; ARM32-DAG: vcvt.f32.u32 {{s[0-9]+}}, [[SRC]]
    734 ; MIPS32-LABEL: unsigned1ToFloat
    735 ; MIPS32: cvt.s.w
    736 ; MIPS32O2-LABEL: unsigned1ToFloat
    737 ; MIPS32O2: cvt.s.w
    738 
    739 define internal float @int32BitcastToFloat(i32 %a) {
    740 entry:
    741   %conv = bitcast i32 %a to float
    742   ret float %conv
    743 }
    744 ; CHECK-LABEL: int32BitcastToFloat
    745 ; CHECK: mov
    746 ; ARM32-LABEL: int32BitcastToFloat
    747 ; ARM32: vmov s{{[0-9]+}}, r{{[0-9]+}}
    748 ; MIPS32-LABEL: int32BitcastToFloat
    749 ; MIPS32: sw
    750 ; MIPS32: lwc1
    751 ; MIPS32O2-LABEL: int32BitcastToFloat
    752 
    753 define internal float @int32BitcastToFloatConst() {
    754 entry:
    755   %conv = bitcast i32 8675309 to float
    756   ret float %conv
    757 }
    758 ; CHECK-LABEL: int32BitcastToFloatConst
    759 ; CHECK: mov
    760 ; ARM32-LABEL: int32BitcastToFloatConst
    761 ; ARM32-DAG: movw [[REG:r[0-9]+]], #24557
    762 ; ARM32-DAG: movt [[REG]], #132
    763 ; ARM32: vmov s{{[0-9]+}}, [[REG]]
    764 ; MIPS32-LABEL: int32BitcastToFloatConst
    765 ; MIPS32: lwc1
    766 ; MIPS32O2-LABEL: int32BitcastToFloatConst
    767 
    768 define internal double @int64BitcastToDouble(i64 %a) {
    769 entry:
    770   %conv = bitcast i64 %a to double
    771   ret double %conv
    772 }
    773 ; CHECK-LABEL: int64BitcastToDouble
    774 ; CHECK: mov
    775 ; ARM32-LABEL: int64BitcastToDouble
    776 ; ARM32: vmov d{{[0-9]+}}, r{{[0-9]+}}, r{{[0-9]+}}
    777 ; MIPS32-LABEL: int64BitcastToDouble
    778 ; MIPS32: sw
    779 ; MIPS32: sw
    780 ; MIPS32: ldc1
    781 ; MIPS32O2-LABEL: int64BitcastToDouble
    782 
    783 define internal double @int64BitcastToDoubleConst() {
    784 entry:
    785   %conv = bitcast i64 9035768 to double
    786   ret double %conv
    787 }
    788 ; CHECK-LABEL: int64BitcastToDoubleConst
    789 ; CHECK: mov
    790 ; ARM32-LABEL: int64BitcastToDoubleConst
    791 ; ARM32-DAG: movw [[REG0:r[0-9]+]], #57336
    792 ; ARM32-DAG: movt [[REG0]], #137
    793 ; ARM32-DAG: mov [[REG1:r[0-9]+]], #0
    794 ; ARM32-DAG: vmov d{{[0-9]+}}, [[REG0]], [[REG1]]
    795 ; MIPS32-LABEL: int64BitcastToDoubleConst
    796 ; MIPS32: ldc1
    797 ; MIPS32O2-LABEL: int64BitcastToDoubleConst
    798