Home | History | Annotate | Download | only in AArch64
      1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
      2 ; RUN: llc -mtriple=aarch64-unknown-linux-gnu < %s | FileCheck %s
      3 
      4 ; ============================================================================ ;
      5 ; Various cases with %x and/or %y being a constant
      6 ; ============================================================================ ;
      7 
      8 define <4 x i32> @out_constant_varx_mone(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
      9 ; CHECK-LABEL: out_constant_varx_mone:
     10 ; CHECK:       // %bb.0:
     11 ; CHECK-NEXT:    and v0.16b, v2.16b, v0.16b
     12 ; CHECK-NEXT:    orn v0.16b, v0.16b, v2.16b
     13 ; CHECK-NEXT:    ret
     14   %notmask = xor <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
     15   %mx = and <4 x i32> %mask, %x
     16   %my = and <4 x i32> %notmask, <i32 -1, i32 -1, i32 -1, i32 -1>
     17   %r = or <4 x i32> %mx, %my
     18   ret <4 x i32> %r
     19 }
     20 
     21 define <4 x i32> @in_constant_varx_mone(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
     22 ; CHECK-LABEL: in_constant_varx_mone:
     23 ; CHECK:       // %bb.0:
     24 ; CHECK-NEXT:    bic v0.16b, v2.16b, v0.16b
     25 ; CHECK-NEXT:    mvn v0.16b, v0.16b
     26 ; CHECK-NEXT:    ret
     27   %n0 = xor <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1> ; %x
     28   %n1 = and <4 x i32> %n0, %mask
     29   %r = xor <4 x i32> %n1, <i32 -1, i32 -1, i32 -1, i32 -1>
     30   ret <4 x i32> %r
     31 }
     32 
     33 ; This is not a canonical form. Testing for completeness only.
     34 define <4 x i32> @out_constant_varx_mone_invmask(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
     35 ; CHECK-LABEL: out_constant_varx_mone_invmask:
     36 ; CHECK:       // %bb.0:
     37 ; CHECK-NEXT:    bic v0.16b, v0.16b, v2.16b
     38 ; CHECK-NEXT:    orr v0.16b, v0.16b, v2.16b
     39 ; CHECK-NEXT:    ret
     40   %notmask = xor <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
     41   %mx = and <4 x i32> %notmask, %x
     42   %my = and <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
     43   %r = or <4 x i32> %mx, %my
     44   ret <4 x i32> %r
     45 }
     46 
     47 ; This is not a canonical form. Testing for completeness only.
     48 define <4 x i32> @in_constant_varx_mone_invmask(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
     49 ; CHECK-LABEL: in_constant_varx_mone_invmask:
     50 ; CHECK:       // %bb.0:
     51 ; CHECK-NEXT:    mvn v0.16b, v0.16b
     52 ; CHECK-NEXT:    bic v0.16b, v0.16b, v2.16b
     53 ; CHECK-NEXT:    mvn v0.16b, v0.16b
     54 ; CHECK-NEXT:    ret
     55   %notmask = xor <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
     56   %n0 = xor <4 x i32> %x, <i32 -1, i32 -1, i32 -1, i32 -1> ; %x
     57   %n1 = and <4 x i32> %n0, %notmask
     58   %r = xor <4 x i32> %n1, <i32 -1, i32 -1, i32 -1, i32 -1>
     59   ret <4 x i32> %r
     60 }
     61 
     62 define <4 x i32> @out_constant_varx_42(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
     63 ; CHECK-LABEL: out_constant_varx_42:
     64 ; CHECK:       // %bb.0:
     65 ; CHECK-NEXT:    movi v1.4s, #42
     66 ; CHECK-NEXT:    bsl v2.16b, v0.16b, v1.16b
     67 ; CHECK-NEXT:    mov v0.16b, v2.16b
     68 ; CHECK-NEXT:    ret
     69   %notmask = xor <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
     70   %mx = and <4 x i32> %mask, %x
     71   %my = and <4 x i32> %notmask, <i32 42, i32 42, i32 42, i32 42>
     72   %r = or <4 x i32> %mx, %my
     73   ret <4 x i32> %r
     74 }
     75 
     76 define <4 x i32> @in_constant_varx_42(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
     77 ; CHECK-LABEL: in_constant_varx_42:
     78 ; CHECK:       // %bb.0:
     79 ; CHECK-NEXT:    movi v1.4s, #42
     80 ; CHECK-NEXT:    bsl v2.16b, v0.16b, v1.16b
     81 ; CHECK-NEXT:    mov v0.16b, v2.16b
     82 ; CHECK-NEXT:    ret
     83   %n0 = xor <4 x i32> %x, <i32 42, i32 42, i32 42, i32 42> ; %x
     84   %n1 = and <4 x i32> %n0, %mask
     85   %r = xor <4 x i32> %n1, <i32 42, i32 42, i32 42, i32 42>
     86   ret <4 x i32> %r
     87 }
     88 
     89 ; This is not a canonical form. Testing for completeness only.
     90 define <4 x i32> @out_constant_varx_42_invmask(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
     91 ; CHECK-LABEL: out_constant_varx_42_invmask:
     92 ; CHECK:       // %bb.0:
     93 ; CHECK-NEXT:    movi v1.4s, #42
     94 ; CHECK-NEXT:    bsl v2.16b, v1.16b, v0.16b
     95 ; CHECK-NEXT:    mov v0.16b, v2.16b
     96 ; CHECK-NEXT:    ret
     97   %notmask = xor <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
     98   %mx = and <4 x i32> %notmask, %x
     99   %my = and <4 x i32> %mask, <i32 42, i32 42, i32 42, i32 42>
    100   %r = or <4 x i32> %mx, %my
    101   ret <4 x i32> %r
    102 }
    103 
    104 ; This is not a canonical form. Testing for completeness only.
    105 define <4 x i32> @in_constant_varx_42_invmask(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
    106 ; CHECK-LABEL: in_constant_varx_42_invmask:
    107 ; CHECK:       // %bb.0:
    108 ; CHECK-NEXT:    movi v1.4s, #42
    109 ; CHECK-NEXT:    bsl v2.16b, v1.16b, v0.16b
    110 ; CHECK-NEXT:    mov v0.16b, v2.16b
    111 ; CHECK-NEXT:    ret
    112   %notmask = xor <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
    113   %n0 = xor <4 x i32> %x, <i32 42, i32 42, i32 42, i32 42> ; %x
    114   %n1 = and <4 x i32> %n0, %notmask
    115   %r = xor <4 x i32> %n1, <i32 42, i32 42, i32 42, i32 42>
    116   ret <4 x i32> %r
    117 }
    118 
    119 define <4 x i32> @out_constant_mone_vary(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
    120 ; CHECK-LABEL: out_constant_mone_vary:
    121 ; CHECK:       // %bb.0:
    122 ; CHECK-NEXT:    bic v0.16b, v1.16b, v2.16b
    123 ; CHECK-NEXT:    orr v0.16b, v2.16b, v0.16b
    124 ; CHECK-NEXT:    ret
    125   %notmask = xor <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
    126   %mx = and <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
    127   %my = and <4 x i32> %notmask, %y
    128   %r = or <4 x i32> %mx, %my
    129   ret <4 x i32> %r
    130 }
    131 
    132 define <4 x i32> @in_constant_mone_vary(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
    133 ; CHECK-LABEL: in_constant_mone_vary:
    134 ; CHECK:       // %bb.0:
    135 ; CHECK-NEXT:    bic v0.16b, v1.16b, v2.16b
    136 ; CHECK-NEXT:    orr v0.16b, v2.16b, v0.16b
    137 ; CHECK-NEXT:    ret
    138   %n0 = xor <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, %y ; %x
    139   %n1 = and <4 x i32> %n0, %mask
    140   %r = xor <4 x i32> %n1, %y
    141   ret <4 x i32> %r
    142 }
    143 
    144 ; This is not a canonical form. Testing for completeness only.
    145 define <4 x i32> @out_constant_mone_vary_invmask(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
    146 ; CHECK-LABEL: out_constant_mone_vary_invmask:
    147 ; CHECK:       // %bb.0:
    148 ; CHECK-NEXT:    and v0.16b, v2.16b, v1.16b
    149 ; CHECK-NEXT:    orn v0.16b, v0.16b, v2.16b
    150 ; CHECK-NEXT:    ret
    151   %notmask = xor <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
    152   %mx = and <4 x i32> %notmask, <i32 -1, i32 -1, i32 -1, i32 -1>
    153   %my = and <4 x i32> %mask, %y
    154   %r = or <4 x i32> %mx, %my
    155   ret <4 x i32> %r
    156 }
    157 
    158 ; This is not a canonical form. Testing for completeness only.
    159 define <4 x i32> @in_constant_mone_vary_invmask(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
    160 ; CHECK-LABEL: in_constant_mone_vary_invmask:
    161 ; CHECK:       // %bb.0:
    162 ; CHECK-NEXT:    and v0.16b, v1.16b, v2.16b
    163 ; CHECK-NEXT:    orn v0.16b, v0.16b, v2.16b
    164 ; CHECK-NEXT:    ret
    165   %notmask = xor <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
    166   %n0 = xor <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, %y ; %x
    167   %n1 = and <4 x i32> %n0, %notmask
    168   %r = xor <4 x i32> %n1, %y
    169   ret <4 x i32> %r
    170 }
    171 
    172 define <4 x i32> @out_constant_42_vary(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
    173 ; CHECK-LABEL: out_constant_42_vary:
    174 ; CHECK:       // %bb.0:
    175 ; CHECK-NEXT:    mov v0.16b, v2.16b
    176 ; CHECK-NEXT:    movi v2.4s, #42
    177 ; CHECK-NEXT:    bsl v0.16b, v2.16b, v1.16b
    178 ; CHECK-NEXT:    ret
    179   %notmask = xor <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
    180   %mx = and <4 x i32> %mask, <i32 42, i32 42, i32 42, i32 42>
    181   %my = and <4 x i32> %notmask, %y
    182   %r = or <4 x i32> %mx, %my
    183   ret <4 x i32> %r
    184 }
    185 
    186 define <4 x i32> @in_constant_42_vary(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
    187 ; CHECK-LABEL: in_constant_42_vary:
    188 ; CHECK:       // %bb.0:
    189 ; CHECK-NEXT:    mov v0.16b, v2.16b
    190 ; CHECK-NEXT:    movi v2.4s, #42
    191 ; CHECK-NEXT:    bsl v0.16b, v2.16b, v1.16b
    192 ; CHECK-NEXT:    ret
    193   %n0 = xor <4 x i32> <i32 42, i32 42, i32 42, i32 42>, %y ; %x
    194   %n1 = and <4 x i32> %n0, %mask
    195   %r = xor <4 x i32> %n1, %y
    196   ret <4 x i32> %r
    197 }
    198 
    199 ; This is not a canonical form. Testing for completeness only.
    200 define <4 x i32> @out_constant_42_vary_invmask(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
    201 ; CHECK-LABEL: out_constant_42_vary_invmask:
    202 ; CHECK:       // %bb.0:
    203 ; CHECK-NEXT:    mov v0.16b, v2.16b
    204 ; CHECK-NEXT:    movi v2.4s, #42
    205 ; CHECK-NEXT:    bsl v0.16b, v1.16b, v2.16b
    206 ; CHECK-NEXT:    ret
    207   %notmask = xor <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
    208   %mx = and <4 x i32> %notmask, <i32 42, i32 42, i32 42, i32 42>
    209   %my = and <4 x i32> %mask, %y
    210   %r = or <4 x i32> %mx, %my
    211   ret <4 x i32> %r
    212 }
    213 
    214 ; This is not a canonical form. Testing for completeness only.
    215 define <4 x i32> @in_constant_42_vary_invmask(<4 x i32> %x, <4 x i32> %y, <4 x i32> %mask) {
    216 ; CHECK-LABEL: in_constant_42_vary_invmask:
    217 ; CHECK:       // %bb.0:
    218 ; CHECK-NEXT:    mov v0.16b, v2.16b
    219 ; CHECK-NEXT:    movi v2.4s, #42
    220 ; CHECK-NEXT:    bsl v0.16b, v1.16b, v2.16b
    221 ; CHECK-NEXT:    ret
    222   %notmask = xor <4 x i32> %mask, <i32 -1, i32 -1, i32 -1, i32 -1>
    223   %n0 = xor <4 x i32> <i32 42, i32 42, i32 42, i32 42>, %y ; %x
    224   %n1 = and <4 x i32> %n0, %notmask
    225   %r = xor <4 x i32> %n1, %y
    226   ret <4 x i32> %r
    227 }
    228