Home | History | Annotate | Download | only in llvm2ice_tests
      1 ; This tries to be a comprehensive test of i64 operations, in
      2 ; particular the patterns for lowering i64 operations into constituent
      3 ; i32 operations on x86-32.
      4 
      5 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
      6 ; RUN:   --target x8632 -i %s --args -O2 -allow-externally-defined-symbols \
      7 ; RUN:   | %if --need=target_X8632 --command FileCheck %s
      8 
      9 ; RUN: %if --need=target_X8632 --command %p2i --filetype=obj --disassemble \
     10 ; RUN:   --target x8632 -i %s --args -Om1 -allow-externally-defined-symbols \
     11 ; RUN:   | %if --need=target_X8632 --command FileCheck --check-prefix=OPTM1 %s
     12 
     13 ; RUN: %if --need=target_ARM32 \
     14 ; RUN:   --command %p2i --filetype=obj \
     15 ; RUN:   --disassemble --target arm32 -i %s --args -O2 \
     16 ; RUN:   -allow-externally-defined-symbols \
     17 ; RUN:   | %if --need=target_ARM32 \
     18 ; RUN:   --command FileCheck --check-prefix ARM32 --check-prefix ARM32-O2 %s
     19 ; RUN: %if --need=target_ARM32 \
     20 ; RUN:   --command %p2i --filetype=obj --disassemble --target arm32 \
     21 ; RUN:   -i %s --args -Om1 \
     22 ; RUN:   -allow-externally-defined-symbols \
     23 ; RUN:   | %if --need=target_ARM32 \
     24 ; RUN:   --command FileCheck --check-prefix ARM32 --check-prefix ARM32-OM1 %s
     25 
     26 ; TODO: Switch to --filetype=obj when possible.
     27 ; RUN: %if --need=target_MIPS32 --need=allow_dump \
     28 ; RUN:   --command %p2i --filetype=asm --assemble \
     29 ; RUN:   --disassemble --target mips32 -i %s --args -O2 \
     30 ; RUN:   -allow-externally-defined-symbols \
     31 ; RUN:   | %if --need=target_MIPS32 --need=allow_dump \
     32 ; RUN:   --command FileCheck --check-prefix MIPS32 --check-prefix MIPS32-O2 %s
     33 
     34 ; RUN: %if --need=target_MIPS32 --need=allow_dump \
     35 ; RUN:   --command %p2i --filetype=asm --assemble \
     36 ; RUN:   --disassemble --target mips32 -i %s --args -Om1 \
     37 ; RUN:   -allow-externally-defined-symbols \
     38 ; RUN:   | %if --need=target_MIPS32 --need=allow_dump \
     39 ; RUN:   --command FileCheck --check-prefix MIPS32 --check-prefix MIPS32-OM1 %s
     40 
     41 @__init_array_start = internal constant [0 x i8] zeroinitializer, align 4
     42 @__fini_array_start = internal constant [0 x i8] zeroinitializer, align 4
     43 @__tls_template_start = internal constant [0 x i8] zeroinitializer, align 8
     44 @__tls_template_alignment = internal constant [4 x i8] c"\01\00\00\00", align 4
     45 
     46 define internal i32 @ignore64BitArg(i64 %a, i32 %b, i64 %c) {
     47 entry:
     48   ret i32 %b
     49 }
     50 
     51 ; MIPS32-LABEL: ignore64BitArg
     52 ; MIPS32-O2: move v0,a2
     53 ; MIPS32-OM1: sw a2,[[MEM:.*]]
     54 ; MIPS32-OM1: lw v0,[[MEM]]
     55 
     56 define internal i32 @pass64BitArg(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f) {
     57 entry:
     58   %call = call i32 @ignore64BitArgNoInline(i64 %a, i32 123, i64 %b)
     59   %call1 = call i32 @ignore64BitArgNoInline(i64 %c, i32 123, i64 %d)
     60   %call2 = call i32 @ignore64BitArgNoInline(i64 %e, i32 123, i64 %f)
     61   %add = add i32 %call1, %call
     62   %add3 = add i32 %add, %call2
     63   ret i32 %add3
     64 }
     65 ; CHECK-LABEL: pass64BitArg
     66 ; CHECK:      sub     esp
     67 ; CHECK:      mov     DWORD PTR [esp+0x4]
     68 ; CHECK:      mov     DWORD PTR [esp]
     69 ; CHECK:      mov     DWORD PTR [esp+0x8],0x7b
     70 ; CHECK:      mov     DWORD PTR [esp+0x10]
     71 ; CHECK:      mov     DWORD PTR [esp+0xc]
     72 ; CHECK:      call {{.*}} R_{{.*}}    ignore64BitArgNoInline
     73 ; CHECK:      mov     DWORD PTR [esp+0x4]
     74 ; CHECK:      mov     DWORD PTR [esp]
     75 ; CHECK:      mov     DWORD PTR [esp+0x8],0x7b
     76 ; CHECK:      mov     DWORD PTR [esp+0x10]
     77 ; CHECK:      mov     DWORD PTR [esp+0xc]
     78 ; CHECK:      call {{.*}} R_{{.*}}    ignore64BitArgNoInline
     79 ; CHECK:      mov     DWORD PTR [esp+0x4]
     80 ; CHECK:      mov     DWORD PTR [esp]
     81 ; CHECK:      mov     DWORD PTR [esp+0x8],0x7b
     82 ; CHECK:      mov     DWORD PTR [esp+0x10]
     83 ; CHECK:      mov     DWORD PTR [esp+0xc]
     84 ; CHECK:      call {{.*}} R_{{.*}}    ignore64BitArgNoInline
     85 ;
     86 ; OPTM1-LABEL: pass64BitArg
     87 ; OPTM1:      sub     esp
     88 ; OPTM1:      mov     DWORD PTR [esp+0x4]
     89 ; OPTM1:      mov     DWORD PTR [esp]
     90 ; OPTM1:      mov     DWORD PTR [esp+0x8],0x7b
     91 ; OPTM1:      mov     DWORD PTR [esp+0x10]
     92 ; OPTM1:      mov     DWORD PTR [esp+0xc]
     93 ; OPTM1:      call {{.*}} R_{{.*}}    ignore64BitArgNoInline
     94 ; OPTM1:      mov     DWORD PTR [esp+0x4]
     95 ; OPTM1:      mov     DWORD PTR [esp]
     96 ; OPTM1:      mov     DWORD PTR [esp+0x8],0x7b
     97 ; OPTM1:      mov     DWORD PTR [esp+0x10]
     98 ; OPTM1:      mov     DWORD PTR [esp+0xc]
     99 ; OPTM1:      call {{.*}} R_{{.*}}    ignore64BitArgNoInline
    100 ; OPTM1:      mov     DWORD PTR [esp+0x4]
    101 ; OPTM1:      mov     DWORD PTR [esp]
    102 ; OPTM1:      mov     DWORD PTR [esp+0x8],0x7b
    103 ; OPTM1:      mov     DWORD PTR [esp+0x10]
    104 ; OPTM1:      mov     DWORD PTR [esp+0xc]
    105 ; OPTM1:      call {{.*}} R_{{.*}}    ignore64BitArgNoInline
    106 
    107 ; ARM32-LABEL: pass64BitArg
    108 ; ARM32:      str     {{.*}}, [sp]
    109 ; ARM32:      mov     r2, #123
    110 ; ARM32:      bl      {{.*}} ignore64BitArgNoInline
    111 ; ARM32:      str     {{.*}}, [sp]
    112 ; ARM32:      {{mov|ldr}} r0
    113 ; ARM32:      {{mov|ldr}} r1
    114 ; ARM32:      mov     r2, #123
    115 ; ARM32:      bl      {{.*}} ignore64BitArgNoInline
    116 ; ARM32:      str     {{.*}}, [sp]
    117 ; ARM32:      {{mov|ldr}} r0
    118 ; ARM32:      {{mov|ldr}} r1
    119 ; ARM32:      mov     r2, #123
    120 ; ARM32:      bl      {{.*}} ignore64BitArgNoInline
    121 
    122 ; MIPS32-LABEL: pass64BitArg
    123 ; MIPS32-O2: 	sw	a3,{{.*}}(sp)
    124 ; MIPS32-O2: 	sw	a2,{{.*}}(sp)
    125 ; MIPS32-O2: 	li	a2,123
    126 ; MIPS32-O2: 	jal	{{.*}}	ignore64BitArgNoInline
    127 ; MIPS32-O2: 	nop
    128 ; MIPS32-O2: 	move	s0,v0
    129 ; MIPS32-O2: 	sw	s3,{{.*}}(sp)
    130 ; MIPS32-O2: 	sw	s2,{{.*}}(sp)
    131 ; MIPS32-O2: 	lw	a0,{{.*}}(sp)
    132 ; MIPS32-O2: 	move	a1,s1
    133 ; MIPS32-O2: 	li	a2,123
    134 ; MIPS32-O2: 	jal	{{.*}}	ignore64BitArgNoInline
    135 ; MIPS32-O2: 	nop
    136 ; MIPS32-O2: 	move	s1,v0
    137 ; MIPS32-O2: 	sw	s7,{{.*}}(sp)
    138 ; MIPS32-O2: 	sw	s6,{{.*}}(sp)
    139 ; MIPS32-O2: 	move	a0,s4
    140 ; MIPS32-O2: 	move	a1,s5
    141 ; MIPS32-O2: 	li	a2,123
    142 ; MIPS32-O2: 	jal	{{.*}}	ignore64BitArgNoInline
    143 ; MIPS32-O2: 	nop
    144 
    145 
    146 declare i32 @ignore64BitArgNoInline(i64, i32, i64)
    147 
    148 define internal i32 @pass64BitConstArg(i64 %a, i64 %b) {
    149 entry:
    150   %call = call i32 @ignore64BitArgNoInline(i64 %b, i32 123, i64 -2401053092306725256)
    151   ret i32 %call
    152 }
    153 ; CHECK-LABEL: pass64BitConstArg
    154 ; CHECK:      sub     esp
    155 ; CHECK:      mov     DWORD PTR [esp+0x4]
    156 ; CHECK-NEXT: mov     DWORD PTR [esp]
    157 ; CHECK-NEXT: mov     DWORD PTR [esp+0x8],0x7b
    158 ; Bundle padding might be added (so not using -NEXT).
    159 ; CHECK:      mov     DWORD PTR [esp+0x10],0xdeadbeef
    160 ; CHECK-NEXT: mov     DWORD PTR [esp+0xc],0x12345678
    161 ; Bundle padding will push the call down.
    162 ; CHECK-NOT:  mov
    163 ; CHECK:      call {{.*}} R_{{.*}}    ignore64BitArgNoInline
    164 ;
    165 ; OPTM1-LABEL: pass64BitConstArg
    166 ; OPTM1:      sub     esp
    167 ; OPTM1:      mov     DWORD PTR [esp+0x4]
    168 ; OPTM1:      mov     DWORD PTR [esp]
    169 ; OPTM1-NEXT: mov     DWORD PTR [esp+0x8],0x7b
    170 ; Bundle padding might be added (so not using -NEXT).
    171 ; OPTM1:      mov     DWORD PTR [esp+0x10],0xdeadbeef
    172 ; OPTM1-NEXT: mov     DWORD PTR [esp+0xc],0x12345678
    173 ; OPTM1-NOT:  mov
    174 ; OPTM1:      call {{.*}} R_{{.*}}    ignore64BitArgNoInline
    175 
    176 ; ARM32-LABEL: pass64BitConstArg
    177 ; ARM32:      movw    [[REG1:r.*]], {{.*}} ; 0xbeef
    178 ; ARM32:      movt    [[REG1]], {{.*}}     ; 0xdead
    179 ; ARM32:      movw    [[REG2:r.*]], {{.*}} ; 0x5678
    180 ; ARM32:      movt    [[REG2]], {{.*}}     ; 0x1234
    181 ; ARM32:      str     [[REG1]], [sp, #4]
    182 ; ARM32:      str     [[REG2]], [sp]
    183 ; ARM32:      {{mov|ldr}} r0
    184 ; ARM32:      {{mov|ldr}} r1
    185 ; ARM32:      mov     r2, #123
    186 ; ARM32:      bl      {{.*}} ignore64BitArgNoInline
    187 
    188 ; MIPS32-LABEL: pass64BitConstArg
    189 ; MIPS32-O2: 	lui	[[REG:.*]],0xdead
    190 ; MIPS32-O2: 	ori	[[REG1:.*]],[[REG]],0xbeef
    191 ; MIPS32-O2: 	lui	[[REG:.*]],0x1234
    192 ; MIPS32-O2: 	ori	[[REG2:.*]],[[REG]],0x5678
    193 ; MIPS32-O2: 	sw	[[REG1]],{{.*}}(sp)
    194 ; MIPS32-O2: 	sw	[[REG2]],{{.*}}(sp)
    195 ; MIPS32-O2: 	move	a0,a2
    196 ; MIPS32-O2: 	move	a1,a3
    197 ; MIPS32-O2: 	li	a2,123
    198 ; MIPS32-O2: 	jal	{{.*}}	ignore64BitArgNoInline
    199 
    200 define internal i32 @pass64BitUndefArg() {
    201 entry:
    202   %call = call i32 @ignore64BitArgNoInline(i64 0, i32 123, i64 undef)
    203   ret i32 %call
    204 }
    205 ; CHECK-LABEL: pass64BitUndefArg
    206 ; CHECK: sub esp
    207 ; CHECK: mov DWORD PTR{{.*}},0x7b
    208 ; CHECK: mov DWORD PTR{{.*}},0x0
    209 ; CHECK: call {{.*}} R_{{.*}} ignore64BitArgNoInline
    210 ; OPTM1-LABEL: pass64BitUndefArg
    211 ; OPTM1: sub esp
    212 ; OPTM1: mov DWORD PTR{{.*}},0x7b
    213 ; OPTM1: mov DWORD PTR{{.*}},0x0
    214 ; OPTM1: call {{.*}} R_{{.*}} ignore64BitArgNoInline
    215 ; ARM32-LABEL: pass64BitUndefArg
    216 ; ARM32: sub sp
    217 ; ARM32: mov {{.*}}, #0
    218 ; ARM32: str
    219 ; ARM32: mov {{.*}}, #123
    220 ; ARM32: bl {{.*}} ignore64BitArgNoInline
    221 
    222 ; MIPS32-LABEL: pass64BitUndefArg
    223 ; MIPS32: jr  ra
    224 
    225 define internal i64 @return64BitArg(i64 %padding, i64 %a) {
    226 entry:
    227   ret i64 %a
    228 }
    229 ; CHECK-LABEL: return64BitArg
    230 ; CHECK: mov     {{.*}},DWORD PTR [esp+0xc]
    231 ; CHECK: mov     {{.*}},DWORD PTR [esp+0x10]
    232 ;
    233 ; OPTM1-LABEL: return64BitArg
    234 ; OPTM1: mov     {{.*}},DWORD PTR [esp+0xc]
    235 ; OPTM1: mov     {{.*}},DWORD PTR [esp+0x10]
    236 
    237 ; ARM32-LABEL: return64BitArg
    238 ; ARM32: mov {{.*}}, r2
    239 ; ARM32: mov {{.*}}, r3
    240 ; ARM32: bx lr
    241 
    242 ; MIPS32-LABEL; return64BitArg
    243 ; MIPS32-O2: move v0,a2
    244 ; MIPS32-O2: move v1,a3
    245 ; MIPS32-OM1: move [[T1:.*]],a2
    246 ; MIPS32-OM1: sw [[T1]],[[MEM1:.*]]
    247 ; MIPS32-OM1: move [[T2:.*]],a3
    248 ; MIPS32-OM1: sw [[T2]],[[MEM2:.*]]
    249 ; MIPS32-OM1: lw v0,[[MEM1]]
    250 ; MIPS32-OM1: lw v1,[[MEM2]]
    251 ; MIPS32: jr ra
    252 
    253 define internal i64 @return64BitConst() {
    254 entry:
    255   ret i64 -2401053092306725256
    256 }
    257 ; CHECK-LABEL: return64BitConst
    258 ; CHECK: mov     eax,0x12345678
    259 ; CHECK: mov     edx,0xdeadbeef
    260 ;
    261 ; OPTM1-LABEL: return64BitConst
    262 ; OPTM1: mov     eax,0x12345678
    263 ; OPTM1: mov     edx,0xdeadbeef
    264 
    265 ; ARM32-LABEL: return64BitConst
    266 ; ARM32: movw r0, #22136 ; 0x5678
    267 ; ARM32: movt r0, #4660  ; 0x1234
    268 ; ARM32: movw r1, #48879 ; 0xbeef
    269 ; ARM32: movt r1, #57005 ; 0xdead
    270 
    271 ; MIPS32-LABEL: return64BitConst
    272 ; MIPS32: lui v0,0x1234
    273 ; MIPS32: ori v0,v0,0x5678
    274 ; MIPS32: lui v1,0xdead
    275 ; MIPS32: ori v1,v1,0xbeef
    276 ; MIPS32: jr ra
    277 
    278 define internal i64 @add64BitSigned(i64 %a, i64 %b) {
    279 entry:
    280   %add = add i64 %b, %a
    281   ret i64 %add
    282 }
    283 ; CHECK-LABEL: add64BitSigned
    284 ; CHECK: add
    285 ; CHECK: adc
    286 ;
    287 ; OPTM1-LABEL: add64BitSigned
    288 ; OPTM1: add
    289 ; OPTM1: adc
    290 
    291 ; ARM32-LABEL: add64BitSigned
    292 ; ARM32: adds
    293 ; ARM32: adc
    294 
    295 ; MIPS32-LABEL: add64BitSigned
    296 ; MIPS32: addu
    297 ; MIPS32: sltu
    298 ; MIPS32: addu
    299 ; MIPS32: addu
    300 
    301 define internal i64 @add64BitUnsigned(i64 %a, i64 %b) {
    302 entry:
    303   %add = add i64 %b, %a
    304   ret i64 %add
    305 }
    306 ; CHECK-LABEL: add64BitUnsigned
    307 ; CHECK: add
    308 ; CHECK: adc
    309 ;
    310 ; OPTM1-LABEL: add64BitUnsigned
    311 ; OPTM1: add
    312 ; OPTM1: adc
    313 
    314 ; ARM32-LABEL: add64BitUnsigned
    315 ; ARM32: adds
    316 ; ARM32: adc
    317 
    318 ; MIPS32-LABEL: add64BitUnsigned
    319 ; MIPS32: addu
    320 ; MIPS32: sltu
    321 ; MIPS32: addu
    322 ; MIPS32: addu
    323 
    324 define internal i64 @sub64BitSigned(i64 %a, i64 %b) {
    325 entry:
    326   %sub = sub i64 %a, %b
    327   ret i64 %sub
    328 }
    329 ; CHECK-LABEL: sub64BitSigned
    330 ; CHECK: sub
    331 ; CHECK: sbb
    332 ;
    333 ; OPTM1-LABEL: sub64BitSigned
    334 ; OPTM1: sub
    335 ; OPTM1: sbb
    336 
    337 ; ARM32-LABEL: sub64BitSigned
    338 ; ARM32: subs
    339 ; ARM32: sbc
    340 
    341 ; MIPS32-LABEL: sub64BitSigned
    342 ; MIPS32: subu
    343 ; MIPS32: sltu
    344 ; MIPS32: addu
    345 ; MIPS32: subu
    346 
    347 define internal i64 @sub64BitUnsigned(i64 %a, i64 %b) {
    348 entry:
    349   %sub = sub i64 %a, %b
    350   ret i64 %sub
    351 }
    352 ; CHECK-LABEL: sub64BitUnsigned
    353 ; CHECK: sub
    354 ; CHECK: sbb
    355 ;
    356 ; OPTM1-LABEL: sub64BitUnsigned
    357 ; OPTM1: sub
    358 ; OPTM1: sbb
    359 
    360 ; ARM32-LABEL: sub64BitUnsigned
    361 ; ARM32: subs
    362 ; ARM32: sbc
    363 
    364 ; MIPS32-LABEL: sub64BitUnsigned
    365 ; MIPS32: subu
    366 ; MIPS32: sltu
    367 ; MIPS32: addu
    368 ; MIPS32: subu
    369 
    370 define internal i64 @mul64BitSigned(i64 %a, i64 %b) {
    371 entry:
    372   %mul = mul i64 %b, %a
    373   ret i64 %mul
    374 }
    375 ; CHECK-LABEL: mul64BitSigned
    376 ; CHECK: imul
    377 ; CHECK: mul
    378 ; CHECK: add
    379 ; CHECK: imul
    380 ; CHECK: add
    381 ;
    382 ; OPTM1-LABEL: mul64BitSigned
    383 ; OPTM1: imul
    384 ; OPTM1: mul
    385 ; OPTM1: add
    386 ; OPTM1: imul
    387 ; OPTM1: add
    388 
    389 ; ARM32-LABEL: mul64BitSigned
    390 ; ARM32: mul
    391 ; ARM32: mla
    392 ; ARM32: umull
    393 ; ARM32: add
    394 
    395 ; MIPS32-LABEL: mul64BitSigned
    396 ; MIPS32: multu
    397 ; MIPS32: mflo
    398 ; MIPS32: mfhi
    399 ; MIPS32: mul
    400 ; MIPS32: mul
    401 ; MIPS32: addu
    402 ; MIPS32: addu
    403 
    404 define internal i64 @mul64BitUnsigned(i64 %a, i64 %b) {
    405 entry:
    406   %mul = mul i64 %b, %a
    407   ret i64 %mul
    408 }
    409 ; CHECK-LABEL: mul64BitUnsigned
    410 ; CHECK: imul
    411 ; CHECK: mul
    412 ; CHECK: add
    413 ; CHECK: imul
    414 ; CHECK: add
    415 ;
    416 ; OPTM1-LABEL: mul64BitUnsigned
    417 ; OPTM1: imul
    418 ; OPTM1: mul
    419 ; OPTM1: add
    420 ; OPTM1: imul
    421 ; OPTM1: add
    422 
    423 ; ARM32-LABEL: mul64BitUnsigned
    424 ; ARM32: mul
    425 ; ARM32: mla
    426 ; ARM32: umull
    427 ; ARM32: add
    428 
    429 ; MIPS32-LABEL: mul64BitUnsigned
    430 ; MIPS32: multu
    431 ; MIPS32: mflo
    432 ; MIPS32: mfhi
    433 ; MIPS32: mul
    434 ; MIPS32: mul
    435 ; MIPS32: addu
    436 ; MIPS32: addu
    437 
    438 define internal i64 @div64BitSigned(i64 %a, i64 %b) {
    439 entry:
    440   %div = sdiv i64 %a, %b
    441   ret i64 %div
    442 }
    443 ; CHECK-LABEL: div64BitSigned
    444 ; CHECK: call {{.*}} R_{{.*}}    __divdi3
    445 
    446 ; OPTM1-LABEL: div64BitSigned
    447 ; OPTM1: call {{.*}} R_{{.*}}    __divdi3
    448 ;
    449 ; ARM32-LABEL: div64BitSigned
    450 ; ARM32: orrs {{r.*}}, {{r.*}}
    451 ; ARM32: bne
    452 ; ARM32: bl {{.*}} __divdi3
    453 
    454 ; MIPS32-LABEL: div64BitSigned
    455 ; MIPS32: jal {{.*}} __divdi3
    456 
    457 define internal i64 @div64BitSignedConst(i64 %a) {
    458 entry:
    459   %div = sdiv i64 %a, 12345678901234
    460   ret i64 %div
    461 }
    462 ; CHECK-LABEL: div64BitSignedConst
    463 ; CHECK: mov     DWORD PTR [esp+0xc],0xb3a
    464 ; CHECK: mov     DWORD PTR [esp+0x8],0x73ce2ff2
    465 ; CHECK: call {{.*}} R_{{.*}}    __divdi3
    466 ;
    467 ; OPTM1-LABEL: div64BitSignedConst
    468 ; OPTM1: mov     DWORD PTR [esp+0xc],0xb3a
    469 ; OPTM1: mov     DWORD PTR [esp+0x8],0x73ce2ff2
    470 ; OPTM1: call {{.*}} R_{{.*}}    __divdi3
    471 ;
    472 ; ARM32-LABEL: div64BitSignedConst
    473 ; For a constant, we should be able to optimize-out the divide by zero check.
    474 ; ARM32-NOT: orrs
    475 ; ARM32: movw {{.*}} ; 0x2ff2
    476 ; ARM32: movt {{.*}} ; 0x73ce
    477 ; ARM32: movw {{.*}} ; 0xb3a
    478 ; ARM32: bl {{.*}} __divdi3
    479 
    480 ; MIPS32-LABEL: div64BitSignedConst
    481 ; MIPS32: jal {{.*}} __divdi3
    482 
    483 define internal i64 @div64BitUnsigned(i64 %a, i64 %b) {
    484 entry:
    485   %div = udiv i64 %a, %b
    486   ret i64 %div
    487 }
    488 ; CHECK-LABEL: div64BitUnsigned
    489 ; CHECK: call {{.*}} R_{{.*}}    __udivdi3
    490 ;
    491 ; OPTM1-LABEL: div64BitUnsigned
    492 ; OPTM1: call {{.*}} R_{{.*}}    __udivdi3
    493 ;
    494 ; ARM32-LABEL: div64BitUnsigned
    495 ; ARM32: orrs {{r.*}}, {{r.*}}
    496 ; ARM32: bne
    497 ; ARM32: bl {{.*}} __udivdi3
    498 
    499 ; MIPS32-LABEL: div64BitUnsigned
    500 ; MIPS32: jal {{.*}} __udivdi3
    501 
    502 define internal i64 @rem64BitSigned(i64 %a, i64 %b) {
    503 entry:
    504   %rem = srem i64 %a, %b
    505   ret i64 %rem
    506 }
    507 ; CHECK-LABEL: rem64BitSigned
    508 ; CHECK: call {{.*}} R_{{.*}}    __moddi3
    509 ;
    510 ; OPTM1-LABEL: rem64BitSigned
    511 ; OPTM1: call {{.*}} R_{{.*}}    __moddi3
    512 ;
    513 ; ARM32-LABEL: rem64BitSigned
    514 ; ARM32: orrs {{r.*}}, {{r.*}}
    515 ; ARM32: bne
    516 ; ARM32: bl {{.*}} __moddi3
    517 
    518 ; MIPS32-LABEL: rem64BitSigned
    519 ; MIPS32: jal {{.*}} __moddi3
    520 
    521 define internal i64 @rem64BitUnsigned(i64 %a, i64 %b) {
    522 entry:
    523   %rem = urem i64 %a, %b
    524   ret i64 %rem
    525 }
    526 ; CHECK-LABEL: rem64BitUnsigned
    527 ; CHECK: call {{.*}} R_{{.*}}    __umoddi3
    528 ;
    529 ; OPTM1-LABEL: rem64BitUnsigned
    530 ; OPTM1: call {{.*}} R_{{.*}}    __umoddi3
    531 ;
    532 ; ARM32-LABEL: rem64BitUnsigned
    533 ; ARM32: orrs {{r.*}}, {{r.*}}
    534 ; ARM32: bne
    535 ; ARM32: bl {{.*}} __umoddi3
    536 
    537 ; MIPS32-LABEL: rem64BitUnsigned
    538 ; MIPS32: jal {{.*}} __umoddi3
    539 
    540 define internal i64 @shl64BitSigned(i64 %a, i64 %b) {
    541 entry:
    542   %shl = shl i64 %a, %b
    543   ret i64 %shl
    544 }
    545 ; CHECK-LABEL: shl64BitSigned
    546 ; CHECK: shld
    547 ; CHECK: shl e
    548 ; CHECK: test {{.*}},0x20
    549 ; CHECK: je
    550 ;
    551 ; OPTM1-LABEL: shl64BitSigned
    552 ; OPTM1: shld
    553 ; OPTM1: shl e
    554 ; OPTM1: test {{.*}},0x20
    555 ; OPTM1: je
    556 
    557 ; ARM32-LABEL: shl64BitSigned
    558 ; ARM32: rsb     [[T0:r[0-9]+]], r2, #32
    559 ; ARM32: lsr     [[T1:r[0-9]+]], r0, [[T0]]
    560 ; ARM32: orr     [[T2:r[0-9]+]], [[T1]], r1, lsl r2
    561 ; ARM32: sub     [[T3:r[0-9]+]], r2, #32
    562 ; ARM32: cmp     [[T3]], #0
    563 ; ARM32: lslge   [[T2]], r0, [[T3]]
    564 ; ARM32: lsl     r{{[0-9]+}}, r0, r2
    565 
    566 ; MIPS32-LABEL: shl64BitSigned
    567 ; MIPS32: sllv	[[T1:.*]],[[A_HI:.*]],[[B_LO:.*]]
    568 ; MIPS32: nor	[[T2:.*]],[[B_LO]],zero
    569 ; MIPS32: srl	[[T3:.*]],[[A_LO:.*]],0x1
    570 ; MIPS32: srlv	[[T4:.*]],[[T3]],[[T2]]
    571 ; MIPS32: or	[[T_HI:.*]],[[T1]],[[T4]]
    572 ; MIPS32: sllv	[[T_LO:.*]],[[A_LO]],[[B_LO]]
    573 ; MIPS32: move	[[T1_LO:.*]],[[T_LO]]
    574 ; MIPS32: andi	[[T5:.*]],[[B_LO]],0x20
    575 ; MIPS32: movn	[[T_HI]],[[T_LO]],[[T5]]
    576 ; MIPS32: movn	[[T1_LO]],zero,[[T5]]
    577 ; MIPS32-O2: move	v1,[[T_HI]]
    578 ; MIPS32-OM1: sw	[[T_HI]],[[MEM:.*]]
    579 ; MIPS32-OM1: lw        v1,[[MEM]]
    580 
    581 define internal i32 @shl64BitSignedTrunc(i64 %a, i64 %b) {
    582 entry:
    583   %shl = shl i64 %a, %b
    584   %result = trunc i64 %shl to i32
    585   ret i32 %result
    586 }
    587 ; CHECK-LABEL: shl64BitSignedTrunc
    588 ; CHECK: mov
    589 ; CHECK: shl e
    590 ; CHECK: test {{.*}},0x20
    591 ; CHECK: je
    592 ;
    593 ; OPTM1-LABEL: shl64BitSignedTrunc
    594 ; OPTM1: shld
    595 ; OPTM1: shl e
    596 ; OPTM1: test {{.*}},0x20
    597 ; OPTM1: je
    598 
    599 ; ARM32-LABEL: shl64BitSignedTrunc
    600 ; ARM32: lsl r
    601 
    602 ; MIPS32-LABEL: shl64BitSignedTrunc
    603 ; MIPS32-O2: 	sllv
    604 ; MIPS32-O2: 	andi	{{.*}},0x20
    605 ; MIPS32-O2: 	movn
    606 
    607 define internal i64 @shl64BitUnsigned(i64 %a, i64 %b) {
    608 entry:
    609   %shl = shl i64 %a, %b
    610   ret i64 %shl
    611 }
    612 ; CHECK-LABEL: shl64BitUnsigned
    613 ; CHECK: shld
    614 ; CHECK: shl e
    615 ; CHECK: test {{.*}},0x20
    616 ; CHECK: je
    617 ;
    618 ; OPTM1-LABEL: shl64BitUnsigned
    619 ; OPTM1: shld
    620 ; OPTM1: shl e
    621 ; OPTM1: test {{.*}},0x20
    622 ; OPTM1: je
    623 
    624 ; ARM32-LABEL: shl64BitUnsigned
    625 ; ARM32: rsb
    626 ; ARM32: lsr
    627 ; ARM32: orr
    628 ; ARM32: sub
    629 ; ARM32: cmp
    630 ; ARM32: lslge
    631 ; ARM32: lsl
    632 
    633 ; MIPS32-LABEL: shl64BitUnsigned
    634 ; MIPS32: sllv  [[T1:.*]],[[A_HI:.*]],[[B_LO:.*]]
    635 ; MIPS32: nor   [[T2:.*]],[[B_LO]],zero
    636 ; MIPS32: srl   [[T3:.*]],[[A_LO:.*]],0x1
    637 ; MIPS32: srlv  [[T4:.*]],[[T3]],[[T2]]
    638 ; MIPS32: or    [[T_HI:.*]],[[T1]],[[T4]]
    639 ; MIPS32: sllv  [[T_LO:.*]],[[A_LO]],[[B_LO]]
    640 ; MIPS32: move  [[T1_LO:.*]],[[T_LO]]
    641 ; MIPS32: andi  [[T5:.*]],[[B_LO]],0x20
    642 ; MIPS32: movn  [[T_HI]],[[T_LO]],[[T5]]
    643 ; MIPS32: movn  [[T1_LO]],zero,[[T5]]
    644 ; MIPS32-O2: move       v1,[[T_HI]]
    645 ; MIPS32-OM1: sw        [[T_HI]],[[MEM:.*]]
    646 ; MIPS32-OM1: lw        v1,[[MEM]]
    647 
    648 define internal i64 @shr64BitSigned(i64 %a, i64 %b) {
    649 entry:
    650   %shr = ashr i64 %a, %b
    651   ret i64 %shr
    652 }
    653 ; CHECK-LABEL: shr64BitSigned
    654 ; CHECK: shrd
    655 ; CHECK: sar
    656 ; CHECK: test {{.*}},0x20
    657 ; CHECK: je
    658 ; CHECK: sar {{.*}},0x1f
    659 ;
    660 ; OPTM1-LABEL: shr64BitSigned
    661 ; OPTM1: shrd
    662 ; OPTM1: sar
    663 ; OPTM1: test {{.*}},0x20
    664 ; OPTM1: je
    665 ; OPTM1: sar {{.*}},0x1f
    666 
    667 ; ARM32-LABEL: shr64BitSigned
    668 ; ARM32: lsr     [[T0:r[0-9]+]], r{{[0-9]+}}, r{{[0-9]+}}
    669 ; ARM32: rsb     [[T1:r[0-9]+]], r{{[0-9]+}}, #32
    670 ; ARM32: orr     r{{[0-9]+}}, [[T0]], r{{[0-9]+}}, lsl [[T1]]
    671 ; ARM32: sub     [[T2:r[0-9]+]], r{{[0-9]+}}, #32
    672 ; ARM32: cmp     [[T2]], #0
    673 ; ARM32: asrge   r{{[0-9]+}}, r{{[0-9]+}}, [[T2]]
    674 ; ARM32: asr     r{{[0-9]+}}, r{{[0-9]+}}, r{{[0-9]+}}
    675 
    676 ; MIPS32-LABEL: shr64BitSigned
    677 ; MIPS32: srlv	[[T1:.*]],[[A_LO:.*]],[[B_LO:.*]]
    678 ; MIPS32: nor	[[T2:.*]],[[B_LO]],zero
    679 ; MIPS32: sll	[[T3:.*]],[[A_HI:.*]],0x1
    680 ; MIPS32: sllv	[[T4:.*]],[[T3]],[[T2]]
    681 ; MIPS32: or	[[T_LO:.*]],[[T1]],[[T4]]
    682 ; MIPS32: srav	[[T_HI:.*]],[[A_HI]],[[B_LO]]
    683 ; MIPS32: move	[[T_HI1:.*]],[[T_HI]]
    684 ; MIPS32: andi	[[T5:.*]],[[B_LO]],0x20
    685 ; MIPS32: movn	[[T_LO1:.*]],[[T_HI]],[[T5]]
    686 ; MIPS32: sra	[[T6:.*]],[[A_HI]],0x1f
    687 ; MIPS32: movn	[[T_HI1]],[[T6]],[[T5]]
    688 
    689 define internal i32 @shr64BitSignedTrunc(i64 %a, i64 %b) {
    690 entry:
    691   %shr = ashr i64 %a, %b
    692   %result = trunc i64 %shr to i32
    693   ret i32 %result
    694 }
    695 ; CHECK-LABEL: shr64BitSignedTrunc
    696 ; CHECK: shrd
    697 ; CHECK: sar
    698 ; CHECK: test {{.*}},0x20
    699 ; CHECK: je
    700 ;
    701 ; OPTM1-LABEL: shr64BitSignedTrunc
    702 ; OPTM1: shrd
    703 ; OPTM1: sar
    704 ; OPTM1: test {{.*}},0x20
    705 ; OPTM1: je
    706 ; OPTM1: sar {{.*}},0x1f
    707 
    708 ; ARM32-LABEL: shr64BitSignedTrunc
    709 ; ARM32: lsr
    710 ; ARM32: rsb
    711 ; ARM32: orr
    712 ; ARM32: sub
    713 ; ARM32: cmp
    714 ; ARM32: asrge
    715 
    716 ; MIPS32-LABEL: shr64BitSignedTrunc
    717 ; MIPS32-O2: 	srlv
    718 ; MIPS32-O2: 	nor
    719 ; MIPS32-O2: 	sll
    720 ; MIPS32-O2: 	sllv
    721 ; MIPS32-O2: 	or
    722 ; MIPS32-O2: 	srav
    723 ; MIPS32-O2: 	andi	{{.*}},0x20
    724 ; MIPS32-O2: 	movn
    725 
    726 define internal i64 @shr64BitUnsigned(i64 %a, i64 %b) {
    727 entry:
    728   %shr = lshr i64 %a, %b
    729   ret i64 %shr
    730 }
    731 ; CHECK-LABEL: shr64BitUnsigned
    732 ; CHECK: shrd
    733 ; CHECK: shr
    734 ; CHECK: test {{.*}},0x20
    735 ; CHECK: je
    736 ;
    737 ; OPTM1-LABEL: shr64BitUnsigned
    738 ; OPTM1: shrd
    739 ; OPTM1: shr
    740 ; OPTM1: test {{.*}},0x20
    741 ; OPTM1: je
    742 
    743 ; ARM32-LABEL: shr64BitUnsigned
    744 ; ARM32: lsr
    745 ; ARM32: rsb
    746 ; ARM32: orr
    747 ; ARM32: sub
    748 ; ARM32: cmp
    749 ; ARM32: lsrge
    750 ; ARM32: lsr
    751 
    752 ; MIPS32-LABEL: shr64BitUnsigned
    753 ; MIPS32: srlv  [[T1:.*]],[[A_LO:.*]],[[B_LO:.*]]
    754 ; MIPS32: nor   [[T2:.*]],[[B_LO]],zero
    755 ; MIPS32: sll   [[T3:.*]],[[A_HI:.*]],0x1
    756 ; MIPS32: sllv  [[T4:.*]],[[T3]],[[T2]]
    757 ; MIPS32: or    [[T_LO:.*]],[[T1]],[[T4]]
    758 ; MIPS32: srlv  [[T_HI:.*]],[[A_HI]],[[B_LO]]
    759 ; MIPS32: move  [[T_HI1:.*]],[[T_HI]]
    760 ; MIPS32: andi  [[T5:.*]],[[B_LO]],0x20
    761 ; MIPS32: movn  [[T_LO1:.*]],[[T_HI]],[[T5]]
    762 ; MIPS32: movn  [[T_HI1]],zero,[[T5]]
    763 
    764 define internal i32 @shr64BitUnsignedTrunc(i64 %a, i64 %b) {
    765 entry:
    766   %shr = lshr i64 %a, %b
    767   %result = trunc i64 %shr to i32
    768   ret i32 %result
    769 }
    770 ; CHECK-LABEL: shr64BitUnsignedTrunc
    771 ; CHECK: shrd
    772 ; CHECK: shr
    773 ; CHECK: test {{.*}},0x20
    774 ; CHECK: je
    775 ;
    776 ; OPTM1-LABEL: shr64BitUnsignedTrunc
    777 ; OPTM1: shrd
    778 ; OPTM1: shr
    779 ; OPTM1: test {{.*}},0x20
    780 ; OPTM1: je
    781 
    782 ; ARM32-LABEL: shr64BitUnsignedTrunc
    783 ; ARM32: lsr
    784 ; ARM32: rsb
    785 ; ARM32: orr
    786 ; ARM32: sub
    787 ; ARM32: cmp
    788 ; ARM32: lsrge
    789 
    790 ; MIPS32-LABEL: shr64BitUnsignedTrunc
    791 ; MIPS32-O2: 	srlv
    792 ; MIPS32-O2: 	nor
    793 ; MIPS32-O2: 	sll
    794 ; MIPS32-O2: 	sllv
    795 ; MIPS32-O2: 	or
    796 ; MIPS32-O2: 	srlv
    797 ; MIPS32-O2: 	andi
    798 ; MIPS32-O2: 	movn
    799 
    800 define internal i64 @and64BitSigned(i64 %a, i64 %b) {
    801 entry:
    802   %and = and i64 %b, %a
    803   ret i64 %and
    804 }
    805 ; CHECK-LABEL: and64BitSigned
    806 ; CHECK: and
    807 ; CHECK: and
    808 ;
    809 ; OPTM1-LABEL: and64BitSigned
    810 ; OPTM1: and
    811 ; OPTM1: and
    812 
    813 ; ARM32-LABEL: and64BitSigned
    814 ; ARM32: and
    815 ; ARM32: and
    816 
    817 ; MIPS32-LABEL: and64BitSigned
    818 ; MIPS32: and
    819 ; MIPS32: and
    820 
    821 define internal i64 @and64BitUnsigned(i64 %a, i64 %b) {
    822 entry:
    823   %and = and i64 %b, %a
    824   ret i64 %and
    825 }
    826 ; CHECK-LABEL: and64BitUnsigned
    827 ; CHECK: and
    828 ; CHECK: and
    829 ;
    830 ; OPTM1-LABEL: and64BitUnsigned
    831 ; OPTM1: and
    832 ; OPTM1: and
    833 
    834 ; ARM32-LABEL: and64BitUnsigned
    835 ; ARM32: and
    836 ; ARM32: and
    837 
    838 ; MIPS32-LABEL: and64BitUnsigned
    839 ; MIPS32: and
    840 ; MIPS32: and
    841 
    842 define internal i64 @or64BitSigned(i64 %a, i64 %b) {
    843 entry:
    844   %or = or i64 %b, %a
    845   ret i64 %or
    846 }
    847 ; CHECK-LABEL: or64BitSigned
    848 ; CHECK: or
    849 ; CHECK: or
    850 ;
    851 ; OPTM1-LABEL: or64BitSigned
    852 ; OPTM1: or
    853 ; OPTM1: or
    854 
    855 ; ARM32-LABEL: or64BitSigned
    856 ; ARM32: orr
    857 ; ARM32: orr
    858 
    859 ; MIPS32-LABEL: or64BitSigned
    860 ; MIPS32: or
    861 ; MIPS32: or
    862 
    863 define internal i64 @or64BitUnsigned(i64 %a, i64 %b) {
    864 entry:
    865   %or = or i64 %b, %a
    866   ret i64 %or
    867 }
    868 ; CHECK-LABEL: or64BitUnsigned
    869 ; CHECK: or
    870 ; CHECK: or
    871 ;
    872 ; OPTM1-LABEL: or64BitUnsigned
    873 ; OPTM1: or
    874 ; OPTM1: or
    875 
    876 ; ARM32-LABEL: or64BitUnsigned
    877 ; ARM32: orr
    878 ; ARM32: orr
    879 
    880 ; MIPS32-LABEL: or64BitUnsigned
    881 ; MIPS32: or
    882 ; MIPS32: or
    883 
    884 define internal i64 @xor64BitSigned(i64 %a, i64 %b) {
    885 entry:
    886   %xor = xor i64 %b, %a
    887   ret i64 %xor
    888 }
    889 ; CHECK-LABEL: xor64BitSigned
    890 ; CHECK: xor
    891 ; CHECK: xor
    892 ;
    893 ; OPTM1-LABEL: xor64BitSigned
    894 ; OPTM1: xor
    895 ; OPTM1: xor
    896 
    897 ; ARM32-LABEL: xor64BitSigned
    898 ; ARM32: eor
    899 ; ARM32: eor
    900 
    901 ; MIPS32-LABEL: xor64BitSigned
    902 ; MIPS32: xor
    903 ; MIPS32: xor
    904 
    905 define internal i64 @xor64BitUnsigned(i64 %a, i64 %b) {
    906 entry:
    907   %xor = xor i64 %b, %a
    908   ret i64 %xor
    909 }
    910 ; CHECK-LABEL: xor64BitUnsigned
    911 ; CHECK: xor
    912 ; CHECK: xor
    913 ;
    914 ; OPTM1-LABEL: xor64BitUnsigned
    915 ; OPTM1: xor
    916 ; OPTM1: xor
    917 
    918 ; ARM32-LABEL: xor64BitUnsigned
    919 ; ARM32: eor
    920 ; ARM32: eor
    921 
    922 ; MIPS32-LABEL: xor64BitUnsigned
    923 ; MIPS32: xor
    924 ; MIPS32: xor
    925 
    926 define internal i32 @trunc64To32Signed(i64 %padding, i64 %a) {
    927 entry:
    928   %conv = trunc i64 %a to i32
    929   ret i32 %conv
    930 }
    931 ; CHECK-LABEL: trunc64To32Signed
    932 ; CHECK: mov     eax,DWORD PTR [esp+0xc]
    933 ;
    934 ; OPTM1-LABEL: trunc64To32Signed
    935 ; OPTM1: mov     eax,DWORD PTR [esp+
    936 
    937 ; ARM32-LABEL: trunc64To32Signed
    938 ; ARM32: mov r0, r2
    939 
    940 ; MIPS32-LABEL: trunc64To32Signed
    941 ; MIPS32: move v0,a2
    942 
    943 define internal i32 @trunc64To16Signed(i64 %a) {
    944 entry:
    945   %conv = trunc i64 %a to i16
    946   %conv.ret_ext = sext i16 %conv to i32
    947   ret i32 %conv.ret_ext
    948 }
    949 ; CHECK-LABEL: trunc64To16Signed
    950 ; CHECK:      mov     eax,DWORD PTR [esp+0x4]
    951 ; CHECK-NEXT: movsx  eax,ax
    952 ;
    953 ; OPTM1-LABEL: trunc64To16Signed
    954 ; OPTM1:      mov     ax,WORD PTR [esp+
    955 ; OPTM1: movsx  eax,
    956 
    957 ; ARM32-LABEL: trunc64To16Signed
    958 ; ARM32: sxth r0, r0
    959 
    960 ; MIPS32-LABEL: trunc64To16Signed
    961 ; MIPS32-O2: sll [[T1:.*]],a0,0x10
    962 ; MIPS32-O2: sra [[T2:.*]],[[T1]],0x10
    963 ; MIPS32-O2: move v0,[[T2]]
    964 ; MIPS32-OM1: sll [[T1:.*]],{{.*}},0x10
    965 ; MIPS32-OM1: sra [[T2:.*]],[[T1]],0x10
    966 ; MIPS32-OM1: sw [[T2]],[[MEM:.*]]
    967 ; MIPS32-OM1: lw v0,[[MEM]]
    968 
    969 define internal i32 @trunc64To8Signed(i64 %a) {
    970 entry:
    971   %conv = trunc i64 %a to i8
    972   %conv.ret_ext = sext i8 %conv to i32
    973   ret i32 %conv.ret_ext
    974 }
    975 ; CHECK-LABEL: trunc64To8Signed
    976 ; CHECK:      mov     eax,DWORD PTR [esp+0x4]
    977 ; CHECK-NEXT: movsx  eax,al
    978 ;
    979 ; OPTM1-LABEL: trunc64To8Signed
    980 ; OPTM1:      mov     eax,DWORD PTR [esp+
    981 ; OPTM1: movsx  eax,
    982 
    983 ; ARM32-LABEL: trunc64To8Signed
    984 ; ARM32: sxtb r0, r0
    985 
    986 ; MIPS32-LABEL: trunc64To8Signed
    987 ; MIPS32-O2: sll [[T1:.*]],a0,0x18
    988 ; MIPS32-O2: sra [[T2:.*]],[[T1]],0x18
    989 ; MIPS32-O2: move v0,[[T2]]
    990 ; MIPS32-OM1: sll [[T1:.*]],{{.*}},0x18
    991 ; MIPS32-OM1: sra [[T2:.*]],[[T1]],0x18
    992 ; MIPS32-OM1: sw [[T2]],[[MEM:.*]]
    993 ; MIPS32-OM1: lw v0,[[MEM]]
    994 
    995 define internal i32 @trunc64To32SignedConst() {
    996 entry:
    997   %conv = trunc i64 12345678901234 to i32
    998   ret i32 %conv
    999 }
   1000 ; CHECK-LABEL: trunc64To32SignedConst
   1001 ; CHECK: mov eax,0x73ce2ff2
   1002 ;
   1003 ; OPTM1-LABEL: trunc64To32SignedConst
   1004 ; OPTM1: mov eax,0x73ce2ff2
   1005 
   1006 ; ARM32-LABEL: trunc64To32SignedConst
   1007 ; ARM32: movw r0, #12274 ; 0x2ff2
   1008 ; ARM32: movt r0, #29646 ; 0x73ce
   1009 
   1010 ; MIPS32-LABEL: trunc64To32SignedConst
   1011 ; MIPS32: lui v0,0x73ce
   1012 ; MIPS32: ori v0,v0,0x2ff2
   1013 
   1014 define internal i32 @trunc64To16SignedConst() {
   1015 entry:
   1016   %conv = trunc i64 12345678901234 to i16
   1017   %conv.ret_ext = sext i16 %conv to i32
   1018   ret i32 %conv.ret_ext
   1019 }
   1020 ; CHECK-LABEL: trunc64To16SignedConst
   1021 ; CHECK: mov eax,0x73ce2ff2
   1022 ; CHECK: movsx eax,ax
   1023 ;
   1024 ; OPTM1-LABEL: trunc64To16SignedConst
   1025 ; OPTM1: mov eax,0x73ce2ff2
   1026 ; OPTM1: movsx eax,
   1027 
   1028 ; ARM32-LABEL: trunc64To16SignedConst
   1029 ; ARM32: movw r0, #12274 ; 0x2ff2
   1030 ; ARM32: movt r0, #29646 ; 0x73ce
   1031 ; ARM32: sxth r0, r0
   1032 
   1033 ; MIPS32-LABEL: trunc64To16SignedConst
   1034 ; MIPS32: lui v0,0x73ce
   1035 ; MIPS32: ori v0,v0,0x2ff2
   1036 ; MIPS32: sll v0,v0,0x10
   1037 ; MIPS32: sra v0,v0,0x10
   1038 
   1039 define internal i32 @trunc64To32Unsigned(i64 %padding, i64 %a) {
   1040 entry:
   1041   %conv = trunc i64 %a to i32
   1042   ret i32 %conv
   1043 }
   1044 ; CHECK-LABEL: trunc64To32Unsigned
   1045 ; CHECK: mov     eax,DWORD PTR [esp+0xc]
   1046 ;
   1047 ; OPTM1-LABEL: trunc64To32Unsigned
   1048 ; OPTM1: mov     eax,DWORD PTR [esp+
   1049 
   1050 ; ARM32-LABEL: trunc64To32Unsigned
   1051 ; ARM32: mov r0, r2
   1052 
   1053 ; MIPS32-LABEL: trunc64To32Unsigned
   1054 ; MIPS32: move v0,a2
   1055 
   1056 define internal i32 @trunc64To16Unsigned(i64 %a) {
   1057 entry:
   1058   %conv = trunc i64 %a to i16
   1059   %conv.ret_ext = zext i16 %conv to i32
   1060   ret i32 %conv.ret_ext
   1061 }
   1062 ; CHECK-LABEL: trunc64To16Unsigned
   1063 ; CHECK:      mov     eax,DWORD PTR [esp+0x4]
   1064 ; CHECK-NEXT: movzx  eax,ax
   1065 ;
   1066 ; OPTM1-LABEL: trunc64To16Unsigned
   1067 ; OPTM1:      mov     ax,WORD PTR [esp+
   1068 ; OPTM1: movzx  eax,
   1069 
   1070 ; ARM32-LABEL: trunc64To16Unsigned
   1071 ; ARM32: uxth
   1072 
   1073 ; MIPS32-LABEL: trunc64To16Unsigned
   1074 ; MIPS32-O2: andi [[T1:.*]],a0,0xffff
   1075 ; MIPS32-O2: move v0,[[T1]]
   1076 ; MIPS32-OM1: andi [[T1:.*]],{{.*}},0xffff
   1077 ; MIPS32-OM1: sw [[T1]],[[MEM:.*]]
   1078 ; MIPS32-OM1: lw v0,[[MEM]]
   1079 
   1080 define internal i32 @trunc64To8Unsigned(i64 %a) {
   1081 entry:
   1082   %conv = trunc i64 %a to i8
   1083   %conv.ret_ext = zext i8 %conv to i32
   1084   ret i32 %conv.ret_ext
   1085 }
   1086 ; CHECK-LABEL: trunc64To8Unsigned
   1087 ; CHECK:      mov     eax,DWORD PTR [esp+0x4]
   1088 ; CHECK-NEXT: movzx  eax,al
   1089 ;
   1090 ; OPTM1-LABEL: trunc64To8Unsigned
   1091 ; OPTM1: mov    eax,DWORD PTR [esp+
   1092 ; OPTM1: movzx  eax,
   1093 
   1094 ; ARM32-LABEL: trunc64To8Unsigned
   1095 ; ARM32: uxtb
   1096 
   1097 ; MIPS32-LABEL: trunc64To8Unsigned
   1098 ; MIPS32-O2: andi [[T1:.*]],a0,0xff
   1099 ; MIPS32-O2: move v0,[[T1]]
   1100 ; MIPS32-OM1: andi [[T1:.*]],{{.*}},0xff
   1101 ; MIPS32-OM1: sw [[T1]],[[MEM:.*]]
   1102 ; MIPS32-OM1: lw v0,[[MEM]]
   1103 
   1104 define internal i32 @trunc64To1(i64 %a) {
   1105 entry:
   1106 ;  %tobool = icmp ne i64 %a, 0
   1107   %tobool = trunc i64 %a to i1
   1108   %tobool.ret_ext = zext i1 %tobool to i32
   1109   ret i32 %tobool.ret_ext
   1110 }
   1111 ; CHECK-LABEL: trunc64To1
   1112 ; CHECK:      mov     eax,DWORD PTR [esp+0x4]
   1113 ; CHECK:      and     al,0x1
   1114 ; CHECK-NOT:  and     eax,0x1
   1115 ;
   1116 ; OPTM1-LABEL: trunc64To1
   1117 ; OPTM1:      mov     eax,DWORD PTR [esp+
   1118 ; OPTM1:      and     al,0x1
   1119 ; OPTM1-NOT:  and     eax,0x1
   1120 
   1121 ; ARM32-LABEL: trunc64To1
   1122 ; ARM32-OM1: and r0, r0, #1
   1123 ; ARM32-O2: and r0, r0, #1
   1124 
   1125 ; MIPS32-LABEL: trunc64To1
   1126 ; MIPS32-O2: andi [[T1:.*]],a0,0x1
   1127 ; MIPS32-O2: move v0,[[T1]]
   1128 ; MIPS32-OM1: andi [[T1:.*]],{{.*}},0x1
   1129 ; MIPS32-OM1: sw [[T1]],[[MEM:.*]]
   1130 ; MIPS32-OM1: lw v0,[[MEM]]
   1131 
   1132 define internal i64 @sext32To64(i32 %a) {
   1133 entry:
   1134   %conv = sext i32 %a to i64
   1135   ret i64 %conv
   1136 }
   1137 ; CHECK-LABEL: sext32To64
   1138 ; CHECK: mov
   1139 ; CHECK: sar {{.*}},0x1f
   1140 ;
   1141 ; OPTM1-LABEL: sext32To64
   1142 ; OPTM1: mov
   1143 ; OPTM1: sar {{.*}},0x1f
   1144 
   1145 ; ARM32-LABEL: sext32To64
   1146 ; ARM32: asr {{.*}}, #31
   1147 
   1148 ; MIPS32-LABEL: sext32To64
   1149 ; MIPS32: sra [[T_HI:.*]],[[T_LO:.*]],0x1f
   1150 ; MIPS32-O2: move v1,[[T_HI]]
   1151 ; MIPS32-O2: move v0,[[T_LO]]
   1152 ; MIPS32-OM1: sw [[T_HI]],[[MEM_HI:.*]]
   1153 ; MIPS32-OM1: sw [[T_LO]],[[MEM_LO:.*]]
   1154 ; MIPS32-OM1: lw v0,[[MEM_LO]]
   1155 ; MIPS32-OM1: lw v1,[[MEM_HI]]
   1156 
   1157 define internal i64 @sext16To64(i32 %a) {
   1158 entry:
   1159   %a.arg_trunc = trunc i32 %a to i16
   1160   %conv = sext i16 %a.arg_trunc to i64
   1161   ret i64 %conv
   1162 }
   1163 ; CHECK-LABEL: sext16To64
   1164 ; CHECK: movsx
   1165 ; CHECK: sar {{.*}},0x1f
   1166 ;
   1167 ; OPTM1-LABEL: sext16To64
   1168 ; OPTM1: movsx
   1169 ; OPTM1: sar {{.*}},0x1f
   1170 
   1171 ; ARM32-LABEL: sext16To64
   1172 ; ARM32: sxth
   1173 ; ARM32: asr {{.*}}, #31
   1174 
   1175 ; MIPS32-LABEL: sext16To64
   1176 ; MIPS32: sll [[T1_LO:.*]],{{.*}},0x10
   1177 ; MIPS32: sra [[T2_LO:.*]],[[T1_LO]],0x10
   1178 ; MIPS32: sra [[T_HI:.*]],[[T2_LO]],0x1f
   1179 ; MIPS32-O2: move v1,[[T_HI]]
   1180 ; MIPS32-O2: move v0,[[T2_LO]]
   1181 ; MIPS32-OM1: sw [[T_HI]],[[MEM_HI:.*]]
   1182 ; MIPS32-OM1: sw [[T2_LO]],[[MEM_LO:.*]]
   1183 ; MIPS32-OM1: lw v0,[[MEM_LO]]
   1184 ; MIPS32-OM1: lw v1,[[MEM_HI]]
   1185 
   1186 
   1187 define internal i64 @sext8To64(i32 %a) {
   1188 entry:
   1189   %a.arg_trunc = trunc i32 %a to i8
   1190   %conv = sext i8 %a.arg_trunc to i64
   1191   ret i64 %conv
   1192 }
   1193 ; CHECK-LABEL: sext8To64
   1194 ; CHECK: movsx
   1195 ; CHECK: sar {{.*}},0x1f
   1196 ;
   1197 ; OPTM1-LABEL: sext8To64
   1198 ; OPTM1: movsx
   1199 ; OPTM1: sar {{.*}},0x1f
   1200 
   1201 ; ARM32-LABEL: sext8To64
   1202 ; ARM32: sxtb
   1203 ; ARM32: asr {{.*}}, #31
   1204 
   1205 ; MIPS32-LABEL: sext8To64
   1206 ; MIPS32: sll [[T1_LO:.*]],{{.*}},0x18
   1207 ; MIPS32: sra [[T2_LO:.*]],[[T1_LO]],0x18
   1208 ; MIPS32: sra [[T_HI:.*]],[[T2_LO]],0x1f
   1209 ; MIPS32-O2: move v1,[[T_HI]]
   1210 ; MIPS32-O2: move v0,[[T2_LO]]
   1211 ; MIPS32-OM1: sw [[T_HI]],[[MEM_HI:.*]]
   1212 ; MIPS32-OM1: sw [[T2_LO]],[[MEM_LO:.*]]
   1213 ; MIPS32-OM1: lw v0,[[MEM_LO]]
   1214 ; MIPS32-OM1: lw v1,[[MEM_HI]]
   1215 
   1216 define internal i64 @sext1To64(i32 %a) {
   1217 entry:
   1218   %a.arg_trunc = trunc i32 %a to i1
   1219   %conv = sext i1 %a.arg_trunc to i64
   1220   ret i64 %conv
   1221 }
   1222 ; CHECK-LABEL: sext1To64
   1223 ; CHECK: mov
   1224 ; CHECK: shl {{.*}},0x1f
   1225 ; CHECK: sar {{.*}},0x1f
   1226 ;
   1227 ; OPTM1-LABEL: sext1To64
   1228 ; OPTM1: mov
   1229 ; OPTM1: shl {{.*}},0x1f
   1230 ; OPTM1: sar {{.*}},0x1f
   1231 
   1232 ; ARM32-LABEL: sext1To64
   1233 ; ARM32: mov {{.*}}, #0
   1234 ; ARM32: tst {{.*}}, #1
   1235 ; ARM32: mvn {{.*}}, #0
   1236 ; ARM32: movne
   1237 
   1238 ; MIPS32-LABEL: sext1To64
   1239 ; MIPS32: sll [[T1:.*]],{{.*}},0x1f
   1240 ; MIPS32: sra [[T2:.*]],[[T1]],0x1f
   1241 ; MIPS32-O2: move v1,[[T2]]
   1242 ; MIPS32-O2: move v0,[[T2]]
   1243 ; MIPS32-OM1: sw [[T2]],[[MEM_HI:.*]]
   1244 ; MIPS32-OM1: sw [[T2]],[[MEM_LO:.*]]
   1245 ; MIPS32-OM1: lw v0,[[MEM_LO]]
   1246 ; MIPS32-OM1: lw v1,[[MEM_HI]]
   1247 
   1248 define internal i64 @zext32To64(i32 %a) {
   1249 entry:
   1250   %conv = zext i32 %a to i64
   1251   ret i64 %conv
   1252 }
   1253 ; CHECK-LABEL: zext32To64
   1254 ; CHECK: mov
   1255 ; CHECK: mov {{.*}},0x0
   1256 ;
   1257 ; OPTM1-LABEL: zext32To64
   1258 ; OPTM1: mov
   1259 ; OPTM1: mov {{.*}},0x0
   1260 
   1261 ; ARM32-LABEL: zext32To64
   1262 ; ARM32: mov {{.*}}, #0
   1263 
   1264 ; MIPS32-LABEL: zext32To64
   1265 ; MIPS32: li [[T1:.*]],0
   1266 ; MIPS32-O2: move v1,[[T1]]
   1267 ; MIPS32-O2: move v0,a0
   1268 ; MIPS32-OM1: sw [[T1]],[[MEM_HI:.*]]
   1269 ; MIPS32-OM1: lw v1,[[MEM_HI]]
   1270 
   1271 define internal i64 @zext16To64(i32 %a) {
   1272 entry:
   1273   %a.arg_trunc = trunc i32 %a to i16
   1274   %conv = zext i16 %a.arg_trunc to i64
   1275   ret i64 %conv
   1276 }
   1277 ; CHECK-LABEL: zext16To64
   1278 ; CHECK: movzx
   1279 ; CHECK: mov {{.*}},0x0
   1280 ;
   1281 ; OPTM1-LABEL: zext16To64
   1282 ; OPTM1: movzx
   1283 ; OPTM1: mov {{.*}},0x0
   1284 
   1285 ; ARM32-LABEL: zext16To64
   1286 ; ARM32: uxth
   1287 ; ARM32: mov {{.*}}, #0
   1288 
   1289 ; MIPS32-LABEL: zext16To64
   1290 ; MIPS32: andi [[T_LO:.*]],{{.*}},0xffff
   1291 ; MIPS32: li [[T_HI:.*]],0
   1292 ; MIPS32-O2: move v1,[[T_HI]]
   1293 ; MIPS32-O2: move v0,[[T_LO]]
   1294 ; MIPS32-OM1: sw [[T_HI]],[[MEM_HI:.*]]
   1295 ; MIPS32-OM1: lw v1,[[MEM_HI]]
   1296 
   1297 define internal i64 @zext8To64(i32 %a) {
   1298 entry:
   1299   %a.arg_trunc = trunc i32 %a to i8
   1300   %conv = zext i8 %a.arg_trunc to i64
   1301   ret i64 %conv
   1302 }
   1303 ; CHECK-LABEL: zext8To64
   1304 ; CHECK: movzx
   1305 ; CHECK: mov {{.*}},0x0
   1306 ;
   1307 ; OPTM1-LABEL: zext8To64
   1308 ; OPTM1: movzx
   1309 ; OPTM1: mov {{.*}},0x0
   1310 
   1311 ; ARM32-LABEL: zext8To64
   1312 ; ARM32: uxtb
   1313 ; ARM32: mov {{.*}}, #0
   1314 
   1315 ; MIPS32-LABEL: zext8To64
   1316 ; MIPS32: andi [[T_LO:.*]],{{.*}},0xff
   1317 ; MIPS32: li [[T_HI:.*]],0
   1318 ; MIPS32-O2: move v1,[[T_HI]]
   1319 ; MIPS32-O2: move v0,[[T_LO]]
   1320 ; MIPS32-OM1: sw [[T_HI]],[[MEM_HI:.*]]
   1321 ; MIPS32-OM1: lw v1,[[MEM_HI]]
   1322 
   1323 define internal i64 @zext1To64(i32 %a) {
   1324 entry:
   1325   %a.arg_trunc = trunc i32 %a to i1
   1326   %conv = zext i1 %a.arg_trunc to i64
   1327   ret i64 %conv
   1328 }
   1329 ; CHECK-LABEL: zext1To64
   1330 ; CHECK: and {{.*}},0x1
   1331 ; CHECK: mov {{.*}},0x0
   1332 ;
   1333 ; OPTM1-LABEL: zext1To64
   1334 ; OPTM1: and {{.*}},0x1
   1335 ; OPTM1: mov {{.*}},0x0
   1336 
   1337 ; ARM32-LABEL: zext1To64
   1338 ; ARM32: and {{.*}}, #1
   1339 ; ARM32: mov {{.*}}, #0
   1340 ; ARM32: bx
   1341 
   1342 ; MIPS32-LABEL: zext1To64
   1343 ; MIPS32: andi [[T_LO:.*]],{{.*}},0x1
   1344 ; MIPS32: li [[T_HI:.*]],0
   1345 ; MIPS32-O2: move v1,[[T_HI]]
   1346 ; MIPS32-O2: move v0,[[T_LO]]
   1347 ; MIPS32-OM1: sw [[T_HI]],[[MEM_HI:.*]]
   1348 ; MIPS32-OM1: lw v1,[[MEM_HI]]
   1349 
   1350 define internal void @icmpEq64(i64 %a, i64 %b, i64 %c, i64 %d) {
   1351 entry:
   1352   %cmp = icmp eq i64 %a, %b
   1353   br i1 %cmp, label %if.then, label %if.end
   1354 
   1355 if.then:                                          ; preds = %entry
   1356   call void @func()
   1357   br label %if.end
   1358 
   1359 if.end:                                           ; preds = %if.then, %entry
   1360   %cmp1 = icmp eq i64 %c, %d
   1361   br i1 %cmp1, label %if.then2, label %if.end3
   1362 
   1363 if.then2:                                         ; preds = %if.end
   1364   call void @func()
   1365   br label %if.end3
   1366 
   1367 if.end3:                                          ; preds = %if.then2, %if.end
   1368   ret void
   1369 }
   1370 ; CHECK-LABEL: icmpEq64
   1371 ; CHECK: cmp {{.*}}
   1372 ; CHECK-NEXT: jne {{.*}}
   1373 ; CHECK-NEXT: cmp {{.*}}
   1374 ; CHECK-NEXT: jne {{.*}}
   1375 ; CHECK-NEXT: call {{.*}}
   1376 ; CHECK: cmp {{.*}}
   1377 ; CHECK-NEXT: jne {{.*}}
   1378 ; CHECK-NEXT: cmp {{.*}}
   1379 ; CHECK-NEXT: jne {{.*}}
   1380 ; CHECK-NEXT: call {{.*}}
   1381 ;
   1382 ; OPTM1-LABEL: icmpEq64
   1383 ; OPTM1: mov [[RESULT:.*]],0x1
   1384 ; OPTM1-NEXT: cmp {{.*}}
   1385 ; OPTM1-NEXT: jne {{.*}}
   1386 ; OPTM1-NEXT: cmp {{.*}}
   1387 ; OPTM1-NEXT: je {{.*}}
   1388 ; OPTM1-NEXT: mov [[RESULT]],0x0
   1389 ; OPTM1-NEXT: cmp [[RESULT]],0x0
   1390 ; OPTM1-NEXT: jne
   1391 ; OPTM1-NEXT: jmp
   1392 ; OPTM1-NEXT: call
   1393 ; OPTM1: mov [[RESULT:.*]],0x1
   1394 ; OPTM1-NEXT: cmp {{.*}}
   1395 ; OPTM1-NEXT: jne {{.*}}
   1396 ; OPTM1-NEXT: cmp {{.*}}
   1397 ; OPTM1-NEXT: je {{.*}}
   1398 ; OPTM1-NEXT: mov [[RESULT]],0x0
   1399 ; OPTM1-NEXT: cmp [[RESULT]],0x0
   1400 ; OPTM1-NEXT: jne
   1401 ; OPTM1-NEXT: jmp
   1402 ; OPTM1-NEXT: call
   1403 
   1404 ; ARM32-LABEL: icmpEq64
   1405 ; ARM32: cmp
   1406 ; ARM32: cmpeq
   1407 ; ARM32-OM1: tst
   1408 ; ARM32: bne
   1409 ; ARM32: bl {{.*}} <func>
   1410 ; ARM32: cmp
   1411 ; ARM32: cmpeq
   1412 ; ARM32-OM1: tst
   1413 ; ARM32: bne
   1414 ; ARM32: bl {{.*}} <func>
   1415 ; ARM32: bx
   1416 
   1417 ; MIPS32-LABEL: icmpEq64
   1418 ; MIPS32: xor [[T1:.*]],{{.*}},{{.*}}
   1419 ; MIPS32: xor [[T2:.*]],{{.*}},{{.*}}
   1420 ; MIPS32: or [[T3:.*]],[[T1]],[[T2]]
   1421 ; MIPS32-O2: bnez [[T3]],{{.*}}
   1422 ; MIPS32-OM1: sltiu [[T4:.*]],[[T3]],1
   1423 ; MIPS32-OM1: sw [[T4]],[[MEM:.*]]
   1424 ; MIPS32-OM1: lb [[T5:.*]],[[MEM]]
   1425 ; MIPS32-OM1: beqz [[T5]],{{.*}}
   1426 ; MIPS32-OM1: b {{.*}}
   1427 ; MIPS32: jal {{.*}}
   1428 ; MIPS32-OM1: b {{.*}}
   1429 ; MIPS32: xor [[T1:.*]],{{.*}},{{.*}}
   1430 ; MIPS32: xor [[T2:.*]],{{.*}},{{.*}}
   1431 ; MIPS32: or [[T3:.*]],[[T1]],[[T2]]
   1432 ; MIPS32-O2: bnez [[T3]],{{.*}}
   1433 ; MIPS32-OM1: sltiu [[T4:.*]],[[T3]],1
   1434 ; MIPS32-OM1: sw [[T4]],[[MEM:.*]]
   1435 ; MIPS32-OM1: lb [[T5:.*]],[[MEM]]
   1436 ; MIPS32-OM1: beqz [[T5]],{{.*}}
   1437 ; MIPS32-OM1: b {{.*}}
   1438 ; MIPS32: jal {{.*}}
   1439 ; MIPS32-OM1: b {{.*}}
   1440 
   1441 declare void @func()
   1442 
   1443 define internal void @icmpNe64(i64 %a, i64 %b, i64 %c, i64 %d) {
   1444 entry:
   1445   %cmp = icmp ne i64 %a, %b
   1446   br i1 %cmp, label %if.then, label %if.end
   1447 
   1448 if.then:                                          ; preds = %entry
   1449   call void @func()
   1450   br label %if.end
   1451 
   1452 if.end:                                           ; preds = %if.then, %entry
   1453   %cmp1 = icmp ne i64 %c, %d
   1454   br i1 %cmp1, label %if.then2, label %if.end3
   1455 
   1456 if.then2:                                         ; preds = %if.end
   1457   call void @func()
   1458   br label %if.end3
   1459 
   1460 if.end3:                                          ; preds = %if.end, %if.then2
   1461   ret void
   1462 }
   1463 ; CHECK-LABEL: icmpNe64
   1464 ; CHECK: cmp {{.*}}
   1465 ; CHECK-NEXT: jne {{.*}}
   1466 ; CHECK-NEXT: cmp {{.*}}
   1467 ; CHECK-NEXT: je {{.*}}
   1468 ; CHECK-NEXT: call {{.*}}
   1469 ; CHECK: cmp {{.*}}
   1470 ; CHECK-NEXT: jne {{.*}}
   1471 ; CHECK-NEXT: cmp {{.*}}
   1472 ; CHECK-NEXT: je {{.*}}
   1473 ; CHECK-NEXT: call {{.*}}
   1474 ;
   1475 ; OPTM1-LABEL: icmpNe64
   1476 ; OPTM1: mov [[RESULT:.*]],0x1
   1477 ; OPTM1-NEXT: cmp {{.*}}
   1478 ; OPTM1-NEXT: jne {{.*}}
   1479 ; OPTM1-NEXT: cmp {{.*}}
   1480 ; OPTM1-NEXT: jne {{.*}}
   1481 ; OPTM1-NEXT: mov [[RESULT:.*]],0x0
   1482 ; OPTM1-NEXT: cmp [[RESULT]],0x0
   1483 ; OPTM1-NEXT: jne {{.*}}
   1484 ; OPTM1-NEXT: jmp {{.*}}
   1485 ; OPTM1-NEXT: call
   1486 ; OPTM1: mov [[RESULT:.*]],0x1
   1487 ; OPTM1-NEXT: cmp {{.*}}
   1488 ; OPTM1-NEXT: jne {{.*}}
   1489 ; OPTM1-NEXT: cmp {{.*}}
   1490 ; OPTM1-NEXT: jne {{.*}}
   1491 ; OPTM1-NEXT: mov [[RESULT:.*]],0x0
   1492 ; OPTM1-NEXT: cmp [[RESULT]],0x0
   1493 ; OPTM1-NEXT: jne {{.*}}
   1494 ; OPTM1-NEXT: jmp {{.*}}
   1495 ; OPTM1-NEXT: call
   1496 
   1497 ; ARM32-LABEL: icmpNe64
   1498 ; ARM32: cmp
   1499 ; ARM32: cmpeq
   1500 ; ARM32-OM1: tst
   1501 ; ARM32-OM1: bne
   1502 ; ARM32-O2: beq
   1503 ; ARM32: bl {{.*}} <func>
   1504 ; ARM32: cmp
   1505 ; ARM32: cmpeq
   1506 ; ARM32-OM1: tst
   1507 ; ARM32-OM1: bne
   1508 ; ARM32-O2: beq
   1509 ; ARM32: bl
   1510 
   1511 ; MIPS32-LABEL: icmpNe64
   1512 ; MIPS32: xor [[T1:.*]],{{.*}},{{.*}}
   1513 ; MIPS32: xor [[T2:.*]],{{.*}},{{.*}}
   1514 ; MIPS32: or [[T3:.*]],[[T1]],[[T2]]
   1515 ; MIPS32-O2: beqz [[T3]],{{.*}}
   1516 ; MIPS32-OM1: sltu [[T4:.*]],zero,[[T3]]
   1517 ; MIPS32-OM1: sw [[T4]],[[MEM:.*]]
   1518 ; MIPS32-OM1: lb [[T5:.*]],[[MEM]]
   1519 ; MIPS32-OM1: beqz [[T5]],{{.*}}
   1520 ; MIPS32-OM1: b {{.*}}
   1521 ; MIPS32: jal {{.*}}
   1522 ; MIPS32-OM1: b {{.*}}
   1523 ; MIPS32: xor [[T1:.*]],{{.*}},{{.*}}
   1524 ; MIPS32: xor [[T2:.*]],{{.*}},{{.*}}
   1525 ; MIPS32: or [[T3:.*]],[[T1]],[[T2]]
   1526 ; MIPS32-O2: beqz [[T3]],{{.*}}
   1527 ; MIPS32-OM1: sltu [[T4:.*]],zero,[[T3]]
   1528 ; MIPS32-OM1: sw [[T4]],[[MEM:.*]]
   1529 ; MIPS32-OM1: lb [[T5:.*]],[[MEM]]
   1530 ; MIPS32-OM1: beqz [[T5]],{{.*}}
   1531 ; MIPS32-OM1: b {{.*}}
   1532 ; MIPS32: jal {{.*}}
   1533 ; MIPS32-OM1: b {{.*}}
   1534 
   1535 define internal void @icmpGt64(i64 %a, i64 %b, i64 %c, i64 %d) {
   1536 entry:
   1537   %cmp = icmp ugt i64 %a, %b
   1538   br i1 %cmp, label %if.then, label %if.end
   1539 
   1540 if.then:                                          ; preds = %entry
   1541   call void @func()
   1542   br label %if.end
   1543 
   1544 if.end:                                           ; preds = %if.then, %entry
   1545   %cmp1 = icmp sgt i64 %c, %d
   1546   br i1 %cmp1, label %if.then2, label %if.end3
   1547 
   1548 if.then2:                                         ; preds = %if.end
   1549   call void @func()
   1550   br label %if.end3
   1551 
   1552 if.end3:                                          ; preds = %if.then2, %if.end
   1553   ret void
   1554 }
   1555 ; CHECK-LABEL: icmpGt64
   1556 ; CHECK: ja
   1557 ; CHECK: jb
   1558 ; CHECK: jbe
   1559 ; CHECK: call
   1560 ; CHECK: jg
   1561 ; CHECK: jl
   1562 ; CHECK: jbe
   1563 ; CHECK: call
   1564 ;
   1565 ; OPTM1-LABEL: icmpGt64
   1566 ; OPTM1: ja
   1567 ; OPTM1: jb
   1568 ; OPTM1: ja
   1569 ; OPTM1: call
   1570 ; OPTM1: jg
   1571 ; OPTM1: jl
   1572 ; OPTM1: ja
   1573 ; OPTM1: call
   1574 
   1575 ; ARM32-LABEL: icmpGt64
   1576 ; ARM32: cmp
   1577 ; ARM32: cmpeq
   1578 ; ARM32-OM1: tst
   1579 ; ARM32-OM1: bne
   1580 ; ARM32-O2: bls
   1581 ; ARM32: bl
   1582 ; ARM32: cmp
   1583 ; ARM32: sbcs
   1584 ; ARM32-OM1: tst
   1585 ; ARM32-OM1: bne
   1586 ; ARM32-O2: bge
   1587 ; ARM32: bl
   1588 
   1589 ; MIPS32-LABEL: icmpGt64
   1590 ; MIPS32: xor [[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   1591 ; MIPS32-O2: sltu [[T2:.*]],[[B_HI]],[[A_HI]]
   1592 ; MIPS32-O2: xori [[T3:.*]],[[T2]],0x1
   1593 ; MIPS32-O2: sltu [[T4:.*]],{{.*}},{{.*}}
   1594 ; MIPS32-O2: xori [[T5:.*]],[[T4]],0x1
   1595 ; MIPS32-OM1: sltu [[T3:.*]],[[B_HI]],[[A_HI]]
   1596 ; MIPS32-OM1: sltu [[T5:.*]],{{.*}},{{.*}}
   1597 ; MIPS32: movz [[T3]],[[T5]],[[T1]]
   1598 ; MIPS32-O2: bnez [[T3]],{{.*}}
   1599 ; MIPS32-OM1: sw [[T3]],[[MEM:.*]]
   1600 ; MIPS32-OM1: lb [[T6:.*]],[[MEM]]
   1601 ; MIPS32-OM1: beqz [[T6]],{{.*}}
   1602 ; MIPS32-OM1: b {{.*}}
   1603 ; MIPS32: jal {{.*}}
   1604 ; MIPS32-OM1: b {{.*}}
   1605 ; MIPS32: xor [[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   1606 ; MIPS32-O2: slt [[T2:.*]],[[B_HI]],[[A_HI]]
   1607 ; MIPS32-O2: xori [[T3:.*]],[[T2]],0x1
   1608 ; MIPS32-O2: sltu [[T4:.*]],{{.*}},{{.*}}
   1609 ; MIPS32-O2: xori [[T5:.*]],[[T4]],0x1
   1610 ; MIPS32-OM1: slt [[T3:.*]],[[B_HI]],[[A_HI]]
   1611 ; MIPS32-OM1: sltu [[T5:.*]],{{.*}},{{.*}}
   1612 ; MIPS32: movz [[T3]],[[T5]],[[T1]]
   1613 ; MIPS32-O2: bnez [[T3]],{{.*}}
   1614 ; MIPS32-OM1: sw [[T3]],[[MEM:.*]]
   1615 ; MIPS32-OM1: lb [[T6:.*]],[[MEM]]
   1616 ; MIPS32-OM1: beqz [[T6]],{{.*}}
   1617 ; MIPS32-OM1: b {{.*}}
   1618 ; MIPS32: jal {{.*}}
   1619 ; MIPS32-OM1: b {{.*}}
   1620 
   1621 define internal void @icmpGe64(i64 %a, i64 %b, i64 %c, i64 %d) {
   1622 entry:
   1623   %cmp = icmp uge i64 %a, %b
   1624   br i1 %cmp, label %if.then, label %if.end
   1625 
   1626 if.then:                                          ; preds = %entry
   1627   call void @func()
   1628   br label %if.end
   1629 
   1630 if.end:                                           ; preds = %if.then, %entry
   1631   %cmp1 = icmp sge i64 %c, %d
   1632   br i1 %cmp1, label %if.then2, label %if.end3
   1633 
   1634 if.then2:                                         ; preds = %if.end
   1635   call void @func()
   1636   br label %if.end3
   1637 
   1638 if.end3:                                          ; preds = %if.end, %if.then2
   1639   ret void
   1640 }
   1641 ; CHECK-LABEL: icmpGe64
   1642 ; CHECK: ja
   1643 ; CHECK: jb
   1644 ; CHECK: jb
   1645 ; CHECK: call
   1646 ; CHECK: jg
   1647 ; CHECK: jl
   1648 ; CHECK: jb
   1649 ; CHECK: call
   1650 ;
   1651 ; OPTM1-LABEL: icmpGe64
   1652 ; OPTM1: ja
   1653 ; OPTM1: jb
   1654 ; OPTM1: jae
   1655 ; OPTM1: call
   1656 ; OPTM1: jg
   1657 ; OPTM1: jl
   1658 ; OPTM1: jae
   1659 ; OPTM1: call
   1660 
   1661 ; ARM32-LABEL: icmpGe64
   1662 ; ARM32: cmp
   1663 ; ARM32: cmpeq
   1664 ; ARM32-OM1: tst
   1665 ; ARM32-OM1: bne
   1666 ; ARM32-O2: bcc
   1667 ; ARM32: bl
   1668 ; ARM32: cmp
   1669 ; ARM32: sbcs
   1670 ; ARM32-OM1: tst
   1671 ; ARM32-OM1: bne
   1672 ; ARM32-O2: blt
   1673 ; ARM32: bl
   1674 
   1675 ; MIPS32-LABEL: icmpGe64
   1676 ; MIPS32: xor [[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   1677 ; MIPS32-OM1: sltu [[T2:.*]],[[A_HI]],[[B_HI]]
   1678 ; MIPS32-OM1: xori [[T3:.*]],[[T2]],0x1
   1679 ; MIPS32-OM1: sltu [[T4:.*]],{{.*}},{{.*}}
   1680 ; MIPS32-OM1: xori [[T5:.*]],[[T4]],0x1
   1681 ; MIPS32-O2: sltu [[T3:.*]],[[A_HI]],[[B_HI]]
   1682 ; MIPS32-O2: sltu [[T5:.*]],{{.*}},{{.*}}
   1683 ; MIPS32: movz [[T3]],[[T5]],[[T1]]
   1684 ; MIPS32-O2: bnez [[T3]],{{.*}}
   1685 ; MIPS32-OM1: sw [[T3]],[[MEM:.*]]
   1686 ; MIPS32-OM1: lb [[T6:.*]],[[MEM]]
   1687 ; MIPS32-OM1: beqz [[T6]],{{.*}}
   1688 ; MIPS32-OM1: b {{.*}}
   1689 ; MIPS32: jal {{.*}}
   1690 ; MIPS32-OM1: b {{.*}}
   1691 ; MIPS32: xor [[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   1692 ; MIPS32-OM1: slt [[T2:.*]],[[A_HI]],[[B_HI]]
   1693 ; MIPS32-OM1: xori [[T3:.*]],[[T2]],0x1
   1694 ; MIPS32-OM1: sltu [[T4:.*]],{{.*}},{{.*}}
   1695 ; MIPS32-OM1: xori [[T5:.*]],[[T4]],0x1
   1696 ; MIPS32-O2: slt [[T3:.*]],[[A_HI]],[[B_HI]]
   1697 ; MIPS32-O2: sltu [[T5:.*]],{{.*}},{{.*}}
   1698 ; MIPS32: movz [[T3]],[[T5]],[[T1]]
   1699 ; MIPS32-O2: bnez [[T3]],{{.*}}
   1700 ; MIPS32-OM1: sw [[T3]],[[MEM:.*]]
   1701 ; MIPS32-OM1: lb [[T6:.*]],[[MEM]]
   1702 ; MIPS32-OM1: beqz [[T6]],{{.*}}
   1703 ; MIPS32-OM1: b {{.*}}
   1704 ; MIPS32: jal {{.*}}
   1705 ; MIPS32-OM1: b {{.*}}
   1706 
   1707 define internal void @icmpLt64(i64 %a, i64 %b, i64 %c, i64 %d) {
   1708 entry:
   1709   %cmp = icmp ult i64 %a, %b
   1710   br i1 %cmp, label %if.then, label %if.end
   1711 
   1712 if.then:                                          ; preds = %entry
   1713   call void @func()
   1714   br label %if.end
   1715 
   1716 if.end:                                           ; preds = %if.then, %entry
   1717   %cmp1 = icmp slt i64 %c, %d
   1718   br i1 %cmp1, label %if.then2, label %if.end3
   1719 
   1720 if.then2:                                         ; preds = %if.end
   1721   call void @func()
   1722   br label %if.end3
   1723 
   1724 if.end3:                                          ; preds = %if.then2, %if.end
   1725   ret void
   1726 }
   1727 ; CHECK-LABEL: icmpLt64
   1728 ; CHECK: jb
   1729 ; CHECK: ja
   1730 ; CHECK: jae
   1731 ; CHECK: call
   1732 ; CHECK: jl
   1733 ; CHECK: jg
   1734 ; CHECK: jae
   1735 ; CHECK: call
   1736 ;
   1737 ; OPTM1-LABEL: icmpLt64
   1738 ; OPTM1: jb
   1739 ; OPTM1: ja
   1740 ; OPTM1: jb
   1741 ; OPTM1: call
   1742 ; OPTM1: jl
   1743 ; OPTM1: jg
   1744 ; OPTM1: jb
   1745 ; OPTM1: call
   1746 
   1747 ; ARM32-LABEL: icmpLt64
   1748 ; ARM32: cmp
   1749 ; ARM32: cmpeq
   1750 ; ARM32-OM1: tst
   1751 ; ARM32-OM1: bne
   1752 ; ARM32-O2: bcs
   1753 ; ARM32: bl
   1754 ; ARM32: cmp
   1755 ; ARM32: sbcs
   1756 ; ARM32-OM1: tst
   1757 ; ARM32-OM1: bne
   1758 ; ARM32-O2: bge
   1759 ; ARM32: bl
   1760 
   1761 ; MIPS32-LABEL: icmpLt64
   1762 ; MIPS32: xor [[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   1763 ; MIPS32-O2: sltu [[T2:.*]],[[A_HI]],[[B_HI]]
   1764 ; MIPS32-O2: xori [[T3:.*]],[[T2]],0x1
   1765 ; MIPS32-O2: sltu [[T4:.*]],{{.*}},{{.*}}
   1766 ; MIPS32-O2: xori [[T5:.*]],[[T4]],0x1
   1767 ; MIPS32-OM1: sltu [[T3:.*]],[[A_HI]],[[B_HI]]
   1768 ; MIPS32-OM1: sltu [[T5:.*]],{{.*}},{{.*}}
   1769 ; MIPS32: movz [[T3]],[[T5]],[[T1]]
   1770 ; MIPS32-O2: bnez [[T3]],{{.*}}
   1771 ; MIPS32-OM1: sw [[T3]],[[MEM:.*]]
   1772 ; MIPS32-OM1: lb [[T6:.*]],[[MEM]]
   1773 ; MIPS32-OM1: beqz [[T6]],{{.*}}
   1774 ; MIPS32-OM1: b {{.*}}
   1775 ; MIPS32: jal {{.*}}
   1776 ; MIPS32-OM1: b {{.*}}
   1777 ; MIPS32: xor [[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   1778 ; MIPS32-O2: slt [[T2:.*]],[[A_HI]],[[B_HI]]
   1779 ; MIPS32-O2: xori [[T3:.*]],[[T2]],0x1
   1780 ; MIPS32-O2: sltu [[T4:.*]],{{.*}},{{.*}}
   1781 ; MIPS32-O2: xori [[T5:.*]],[[T4]],0x1
   1782 ; MIPS32-OM1: slt [[T3:.*]],[[A_HI]],[[B_HI]]
   1783 ; MIPS32-OM1: sltu [[T5:.*]],{{.*}},{{.*}}
   1784 ; MIPS32: movz [[T3]],[[T5]],[[T1]]
   1785 ; MIPS32-O2: bnez [[T3]],{{.*}}
   1786 ; MIPS32-OM1: sw [[T3]],[[MEM:.*]]
   1787 ; MIPS32-OM1: lb [[T6:.*]],[[MEM]]
   1788 ; MIPS32-OM1: beqz [[T6]],{{.*}}
   1789 ; MIPS32-OM1: b {{.*}}
   1790 ; MIPS32: jal {{.*}}
   1791 ; MIPS32-OM1: b {{.*}}
   1792 
   1793 define internal void @icmpLe64(i64 %a, i64 %b, i64 %c, i64 %d) {
   1794 entry:
   1795   %cmp = icmp ule i64 %a, %b
   1796   br i1 %cmp, label %if.then, label %if.end
   1797 
   1798 if.then:                                          ; preds = %entry
   1799   call void @func()
   1800   br label %if.end
   1801 
   1802 if.end:                                           ; preds = %if.then, %entry
   1803   %cmp1 = icmp sle i64 %c, %d
   1804   br i1 %cmp1, label %if.then2, label %if.end3
   1805 
   1806 if.then2:                                         ; preds = %if.end
   1807   call void @func()
   1808   br label %if.end3
   1809 
   1810 if.end3:                                          ; preds = %if.end, %if.then2
   1811   ret void
   1812 }
   1813 ; CHECK-LABEL: icmpLe64
   1814 ; CHECK: jb
   1815 ; CHECK: ja
   1816 ; CHECK: ja
   1817 ; CHECK: call
   1818 ; CHECK: jl
   1819 ; CHECK: jg
   1820 ; CHECK: ja
   1821 ; CHECK: call
   1822 ;
   1823 ; OPTM1-LABEL: icmpLe64
   1824 ; OPTM1: jb
   1825 ; OPTM1: ja
   1826 ; OPTM1: jbe
   1827 ; OPTM1: call
   1828 ; OPTM1: jl
   1829 ; OPTM1: jg
   1830 ; OPTM1: jbe
   1831 ; OPTM1: call
   1832 
   1833 ; ARM32-LABEL: icmpLe64
   1834 ; ARM32: cmp
   1835 ; ARM32: cmpeq
   1836 ; ARM32-OM1: tst
   1837 ; ARM32-OM1: bne
   1838 ; ARM32-O2: bhi
   1839 ; ARM32: bl
   1840 ; ARM32: cmp
   1841 ; ARM32: sbcs
   1842 ; ARM32-OM1: tst
   1843 ; ARM32-OM1: bne
   1844 ; ARM32-O2: blt
   1845 ; ARM32: bl
   1846 
   1847 ; MIPS32-LABEL: icmpLe64
   1848 ; MIPS32: xor [[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   1849 ; MIPS32-OM1: sltu [[T2:.*]],[[B_HI]],[[A_HI]]
   1850 ; MIPS32-OM1: xori [[T3:.*]],[[T2]],0x1
   1851 ; MIPS32-OM1: sltu [[T4:.*]],{{.*}},{{.*}}
   1852 ; MIPS32-OM1: xori [[T5:.*]],[[T4]],0x1
   1853 ; MIPS32-O2: sltu [[T3:.*]],[[B_HI]],[[A_HI]]
   1854 ; MIPS32-O2: sltu [[T5:.*]],{{.*}},{{.*}}
   1855 ; MIPS32: movz [[T3]],[[T5]],[[T1]]
   1856 ; MIPS32-O2: bnez [[T3]],{{.*}}
   1857 ; MIPS32-OM1: sw [[T3]],[[MEM:.*]]
   1858 ; MIPS32-OM1: lb [[T6:.*]],[[MEM]]
   1859 ; MIPS32-OM1: beqz [[T6]],{{.*}}
   1860 ; MIPS32-OM1: b {{.*}}
   1861 ; MIPS32: jal {{.*}}
   1862 ; MIPS32-OM1: b {{.*}}
   1863 ; MIPS32: xor [[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   1864 ; MIPS32-OM1: slt [[T2:.*]],[[B_HI]],[[A_HI]]
   1865 ; MIPS32-OM1: xori [[T3:.*]],[[T2]],0x1
   1866 ; MIPS32-OM1: sltu [[T4:.*]],{{.*}},{{.*}}
   1867 ; MIPS32-OM1: xori [[T5:.*]],[[T4]],0x1
   1868 ; MIPS32-O2: slt [[T3:.*]],[[B_HI]],[[A_HI]]
   1869 ; MIPS32-O2: sltu [[T5:.*]],{{.*}},{{.*}}
   1870 ; MIPS32: movz [[T3]],[[T5]],[[T1]]
   1871 ; MIPS32-O2: bnez [[T3]],{{.*}}
   1872 ; MIPS32-OM1: sw [[T3]],[[MEM:.*]]
   1873 ; MIPS32-OM1: lb [[T6:.*]],[[MEM]]
   1874 ; MIPS32-OM1: beqz [[T6]],{{.*}}
   1875 ; MIPS32-OM1: b {{.*}}
   1876 ; MIPS32: jal {{.*}}
   1877 ; MIPS32-OM1: b {{.*}}
   1878 
   1879 define internal i32 @icmpEq64Bool(i64 %a, i64 %b) {
   1880 entry:
   1881   %cmp = icmp eq i64 %a, %b
   1882   %cmp.ret_ext = zext i1 %cmp to i32
   1883   ret i32 %cmp.ret_ext
   1884 }
   1885 ; CHECK-LABEL: icmpEq64Bool
   1886 ; CHECK: jne
   1887 ; CHECK: je
   1888 ;
   1889 ; OPTM1-LABEL: icmpEq64Bool
   1890 ; OPTM1: jne
   1891 ; OPTM1: je
   1892 
   1893 ; ARM32-LABEL: icmpEq64Bool
   1894 ; ARM32: mov
   1895 ; ARM32: moveq
   1896 
   1897 ; MIPS32-LABEL: icmpEq64Bool
   1898 ; MIPS32: xor	[[T1:.*]],{{.*}},{{.*}}
   1899 ; MIPS32: xor	[[T2:.*]],{{.*}},{{.*}}
   1900 ; MIPS32: or	[[T3:.*]],[[T1]],[[T2]]
   1901 ; MIPS32: sltiu	{{.*}},[[T3]],1
   1902 
   1903 define internal i32 @icmpNe64Bool(i64 %a, i64 %b) {
   1904 entry:
   1905   %cmp = icmp ne i64 %a, %b
   1906   %cmp.ret_ext = zext i1 %cmp to i32
   1907   ret i32 %cmp.ret_ext
   1908 }
   1909 ; CHECK-LABEL: icmpNe64Bool
   1910 ; CHECK: jne
   1911 ; CHECK: jne
   1912 ;
   1913 ; OPTM1-LABEL: icmpNe64Bool
   1914 ; OPTM1: jne
   1915 ; OPTM1: jne
   1916 
   1917 ; ARM32-LABEL: icmpNe64Bool
   1918 ; ARM32: mov
   1919 ; ARM32: movne
   1920 
   1921 ; MIPS32-LABEL: icmpNe64Bool
   1922 ; MIPS32: xor   [[T1:.*]],{{.*}},{{.*}}
   1923 ; MIPS32: xor   [[T2:.*]],{{.*}},{{.*}}
   1924 ; MIPS32: or    [[T3:.*]],[[T1]],[[T2]]
   1925 ; MIPS32: sltu {{.*}},zero,[[T3]]
   1926 
   1927 define internal i32 @icmpSgt64Bool(i64 %a, i64 %b) {
   1928 entry:
   1929   %cmp = icmp sgt i64 %a, %b
   1930   %cmp.ret_ext = zext i1 %cmp to i32
   1931   ret i32 %cmp.ret_ext
   1932 }
   1933 ; CHECK-LABEL: icmpSgt64Bool
   1934 ; CHECK: cmp
   1935 ; CHECK: jg
   1936 ; CHECK: jl
   1937 ; CHECK: cmp
   1938 ; CHECK: ja
   1939 ;
   1940 ; OPTM1-LABEL: icmpSgt64Bool
   1941 ; OPTM1: cmp
   1942 ; OPTM1: jg
   1943 ; OPTM1: jl
   1944 ; OPTM1: cmp
   1945 ; OPTM1: ja
   1946 
   1947 ; ARM32-LABEL: icmpSgt64Bool
   1948 ; ARM32: mov
   1949 ; ARM32: cmp
   1950 ; ARM32: sbcs
   1951 ; ARM32: movlt
   1952 
   1953 ; MIPS32-LABEL: icmpSgt64Bool
   1954 ; MIPS32: xor	[[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   1955 ; MIPS32: slt	[[T2:.*]],{{.*}},{{.*}}
   1956 ; MIPS32: sltu	[[T3:.*]],{{.*}},{{.*}}
   1957 ; MIPS32: movz	[[T2]],[[T3]],[[T1]]
   1958 ; MIPS32-O2: move	{{.*}},[[T2]]
   1959 ; MIPS32-OM1: sw	[[T2]],[[MEM:.*]]
   1960 ; MIPS32-OM1: lb	{{.*}},[[MEM]]
   1961 
   1962 define internal i32 @icmpUgt64Bool(i64 %a, i64 %b) {
   1963 entry:
   1964   %cmp = icmp ugt i64 %a, %b
   1965   %cmp.ret_ext = zext i1 %cmp to i32
   1966   ret i32 %cmp.ret_ext
   1967 }
   1968 ; CHECK-LABEL: icmpUgt64Bool
   1969 ; CHECK: cmp
   1970 ; CHECK: ja
   1971 ; CHECK: jb
   1972 ; CHECK: cmp
   1973 ; CHECK: ja
   1974 ;
   1975 ; OPTM1-LABEL: icmpUgt64Bool
   1976 ; OPTM1: cmp
   1977 ; OPTM1: ja
   1978 ; OPTM1: jb
   1979 ; OPTM1: cmp
   1980 ; OPTM1: ja
   1981 
   1982 ; ARM32-LABEL: icmpUgt64Bool
   1983 ; ARM32: mov
   1984 ; ARM32: cmp
   1985 ; ARM32: cmpeq
   1986 ; ARM32: movhi
   1987 
   1988 ; MIPS32-LABEL: icmpUgt64Bool
   1989 ; MIPS32: xor	[[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   1990 ; MIPS32: sltu	[[T2:.*]],[[B_HI]],[[A_HI]]
   1991 ; MIPS32: sltu	[[T3:.*]],{{.*}},{{.*}}
   1992 ; MIPS32: movz	[[T2]],[[T3]],[[T1]]
   1993 ; MIPS32-O2: move	{{.*}},[[T2]]
   1994 ; MIPS32-OM1: sw	[[T2]],[[MEM:.*]]
   1995 ; MIPS32-OM1: lb	{{.*}},[[MEM]]
   1996 
   1997 define internal i32 @icmpSge64Bool(i64 %a, i64 %b) {
   1998 entry:
   1999   %cmp = icmp sge i64 %a, %b
   2000   %cmp.ret_ext = zext i1 %cmp to i32
   2001   ret i32 %cmp.ret_ext
   2002 }
   2003 ; CHECK-LABEL: icmpSge64Bool
   2004 ; CHECK: cmp
   2005 ; CHECK: jg
   2006 ; CHECK: jl
   2007 ; CHECK: cmp
   2008 ; CHECK: jae
   2009 ;
   2010 ; OPTM1-LABEL: icmpSge64Bool
   2011 ; OPTM1: cmp
   2012 ; OPTM1: jg
   2013 ; OPTM1: jl
   2014 ; OPTM1: cmp
   2015 ; OPTM1: jae
   2016 
   2017 ; ARM32-LABEL: icmpSge64Bool
   2018 ; ARM32: mov
   2019 ; ARM32: cmp
   2020 ; ARM32: sbcs
   2021 ; ARM32: movge
   2022 
   2023 ; MIPS32-LABEL: icmpSge64Bool
   2024 ; MIPS32: xor	[[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   2025 ; MIPS32: slt	[[T2:.*]],[[A_HI]],[[B_HI]]
   2026 ; MIPS32: xori	[[T3:.*]],[[T2]],0x1
   2027 ; MIPS32: sltu	[[T4:.*]],{{.*}},{{.*}}
   2028 ; MIPS32: xori	[[T5:.*]],[[T4]],0x1
   2029 ; MIPS32: movz	[[T6:.*]],[[T5]],[[T1]]
   2030 ; MIPS32-O2: move       {{.*}},[[T3]]
   2031 ; MIPS32-OM1: sw        [[T3]],[[MEM:.*]]
   2032 ; MIPS32-OM1: lb        {{.*}},[[MEM]]
   2033 
   2034 define internal i32 @icmpUge64Bool(i64 %a, i64 %b) {
   2035 entry:
   2036   %cmp = icmp uge i64 %a, %b
   2037   %cmp.ret_ext = zext i1 %cmp to i32
   2038   ret i32 %cmp.ret_ext
   2039 }
   2040 ; CHECK-LABEL: icmpUge64Bool
   2041 ; CHECK: cmp
   2042 ; CHECK: ja
   2043 ; CHECK: jb
   2044 ; CHECK: cmp
   2045 ; CHECK: jae
   2046 ;
   2047 ; OPTM1-LABEL: icmpUge64Bool
   2048 ; OPTM1: cmp
   2049 ; OPTM1: ja
   2050 ; OPTM1: jb
   2051 ; OPTM1: cmp
   2052 ; OPTM1: jae
   2053 
   2054 ; ARM32-LABEL: icmpUge64Bool
   2055 ; ARM32: mov
   2056 ; ARM32: cmp
   2057 ; ARM32: cmpeq
   2058 ; ARM32: movcs
   2059 
   2060 ; MIPS32-LABEL: icmpUge64Bool
   2061 ; MIPS32: xor	[[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   2062 ; MIPS32: sltu	[[T2:.*]],[[A_HI]],[[B_HI]]
   2063 ; MIPS32: xori	[[T3:.*]],[[T2]],0x1
   2064 ; MIPS32: sltu	[[T4:.*]],{{.*}},{{.*}}
   2065 ; MIPS32: xori	[[T5:.*]],[[T4]],0x1
   2066 ; MIPS32: movz	[[T6:.*]],[[T5]],[[T1]]
   2067 ; MIPS32-O2: move	{{.*}},[[T3]]
   2068 ; MIPS32-OM1: sw	[[T3]],[[MEM:.*]]
   2069 ; MIPS32-OM1: lb	{{.*}},[[MEM]]
   2070 
   2071 define internal i32 @icmpSlt64Bool(i64 %a, i64 %b) {
   2072 entry:
   2073   %cmp = icmp slt i64 %a, %b
   2074   %cmp.ret_ext = zext i1 %cmp to i32
   2075   ret i32 %cmp.ret_ext
   2076 }
   2077 ; CHECK-LABEL: icmpSlt64Bool
   2078 ; CHECK: cmp
   2079 ; CHECK: jl
   2080 ; CHECK: jg
   2081 ; CHECK: cmp
   2082 ; CHECK: jb
   2083 ;
   2084 ; OPTM1-LABEL: icmpSlt64Bool
   2085 ; OPTM1: cmp
   2086 ; OPTM1: jl
   2087 ; OPTM1: jg
   2088 ; OPTM1: cmp
   2089 ; OPTM1: jb
   2090 
   2091 ; ARM32-LABEL: icmpSlt64Bool
   2092 ; ARM32: mov
   2093 ; ARM32: cmp
   2094 ; ARM32: sbcs
   2095 ; ARM32: movlt
   2096 
   2097 ; MIPS32-LABEL: icmpSlt64Bool
   2098 ; MIPS32: xor	[[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   2099 ; MIPS32: slt	[[T2:.*]],[[A_HI]],[[B_HI]]
   2100 ; MIPS32: sltu	[[T3:.*]],{{.*}},{{.*}}
   2101 ; MIPS32: movz	[[T2:.*]],[[T3]],[[T1]]
   2102 ; MIPS32-O2: move	{{.*}},[[T2]]
   2103 ; MIPS32-OM1: sw	[[T2]],[[MEM:.*]]
   2104 ; MIPS32-OM1: lb	{{.*}},[[MEM]]
   2105 
   2106 define internal i32 @icmpUlt64Bool(i64 %a, i64 %b) {
   2107 entry:
   2108   %cmp = icmp ult i64 %a, %b
   2109   %cmp.ret_ext = zext i1 %cmp to i32
   2110   ret i32 %cmp.ret_ext
   2111 }
   2112 ; CHECK-LABEL: icmpUlt64Bool
   2113 ; CHECK: cmp
   2114 ; CHECK: jb
   2115 ; CHECK: ja
   2116 ; CHECK: cmp
   2117 ; CHECK: jb
   2118 ;
   2119 ; OPTM1-LABEL: icmpUlt64Bool
   2120 ; OPTM1: cmp
   2121 ; OPTM1: jb
   2122 ; OPTM1: ja
   2123 ; OPTM1: cmp
   2124 ; OPTM1: jb
   2125 
   2126 ; ARM32-LABEL: icmpUlt64Bool
   2127 ; ARM32: mov
   2128 ; ARM32: cmp
   2129 ; ARM32: cmpeq
   2130 ; ARM32: movcc
   2131 
   2132 ; MIPS32-LABEL: icmpUlt64Bool
   2133 ; MIPS32: xor	[[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   2134 ; MIPS32: sltu	[[T2:.*]],[[A_HI]],[[B_HI]]
   2135 ; MIPS32: sltu	[[T3:.*]],{{.*}},{{.*}}
   2136 ; MIPS32: movz	[[T2:.*]],[[T3]],[[T1]]
   2137 ; MIPS32-O2: move	{{.*}},[[T2]]
   2138 ; MIPS32-OM1: sw	[[T2]],[[MEM:.*]]
   2139 ; MIPS32-OM1: lb	{{.*}},[[MEM]]
   2140 
   2141 define internal i32 @icmpSle64Bool(i64 %a, i64 %b) {
   2142 entry:
   2143   %cmp = icmp sle i64 %a, %b
   2144   %cmp.ret_ext = zext i1 %cmp to i32
   2145   ret i32 %cmp.ret_ext
   2146 }
   2147 ; CHECK-LABEL: icmpSle64Bool
   2148 ; CHECK: cmp
   2149 ; CHECK: jl
   2150 ; CHECK: jg
   2151 ; CHECK: cmp
   2152 ; CHECK: jbe
   2153 ;
   2154 ; OPTM1-LABEL: icmpSle64Bool
   2155 ; OPTM1: cmp
   2156 ; OPTM1: jl
   2157 ; OPTM1: jg
   2158 ; OPTM1: cmp
   2159 ; OPTM1: jbe
   2160 
   2161 ; ARM32-LABEL: icmpSle64Bool
   2162 ; ARM32: mov
   2163 ; ARM32: cmp
   2164 ; ARM32: sbcs
   2165 ; ARM32: movge
   2166 
   2167 ; MIPS32-LABEL: icmpSle64Bool
   2168 ; MIPS32: xor	[[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   2169 ; MIPS32: slt	[[T2:.*]],[[B_HI]],[[A_HI]]
   2170 ; MIPS32: xori	[[T3:.*]],[[T2]],0x1
   2171 ; MIPS32: sltu	[[T4:.*]],{{.*}},{{.*}}
   2172 ; MIPS32: xori	[[T5:.*]],[[T4]],0x1
   2173 ; MIPS32: movz	[[T6:.*]],[[T5]],[[T1]]
   2174 ; MIPS32-O2: move	{{.*}},[[T3]]
   2175 ; MIPS32-OM1: sw	[[T3]],[[MEM:.*]]
   2176 ; MIPS32-OM1: lb	{{.*}},[[MEM]]
   2177 
   2178 define internal i32 @icmpUle64Bool(i64 %a, i64 %b) {
   2179 entry:
   2180   %cmp = icmp ule i64 %a, %b
   2181   %cmp.ret_ext = zext i1 %cmp to i32
   2182   ret i32 %cmp.ret_ext
   2183 }
   2184 ; CHECK-LABEL: icmpUle64Bool
   2185 ; CHECK: cmp
   2186 ; CHECK: jb
   2187 ; CHECK: ja
   2188 ; CHECK: cmp
   2189 ; CHECK: jbe
   2190 ;
   2191 ; OPTM1-LABEL: icmpUle64Bool
   2192 ; OPTM1: cmp
   2193 ; OPTM1: jb
   2194 ; OPTM1: ja
   2195 ; OPTM1: cmp
   2196 ; OPTM1: jbe
   2197 
   2198 ; ARM32-LABEL: icmpUle64Bool
   2199 ; ARM32: mov
   2200 ; ARM32: cmp
   2201 ; ARM32: cmpeq
   2202 ; ARM32: movls
   2203 
   2204 ; MIPS32-LABEL: icmpUle64Bool
   2205 ; MIPS32: xor	[[T1:.*]],[[A_HI:.*]],[[B_HI:.*]]
   2206 ; MIPS32: sltu	[[T2:.*]],[[B_HI]],[[A_HI]]
   2207 ; MIPS32: xori	[[T3:.*]],[[T2]],0x1
   2208 ; MIPS32: sltu	[[T4:.*]],{{.*}},{{.*}}
   2209 ; MIPS32: xori	[[T5:.*]],[[T4]],0x1
   2210 ; MIPS32: movz	[[T6:.*]],[[T5]],[[T1]]
   2211 ; MIPS32-O2: move	{{.*}},[[T3]]
   2212 ; MIPS32-OM1: sw	[[T3]],[[MEM:.*]]
   2213 ; MIPS32-OM1: lb	{{.*}},[[MEM]]
   2214 
   2215 define internal i64 @load64(i32 %a) {
   2216 entry:
   2217   %__1 = inttoptr i32 %a to i64*
   2218   %v0 = load i64, i64* %__1, align 1
   2219   ret i64 %v0
   2220 }
   2221 ; CHECK-LABEL: load64
   2222 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4]
   2223 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]]
   2224 ; CHECK-NEXT: mov {{.*}},DWORD PTR [e[[REGISTER]]+0x4]
   2225 ;
   2226 ; OPTM1-LABEL: load64
   2227 ; OPTM1: mov e{{..}},DWORD PTR [e{{..}}]
   2228 ; OPTM1: mov e{{..}},DWORD PTR [e{{..}}+0x4]
   2229 
   2230 ; ARM32-LABEL: load64
   2231 ; ARM32: ldr r{{.*}}, [r[[REG:.*]]]
   2232 ; ARM32: ldr r{{.*}}, [r[[REG]], #4]
   2233 
   2234 ; MIPS32-LABEL: load64
   2235 ; MIPS32-O2: 	lw	{{.*}},0([[REG:.*]])
   2236 ; MIPS32-O2: 	lw	[[REG]],4([[REG]])
   2237 
   2238 define internal void @store64(i32 %a, i64 %value) {
   2239 entry:
   2240   %__2 = inttoptr i32 %a to i64*
   2241   store i64 %value, i64* %__2, align 1
   2242   ret void
   2243 }
   2244 ; CHECK-LABEL: store64
   2245 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4]
   2246 ; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4],
   2247 ; CHECK: mov DWORD PTR [e[[REGISTER]]],
   2248 ;
   2249 ; OPTM1-LABEL: store64
   2250 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4],
   2251 ; OPTM1: mov DWORD PTR [e[[REGISTER]]],
   2252 
   2253 ; ARM32-LABEL: store64
   2254 ; ARM32: str r{{.*}}, [r[[REG:.*]], #4]
   2255 ; ARM32: str r{{.*}}, [r[[REG]]]
   2256 
   2257 ; MIPS32-LABEL: store64
   2258 ; MIPS32-O2: 	sw	{{.*}},4([[REG:.*]])
   2259 ; MIPS32-O2: 	sw	{{.*}},0([[REG]])
   2260 
   2261 define internal void @store64Const(i32 %a) {
   2262 entry:
   2263   %__1 = inttoptr i32 %a to i64*
   2264   store i64 -2401053092306725256, i64* %__1, align 1
   2265   ret void
   2266 }
   2267 ; CHECK-LABEL: store64Const
   2268 ; CHECK: mov e[[REGISTER:[a-z]+]],DWORD PTR [esp+0x4]
   2269 ; CHECK: mov DWORD PTR [e[[REGISTER]]+0x4],0xdeadbeef
   2270 ; CHECK: mov DWORD PTR [e[[REGISTER]]],0x12345678
   2271 ;
   2272 ; OPTM1-LABEL: store64Const
   2273 ; OPTM1: mov DWORD PTR [e[[REGISTER:[a-z]+]]+0x4],0xdeadbeef
   2274 ; OPTM1: mov DWORD PTR [e[[REGISTER]]],0x12345678
   2275 
   2276 ; ARM32-LABEL: store64Const
   2277 ; ARM32: movw [[REG1:.*]], #48879 ; 0xbeef
   2278 ; ARM32: movt [[REG1:.*]], #57005 ; 0xdead
   2279 ; ARM32: movw [[REG2:.*]], #22136 ; 0x5678
   2280 ; ARM32: movt [[REG2:.*]], #4660  ; 0x1234
   2281 ; ARM32: str [[REG1]], [r[[REG:.*]], #4]
   2282 ; ARM32: str [[REG2]], [r[[REG]]]
   2283 
   2284 ; MIPS32-LABEL: store64Const
   2285 ; MIPS32-O2: 	lui	[[REG1:.*]],0xdead
   2286 ; MIPS32-O2: 	ori	[[REG1:.*]],[[REG1]],0xbeef
   2287 ; MIPS32-O2: 	lui	[[REG2:.*]],0x1234
   2288 ; MIPS32-O2: 	ori	[[REG2:.*]],[[REG2]],0x5678
   2289 ; MIPS32-O2: 	sw	[[REG1]],4([[REG:.*]])
   2290 ; MIPS32-O2: 	sw	[[REG2]],0([[REG]])
   2291 
   2292 define internal i64 @select64VarVar(i64 %a, i64 %b) {
   2293 entry:
   2294   %cmp = icmp ult i64 %a, %b
   2295   %cond = select i1 %cmp, i64 %a, i64 %b
   2296   ret i64 %cond
   2297 }
   2298 ; CHECK-LABEL: select64VarVar
   2299 ; CHECK: mov
   2300 ; CHECK: mov
   2301 ; CHECK: cmp
   2302 ; CHECK: jb
   2303 ; CHECK: ja
   2304 ; CHECK: cmp
   2305 ; CHECK: jb
   2306 ; CHECK: mov
   2307 ; CHECK: mov
   2308 ;
   2309 ; OPTM1-LABEL: select64VarVar
   2310 ; OPTM1: cmp
   2311 ; OPTM1: jb
   2312 ; OPTM1: ja
   2313 ; OPTM1: cmp
   2314 ; OPTM1: jb
   2315 ; OPTM1: cmp
   2316 ; OPTM1: cmovne
   2317 
   2318 ; ARM32-LABEL: select64VarVar
   2319 ; ARM32: cmp
   2320 ; ARM32: cmpeq
   2321 ; ARM32-OM1: tst
   2322 ; ARM32-OM1: movne
   2323 ; ARM32-O2: movcc
   2324 ; ARM32-OM1: movne
   2325 ; ARM32-O2: movcc
   2326 
   2327 ; MIPS32-LABEL: select64VarVar
   2328 ; MIPS32: movn
   2329 ; MIPS32: movn
   2330 
   2331 define internal i64 @select64VarConst(i64 %a, i64 %b) {
   2332 entry:
   2333   %cmp = icmp ult i64 %a, %b
   2334   %cond = select i1 %cmp, i64 %a, i64 -2401053092306725256
   2335   ret i64 %cond
   2336 }
   2337 ; CHECK-LABEL: select64VarConst
   2338 ; CHECK: mov
   2339 ; CHECK: mov
   2340 ; CHECK: cmp
   2341 ; CHECK: jb
   2342 ; CHECK: ja
   2343 ; CHECK: cmp
   2344 ; CHECK: jb
   2345 ; CHECK: mov
   2346 ; CHECK: mov
   2347 ;
   2348 ; OPTM1-LABEL: select64VarConst
   2349 ; OPTM1: cmp
   2350 ; OPTM1: jb
   2351 ; OPTM1: ja
   2352 ; OPTM1: cmp
   2353 ; OPTM1: jb
   2354 ; OPTM1: cmp
   2355 ; OPTM1: cmovne
   2356 
   2357 ; ARM32-LABEL: select64VarConst
   2358 ; ARM32: mov
   2359 ; ARM32: mov
   2360 ; ARM32: cmp
   2361 ; ARM32: cmpeq
   2362 ; ARM32-OM1: tst
   2363 ; ARM32-OM1: movne
   2364 ; ARM32-O2: movcc
   2365 ; ARM32-OM1: movne
   2366 ; ARM32-O2: movcc
   2367 ; ARM32-O2: mov
   2368 ; ARM32-O2: mov
   2369 
   2370 ; MIPS32-LABEL: select64VarConst
   2371 ; MIPS32: movn
   2372 ; MIPS32: movn
   2373 
   2374 define internal i64 @select64ConstVar(i64 %a, i64 %b) {
   2375 entry:
   2376   %cmp = icmp ult i64 %a, %b
   2377   %cond = select i1 %cmp, i64 -2401053092306725256, i64 %b
   2378   ret i64 %cond
   2379 }
   2380 ; CHECK-LABEL: select64ConstVar
   2381 ; CHECK: mov
   2382 ; CHECK: mov
   2383 ; CHECK: cmp
   2384 ; CHECK: jb
   2385 ; CHECK: ja
   2386 ; CHECK: cmp
   2387 ; CHECK: jb
   2388 ; CHECK: mov
   2389 ; CHECK: mov
   2390 ;
   2391 ; OPTM1-LABEL: select64ConstVar
   2392 ; OPTM1: cmp
   2393 ; OPTM1: jb
   2394 ; OPTM1: ja
   2395 ; OPTM1: cmp
   2396 ; OPTM1: jb
   2397 ; OPTM1: cmp
   2398 ; OPTM1: cmove
   2399 
   2400 ; ARM32-LABEL: select64ConstVar
   2401 ; ARM32: cmp
   2402 ; ARM32: cmpeq
   2403 ; ARM32-OM1: tst
   2404 ; ARM32: movw
   2405 ; ARM32: movt
   2406 ; ARM32-OM1: movne
   2407 ; ARM32-O2: movcc
   2408 ; ARM32: movw
   2409 ; ARM32: movt
   2410 ; ARM32-OM1: movne
   2411 ; ARM32-O2: movcc
   2412 
   2413 ; MIPS32-LABEL: select64ConstVar
   2414 ; MIPS32: movn
   2415 ; MIPS32: movn
   2416 
   2417 define internal void @icmpEq64Imm() {
   2418 entry:
   2419   %cmp = icmp eq i64 123, 234
   2420   br i1 %cmp, label %if.then, label %if.end
   2421 
   2422 if.then:                                          ; preds = %entry
   2423   call void @func()
   2424   br label %if.end
   2425 
   2426 if.end:                                           ; preds = %if.then, %entry
   2427   %cmp1 = icmp eq i64 345, 456
   2428   br i1 %cmp1, label %if.then2, label %if.end3
   2429 
   2430 if.then2:                                         ; preds = %if.end
   2431   call void @func()
   2432   br label %if.end3
   2433 
   2434 if.end3:                                          ; preds = %if.then2, %if.end
   2435   ret void
   2436 }
   2437 ; The following checks are not strictly necessary since one of the RUN
   2438 ; lines actually runs the output through the assembler.
   2439 ; CHECK-LABEL: icmpEq64Imm
   2440 ; CHECK-NOT: cmp 0x{{[0-9a-f]+}},
   2441 ; OPTM1-LABEL: icmpEq64Imm
   2442 ; OPTM1-LABEL-NOT: cmp 0x{{[0-9a-f]+}},
   2443 ; ARM32-LABEL: icmpEq64Imm
   2444 ; ARM32-NOT: cmp #{{[0-9a-f]+}},
   2445 
   2446 define internal void @icmpLt64Imm() {
   2447 entry:
   2448   %cmp = icmp ult i64 123, 234
   2449   br i1 %cmp, label %if.then, label %if.end
   2450 
   2451 if.then:                                          ; preds = %entry
   2452   call void @func()
   2453   br label %if.end
   2454 
   2455 if.end:                                           ; preds = %if.then, %entry
   2456   %cmp1 = icmp slt i64 345, 456
   2457   br i1 %cmp1, label %if.then2, label %if.end3
   2458 
   2459 if.then2:                                         ; preds = %if.end
   2460   call void @func()
   2461   br label %if.end3
   2462 
   2463 if.end3:                                          ; preds = %if.then2, %if.end
   2464   ret void
   2465 }
   2466 ; The following checks are not strictly necessary since one of the RUN
   2467 ; lines actually runs the output through the assembler.
   2468 ; CHECK-LABEL: icmpLt64Imm
   2469 ; CHECK-NOT: cmp 0x{{[0-9a-f]+}},
   2470 ; OPTM1-LABEL: icmpLt64Imm
   2471 ; OPTM1-NOT: cmp 0x{{[0-9a-f]+}},
   2472 ; ARM32-LABEL: icmpLt64Imm
   2473 ; ARM32-NOT: cmp #{{[0-9a-f]+}},
   2474 
   2475 define internal i64 @phi64Imm(i32 %x, i64 %y, i64 %z) {
   2476 entry:
   2477   %cond = icmp eq i32 %x, 88
   2478   br i1 %cond, label %branch1, label %branch2
   2479 branch1:
   2480   %tmp = add i64 %y, %z
   2481   br label %branch2
   2482 
   2483 branch2:
   2484   %merge = phi i64 [ %tmp, %branch1 ], [ 20014547621496, %entry ]
   2485   ret i64 %merge
   2486 }
   2487 ; CHECK-LABEL: phi64Imm
   2488 ; CHECK: mov {{.*}},0x5678
   2489 ; CHECK: mov {{.*}},0x1234
   2490 ; OPTM1-LABEL: phi64Imm
   2491 ; OPTM1: mov {{.*}},0x5678
   2492 ; OPTM1: mov {{.*}},0x1234
   2493 ; ARM32-LABEL: phi64Imm
   2494 ; ARM32: movw {{.*}}, #22136 ; 0x5678
   2495 ; ARM32: movw {{.*}}, #4660  ; 0x1234
   2496 
   2497 define internal i64 @phi64Undef(i32 %x, i64 %y, i64 %z) {
   2498 entry:
   2499   %cond = icmp eq i32 %x, 88
   2500   br i1 %cond, label %branch1, label %branch2
   2501 branch1:
   2502   %tmp = add i64 %y, %z
   2503   br label %branch2
   2504 
   2505 branch2:
   2506   %merge = phi i64 [ %tmp, %branch1 ], [ undef, %entry ]
   2507   ret i64 %merge
   2508 }
   2509 
   2510 ; CHECK-LABEL: phi64Undef
   2511 ; CHECK: mov {{.*}},0x0
   2512 ; CHECK: mov {{.*}},0x0
   2513 ; OPTM1-LABEL: phi64Undef
   2514 ; OPTM1: mov {{.*}},0x0
   2515 ; OPTM1: mov {{.*}},0x0
   2516 ; ARM32-LABEL: phi64Undef
   2517 ; ARM32: mov {{.*}} #0
   2518 ; ARM32: mov {{.*}} #0
   2519 
   2520 define internal i32 @addOneToUpperAfterShift(i64 %value) {
   2521   %a = add i64 %value, 1
   2522   %s = lshr i64 %a, 40
   2523   %t = trunc i64 %s to i32
   2524   %r = add i32 %t, 1
   2525   ret i32 %r
   2526 ; ARM32-LABEL: addOneToUpperAfterShift
   2527 ; ARM32: adds
   2528 ; ARM32: adc
   2529 ; ARM32: lsr
   2530 ; ARM32: add
   2531 }
   2532 
   2533 define internal i32 @subOneToUpperAfterShift(i64 %value) {
   2534   %a = sub i64 %value, 1
   2535   %s = lshr i64 %a, 40
   2536   %t = trunc i64 %s to i32
   2537   %r = sub i32 %t, 1
   2538   ret i32 %r
   2539 ; ARM32-LABEL: subOneToUpperAfterShift
   2540 ; ARM32: subs
   2541 ; ARM32: sbc
   2542 ; ARM32: lsr
   2543 ; ARM32: sub
   2544 }
   2545