Home | History | Annotate | Download | only in Thumb
      1 ; RUN: llc -mtriple=thumb-eabi -mcpu=cortex-m0 %s -verify-machineinstrs -o - | FileCheck %s
      2 
      3 define i32 @test1a(i32 %a, i32 %b) {
      4 entry:
      5   %cmp = icmp ne i32 %a, %b
      6   %cond = zext i1 %cmp to i32
      7   ret i32 %cond
      8 ; CHECK-LABEL: test1a:
      9 ; CHECK-NOT: b{{(ne)|(eq)}}
     10 ; CHECK:       subs r0, r0, r1
     11 ; CHECK-NEXT:  subs r1, r0, #1
     12 ; CHECK-NEXT:  sbcs r0, r1
     13 }
     14 
     15 define i32 @test1b(i32 %a, i32 %b) {
     16 entry:
     17   %cmp = icmp eq i32 %a, %b
     18   %cond = zext i1 %cmp to i32
     19   ret i32 %cond
     20 ; CHECK-LABEL: test1b:
     21 ; CHECK-NOT: b{{(ne)|(eq)}}
     22 ; CHECK:       subs    r1, r0, r1
     23 ; CHECK-NEXT:  movs    r0, #0
     24 ; CHECK-NEXT:  subs    r0, r0, r1
     25 ; CHECK-NEXT:  adcs    r0, r1
     26 }
     27 
     28 define i32 @test2a(i32 %a, i32 %b) {
     29 entry:
     30   %cmp = icmp eq i32 %a, %b
     31   %cond = zext i1 %cmp to i32
     32   ret i32 %cond
     33 ; CHECK-LABEL: test2a:
     34 ; CHECK-NOT: b{{(ne)|(eq)}}
     35 ; CHECK:       subs    r1, r0, r1
     36 ; CHECK-NEXT:  movs    r0, #0
     37 ; CHECK-NEXT:  subs    r0, r0, r1
     38 ; CHECK-NEXT:  adcs    r0, r1
     39 }
     40 
     41 define i32 @test2b(i32 %a, i32 %b) {
     42 entry:
     43   %cmp = icmp ne i32 %a, %b
     44   %cond = zext i1 %cmp to i32
     45   ret i32 %cond
     46 ; CHECK-LABEL: test2b:
     47 ; CHECK-NOT: b{{(ne)|(eq)}}
     48 ; CHECK:       subs    r0, r0, r1
     49 ; CHECK-NEXT:  subs    r1, r0, #1
     50 ; CHECK-NEXT:  sbcs    r0, r1
     51 }
     52 
     53 define i32 @test3a(i32 %a, i32 %b) {
     54 entry:
     55   %cmp = icmp eq i32 %a, %b
     56   %cond = select i1 %cmp, i32 0, i32 4
     57   ret i32 %cond
     58 ; CHECK-LABEL: test3a:
     59 ; CHECK-NOT: b{{(ne)|(eq)}}
     60 ; CHECK:       subs    r0, r0, r1
     61 ; CHECK-NEXT:  subs    r1, r0, #1
     62 ; CHECK-NEXT:  sbcs    r0, r1
     63 ; CHECK-NEXT:  lsls    r0, r0, #2
     64 }
     65 
     66 define i32 @test3b(i32 %a, i32 %b) {
     67 entry:
     68   %cmp = icmp eq i32 %a, %b
     69   %cond = select i1 %cmp, i32 4, i32 0
     70   ret i32 %cond
     71 ; CHECK-LABEL: test3b:
     72 ; CHECK-NOT: b{{(ne)|(eq)}}
     73 ; CHECK:      subs	r0, r0, r1
     74 ; CHECK-NEXT: movs	r1, #0
     75 ; CHECK-NEXT: subs	r1, r1, r0
     76 ; CHECK-NEXT: adcs	r1, r0
     77 ; CHECK-NEXT: lsls	r0, r1, #2
     78 }
     79 
     80 ; FIXME: This one hasn't changed actually
     81 ; but could look like test3b
     82 define i32 @test4a(i32 %a, i32 %b) {
     83 entry:
     84   %cmp = icmp ne i32 %a, %b
     85   %cond = select i1 %cmp, i32 0, i32 4
     86   ret i32 %cond
     87 ; CHECK-LABEL: test4a:
     88 ; CHECK-NOT: b{{(ne)|(eq)}}
     89 ; CHECK:       mov     r2, r0
     90 ; CHECK-NEXT:  movs    r0, #0
     91 ; CHECK-NEXT:  movs    r3, #4
     92 ; CHECK-NEXT:  cmp     r2, r1
     93 ; CHECK-NEXT:  bne     .[[BRANCH:[A-Z0-9_]+]]
     94 ; CHECK:       mov     r0, r3
     95 ; CHECK:       .[[BRANCH]]:
     96 }
     97 
     98 define i32 @test4b(i32 %a, i32 %b) {
     99 entry:
    100   %cmp = icmp ne i32 %a, %b
    101   %cond = select i1 %cmp, i32 4, i32 0
    102   ret i32 %cond
    103 ; CHECK-LABEL: test4b:
    104 ; CHECK-NOT: b{{(ne)|(eq)}}
    105 ; CHECK:       subs  r0, r0, r1
    106 ; CHECK-NEXT:  subs  r1, r0, #1
    107 ; CHECK-NEXT:  sbcs  r0, r1
    108 ; CHECK-NEXT:  lsls  r0, r0, #2
    109 }
    110