Home | History | Annotate | Download | only in X86
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s
      3 
      4 define i32 @sub_zext_cmp_mask_same_size_result(i32 %x) {
      5 ; CHECK-LABEL: sub_zext_cmp_mask_same_size_result:
      6 ; CHECK:       # %bb.0:
      7 ; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
      8 ; CHECK-NEXT:    andl $1, %edi
      9 ; CHECK-NEXT:    leal -28(%rdi), %eax
     10 ; CHECK-NEXT:    retq
     11   %a = and i32 %x, 1
     12   %c = icmp eq i32 %a, 0
     13   %z = zext i1 %c to i32
     14   %r = sub i32 -27, %z
     15   ret i32 %r
     16 }
     17 
     18 define i32 @sub_zext_cmp_mask_wider_result(i8 %x) {
     19 ; CHECK-LABEL: sub_zext_cmp_mask_wider_result:
     20 ; CHECK:       # %bb.0:
     21 ; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
     22 ; CHECK-NEXT:    andl $1, %edi
     23 ; CHECK-NEXT:    leal 26(%rdi), %eax
     24 ; CHECK-NEXT:    retq
     25   %a = and i8 %x, 1
     26   %c = icmp eq i8 %a, 0
     27   %z = zext i1 %c to i32
     28   %r = sub i32 27, %z
     29   ret i32 %r
     30 }
     31 
     32 define i8 @sub_zext_cmp_mask_narrower_result(i32 %x) {
     33 ; CHECK-LABEL: sub_zext_cmp_mask_narrower_result:
     34 ; CHECK:       # %bb.0:
     35 ; CHECK-NEXT:    andl $1, %edi
     36 ; CHECK-NEXT:    orb $46, %dil
     37 ; CHECK-NEXT:    movl %edi, %eax
     38 ; CHECK-NEXT:    retq
     39   %a = and i32 %x, 1
     40   %c = icmp eq i32 %a, 0
     41   %z = zext i1 %c to i8
     42   %r = sub i8 47, %z
     43   ret i8 %r
     44 }
     45 
     46 define i8 @add_zext_cmp_mask_same_size_result(i8 %x) {
     47 ; CHECK-LABEL: add_zext_cmp_mask_same_size_result:
     48 ; CHECK:       # %bb.0:
     49 ; CHECK-NEXT:    andb $1, %dil
     50 ; CHECK-NEXT:    xorb $27, %dil
     51 ; CHECK-NEXT:    movl %edi, %eax
     52 ; CHECK-NEXT:    retq
     53   %a = and i8 %x, 1
     54   %c = icmp eq i8 %a, 0
     55   %z = zext i1 %c to i8
     56   %r = add i8 %z, 26
     57   ret i8 %r
     58 }
     59 
     60 define i32 @add_zext_cmp_mask_wider_result(i8 %x) {
     61 ; CHECK-LABEL: add_zext_cmp_mask_wider_result:
     62 ; CHECK:       # %bb.0:
     63 ; CHECK-NEXT:    andl $1, %edi
     64 ; CHECK-NEXT:    xorl $27, %edi
     65 ; CHECK-NEXT:    movl %edi, %eax
     66 ; CHECK-NEXT:    retq
     67   %a = and i8 %x, 1
     68   %c = icmp eq i8 %a, 0
     69   %z = zext i1 %c to i32
     70   %r = add i32 %z, 26
     71   ret i32 %r
     72 }
     73 
     74 define i8 @add_zext_cmp_mask_narrower_result(i32 %x) {
     75 ; CHECK-LABEL: add_zext_cmp_mask_narrower_result:
     76 ; CHECK:       # %bb.0:
     77 ; CHECK-NEXT:    andl $1, %edi
     78 ; CHECK-NEXT:    xorb $43, %dil
     79 ; CHECK-NEXT:    movl %edi, %eax
     80 ; CHECK-NEXT:    retq
     81   %a = and i32 %x, 1
     82   %c = icmp eq i32 %a, 0
     83   %z = zext i1 %c to i8
     84   %r = add i8 %z, 42
     85   ret i8 %r
     86 }
     87 
     88 define i32 @low_bit_select_constants_bigger_false_same_size_result(i32 %x) {
     89 ; CHECK-LABEL: low_bit_select_constants_bigger_false_same_size_result:
     90 ; CHECK:       # %bb.0:
     91 ; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
     92 ; CHECK-NEXT:    andl $1, %edi
     93 ; CHECK-NEXT:    leal 42(%rdi), %eax
     94 ; CHECK-NEXT:    retq
     95   %a = and i32 %x, 1
     96   %c = icmp eq i32 %a, 0
     97   %r = select i1 %c, i32 42, i32 43
     98   ret i32 %r
     99 }
    100 
    101 define i64 @low_bit_select_constants_bigger_false_wider_result(i32 %x) {
    102 ; CHECK-LABEL: low_bit_select_constants_bigger_false_wider_result:
    103 ; CHECK:       # %bb.0:
    104 ; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
    105 ; CHECK-NEXT:    andl $1, %edi
    106 ; CHECK-NEXT:    leaq 26(%rdi), %rax
    107 ; CHECK-NEXT:    retq
    108   %a = and i32 %x, 1
    109   %c = icmp eq i32 %a, 0
    110   %r = select i1 %c, i64 26, i64 27
    111   ret i64 %r
    112 }
    113 
    114 define i16 @low_bit_select_constants_bigger_false_narrower_result(i32 %x) {
    115 ; CHECK-LABEL: low_bit_select_constants_bigger_false_narrower_result:
    116 ; CHECK:       # %bb.0:
    117 ; CHECK-NEXT:    # kill: def $edi killed $edi def $rdi
    118 ; CHECK-NEXT:    andl $1, %edi
    119 ; CHECK-NEXT:    leal 36(%rdi), %eax
    120 ; CHECK-NEXT:    # kill: def $ax killed $ax killed $eax
    121 ; CHECK-NEXT:    retq
    122   %a = and i32 %x, 1
    123   %c = icmp eq i32 %a, 0
    124   %r = select i1 %c, i16 36, i16 37
    125   ret i16 %r
    126 }
    127 
    128 define i8 @low_bit_select_constants_bigger_true_same_size_result(i8 %x) {
    129 ; CHECK-LABEL: low_bit_select_constants_bigger_true_same_size_result:
    130 ; CHECK:       # %bb.0:
    131 ; CHECK-NEXT:    andb $1, %dil
    132 ; CHECK-NEXT:    xorb $-29, %dil
    133 ; CHECK-NEXT:    movl %edi, %eax
    134 ; CHECK-NEXT:    retq
    135   %a = and i8 %x, 1
    136   %c = icmp eq i8 %a, 0
    137   %r = select i1 %c, i8 227, i8 226
    138   ret i8 %r
    139 }
    140 
    141 define i32 @low_bit_select_constants_bigger_true_wider_result(i8 %x) {
    142 ; CHECK-LABEL: low_bit_select_constants_bigger_true_wider_result:
    143 ; CHECK:       # %bb.0:
    144 ; CHECK-NEXT:    andl $1, %edi
    145 ; CHECK-NEXT:    xorl $227, %edi
    146 ; CHECK-NEXT:    movl %edi, %eax
    147 ; CHECK-NEXT:    retq
    148   %a = and i8 %x, 1
    149   %c = icmp eq i8 %a, 0
    150   %r = select i1 %c, i32 227, i32 226
    151   ret i32 %r
    152 }
    153 
    154 define i8 @low_bit_select_constants_bigger_true_narrower_result(i16 %x) {
    155 ; CHECK-LABEL: low_bit_select_constants_bigger_true_narrower_result:
    156 ; CHECK:       # %bb.0:
    157 ; CHECK-NEXT:    andl $1, %edi
    158 ; CHECK-NEXT:    xorb $41, %dil
    159 ; CHECK-NEXT:    movl %edi, %eax
    160 ; CHECK-NEXT:    retq
    161   %a = and i16 %x, 1
    162   %c = icmp eq i16 %a, 0
    163   %r = select i1 %c, i8 41, i8 40
    164   ret i8 %r
    165 }
    166 
    167