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-apple-darwin -mcpu=skx | FileCheck %s
      3 
      4 define i32 @mask32(i32 %x) {
      5 ; CHECK-LABEL: mask32:
      6 ; CHECK:       ## %bb.0:
      7 ; CHECK-NEXT:    notl %edi
      8 ; CHECK-NEXT:    movl %edi, %eax
      9 ; CHECK-NEXT:    retq
     10   %m0 = bitcast i32 %x to <32 x i1>
     11   %m1 = xor <32 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     12                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     13                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     14                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
     15   %ret = bitcast <32 x i1> %m1 to i32
     16   ret i32 %ret
     17 }
     18 
     19 define i64 @mask64(i64 %x) {
     20 ; CHECK-LABEL: mask64:
     21 ; CHECK:       ## %bb.0:
     22 ; CHECK-NEXT:    notq %rdi
     23 ; CHECK-NEXT:    movq %rdi, %rax
     24 ; CHECK-NEXT:    retq
     25   %m0 = bitcast i64 %x to <64 x i1>
     26   %m1 = xor <64 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     27                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     28                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     29                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     30                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     31                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     32                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     33                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
     34   %ret = bitcast <64 x i1> %m1 to i64
     35   ret i64 %ret
     36 }
     37 
     38 define void @mask32_mem(i32* %ptr) {
     39 ; CHECK-LABEL: mask32_mem:
     40 ; CHECK:       ## %bb.0:
     41 ; CHECK-NEXT:    kmovd (%rdi), %k0
     42 ; CHECK-NEXT:    knotd %k0, %k0
     43 ; CHECK-NEXT:    kmovd %k0, (%rdi)
     44 ; CHECK-NEXT:    retq
     45   %x = load i32, i32* %ptr, align 4
     46   %m0 = bitcast i32 %x to <32 x i1>
     47   %m1 = xor <32 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     48                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     49                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     50                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
     51   %ret = bitcast <32 x i1> %m1 to i32
     52   store i32 %ret, i32* %ptr, align 4
     53   ret void
     54 }
     55 
     56 define void @mask64_mem(i64* %ptr) {
     57 ; CHECK-LABEL: mask64_mem:
     58 ; CHECK:       ## %bb.0:
     59 ; CHECK-NEXT:    kmovq (%rdi), %k0
     60 ; CHECK-NEXT:    knotq %k0, %k0
     61 ; CHECK-NEXT:    kmovq %k0, (%rdi)
     62 ; CHECK-NEXT:    retq
     63   %x = load i64, i64* %ptr, align 4
     64   %m0 = bitcast i64 %x to <64 x i1>
     65   %m1 = xor <64 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     66                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     67                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     68                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     69                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     70                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     71                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     72                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
     73   %ret = bitcast <64 x i1> %m1 to i64
     74   store i64 %ret, i64* %ptr, align 4
     75   ret void
     76 }
     77 
     78 define i32 @mand32(i32 %x, i32 %y) {
     79 ; CHECK-LABEL: mand32:
     80 ; CHECK:       ## %bb.0:
     81 ; CHECK-NEXT:    movl %edi, %eax
     82 ; CHECK-NEXT:    andl %esi, %eax
     83 ; CHECK-NEXT:    xorl %esi, %edi
     84 ; CHECK-NEXT:    orl %eax, %edi
     85 ; CHECK-NEXT:    movl %edi, %eax
     86 ; CHECK-NEXT:    retq
     87   %ma = bitcast i32 %x to <32 x i1>
     88   %mb = bitcast i32 %y to <32 x i1>
     89   %mc = and <32 x i1> %ma, %mb
     90   %md = xor <32 x i1> %ma, %mb
     91   %me = or <32 x i1> %mc, %md
     92   %ret = bitcast <32 x i1> %me to i32
     93   ret i32 %ret
     94 }
     95 
     96 define i32 @mand32_mem(<32 x i1>* %x, <32 x i1>* %y) {
     97 ; CHECK-LABEL: mand32_mem:
     98 ; CHECK:       ## %bb.0:
     99 ; CHECK-NEXT:    kmovd (%rdi), %k0
    100 ; CHECK-NEXT:    kmovd (%rsi), %k1
    101 ; CHECK-NEXT:    kandd %k1, %k0, %k2
    102 ; CHECK-NEXT:    kxord %k1, %k0, %k0
    103 ; CHECK-NEXT:    kord %k0, %k2, %k0
    104 ; CHECK-NEXT:    kmovd %k0, %eax
    105 ; CHECK-NEXT:    retq
    106   %ma = load <32 x i1>, <32 x i1>* %x
    107   %mb = load <32 x i1>, <32 x i1>* %y
    108   %mc = and <32 x i1> %ma, %mb
    109   %md = xor <32 x i1> %ma, %mb
    110   %me = or <32 x i1> %mc, %md
    111   %ret = bitcast <32 x i1> %me to i32
    112   ret i32 %ret
    113 }
    114 
    115 define i64 @mand64(i64 %x, i64 %y) {
    116 ; CHECK-LABEL: mand64:
    117 ; CHECK:       ## %bb.0:
    118 ; CHECK-NEXT:    movq %rdi, %rax
    119 ; CHECK-NEXT:    andq %rsi, %rax
    120 ; CHECK-NEXT:    xorq %rsi, %rdi
    121 ; CHECK-NEXT:    orq %rax, %rdi
    122 ; CHECK-NEXT:    movq %rdi, %rax
    123 ; CHECK-NEXT:    retq
    124   %ma = bitcast i64 %x to <64 x i1>
    125   %mb = bitcast i64 %y to <64 x i1>
    126   %mc = and <64 x i1> %ma, %mb
    127   %md = xor <64 x i1> %ma, %mb
    128   %me = or <64 x i1> %mc, %md
    129   %ret = bitcast <64 x i1> %me to i64
    130   ret i64 %ret
    131 }
    132 
    133 define i64 @mand64_mem(<64 x i1>* %x, <64 x i1>* %y) {
    134 ; CHECK-LABEL: mand64_mem:
    135 ; CHECK:       ## %bb.0:
    136 ; CHECK-NEXT:    kmovq (%rdi), %k0
    137 ; CHECK-NEXT:    kmovq (%rsi), %k1
    138 ; CHECK-NEXT:    kandq %k1, %k0, %k2
    139 ; CHECK-NEXT:    kxorq %k1, %k0, %k0
    140 ; CHECK-NEXT:    korq %k0, %k2, %k0
    141 ; CHECK-NEXT:    kmovq %k0, %rax
    142 ; CHECK-NEXT:    retq
    143   %ma = load <64 x i1>, <64 x i1>* %x
    144   %mb = load <64 x i1>, <64 x i1>* %y
    145   %mc = and <64 x i1> %ma, %mb
    146   %md = xor <64 x i1> %ma, %mb
    147   %me = or <64 x i1> %mc, %md
    148   %ret = bitcast <64 x i1> %me to i64
    149   ret i64 %ret
    150 }
    151 
    152 define i32 @test_v32i1_add(i32 %x, i32 %y) {
    153 ; CHECK-LABEL: test_v32i1_add:
    154 ; CHECK:       ## %bb.0:
    155 ; CHECK-NEXT:    kmovd %edi, %k0
    156 ; CHECK-NEXT:    kmovd %esi, %k1
    157 ; CHECK-NEXT:    kxord %k1, %k0, %k0
    158 ; CHECK-NEXT:    kmovd %k0, %eax
    159 ; CHECK-NEXT:    retq
    160   %m0 = bitcast i32 %x to <32 x i1>
    161   %m1 = bitcast i32 %y to <32 x i1>
    162   %m2 = add <32 x i1> %m0,  %m1
    163   %ret = bitcast <32 x i1> %m2 to i32
    164   ret i32 %ret
    165 }
    166 
    167 define i32 @test_v32i1_sub(i32 %x, i32 %y) {
    168 ; CHECK-LABEL: test_v32i1_sub:
    169 ; CHECK:       ## %bb.0:
    170 ; CHECK-NEXT:    kmovd %edi, %k0
    171 ; CHECK-NEXT:    kmovd %esi, %k1
    172 ; CHECK-NEXT:    kxord %k1, %k0, %k0
    173 ; CHECK-NEXT:    kmovd %k0, %eax
    174 ; CHECK-NEXT:    retq
    175   %m0 = bitcast i32 %x to <32 x i1>
    176   %m1 = bitcast i32 %y to <32 x i1>
    177   %m2 = sub <32 x i1> %m0,  %m1
    178   %ret = bitcast <32 x i1> %m2 to i32
    179   ret i32 %ret
    180 }
    181 
    182 define i32 @test_v32i1_mul(i32 %x, i32 %y) {
    183 ; CHECK-LABEL: test_v32i1_mul:
    184 ; CHECK:       ## %bb.0:
    185 ; CHECK-NEXT:    kmovd %edi, %k0
    186 ; CHECK-NEXT:    kmovd %esi, %k1
    187 ; CHECK-NEXT:    kandd %k1, %k0, %k0
    188 ; CHECK-NEXT:    kmovd %k0, %eax
    189 ; CHECK-NEXT:    retq
    190   %m0 = bitcast i32 %x to <32 x i1>
    191   %m1 = bitcast i32 %y to <32 x i1>
    192   %m2 = mul <32 x i1> %m0,  %m1
    193   %ret = bitcast <32 x i1> %m2 to i32
    194   ret i32 %ret
    195 }
    196 
    197 define i64 @test_v64i1_add(i64 %x, i64 %y) {
    198 ; CHECK-LABEL: test_v64i1_add:
    199 ; CHECK:       ## %bb.0:
    200 ; CHECK-NEXT:    kmovq %rdi, %k0
    201 ; CHECK-NEXT:    kmovq %rsi, %k1
    202 ; CHECK-NEXT:    kxorq %k1, %k0, %k0
    203 ; CHECK-NEXT:    kmovq %k0, %rax
    204 ; CHECK-NEXT:    retq
    205   %m0 = bitcast i64 %x to <64 x i1>
    206   %m1 = bitcast i64 %y to <64 x i1>
    207   %m2 = add <64 x i1> %m0,  %m1
    208   %ret = bitcast <64 x i1> %m2 to i64
    209   ret i64 %ret
    210 }
    211 
    212 define i64 @test_v64i1_sub(i64 %x, i64 %y) {
    213 ; CHECK-LABEL: test_v64i1_sub:
    214 ; CHECK:       ## %bb.0:
    215 ; CHECK-NEXT:    kmovq %rdi, %k0
    216 ; CHECK-NEXT:    kmovq %rsi, %k1
    217 ; CHECK-NEXT:    kxorq %k1, %k0, %k0
    218 ; CHECK-NEXT:    kmovq %k0, %rax
    219 ; CHECK-NEXT:    retq
    220   %m0 = bitcast i64 %x to <64 x i1>
    221   %m1 = bitcast i64 %y to <64 x i1>
    222   %m2 = sub <64 x i1> %m0,  %m1
    223   %ret = bitcast <64 x i1> %m2 to i64
    224   ret i64 %ret
    225 }
    226 
    227 define i64 @test_v64i1_mul(i64 %x, i64 %y) {
    228 ; CHECK-LABEL: test_v64i1_mul:
    229 ; CHECK:       ## %bb.0:
    230 ; CHECK-NEXT:    kmovq %rdi, %k0
    231 ; CHECK-NEXT:    kmovq %rsi, %k1
    232 ; CHECK-NEXT:    kandq %k1, %k0, %k0
    233 ; CHECK-NEXT:    kmovq %k0, %rax
    234 ; CHECK-NEXT:    retq
    235   %m0 = bitcast i64 %x to <64 x i1>
    236   %m1 = bitcast i64 %y to <64 x i1>
    237   %m2 = mul <64 x i1> %m0,  %m1
    238   %ret = bitcast <64 x i1> %m2 to i64
    239   ret i64 %ret
    240 }
    241