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:    kmovd %edi, %k0
      8 ; CHECK-NEXT:    knotd %k0, %k0
      9 ; CHECK-NEXT:    kmovd %k0, %eax
     10 ; CHECK-NEXT:    retq
     11   %m0 = bitcast i32 %x to <32 x i1>
     12   %m1 = xor <32 x i1> %m0, <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                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
     16   %ret = bitcast <32 x i1> %m1 to i32
     17   ret i32 %ret
     18 }
     19 
     20 define i64 @mask64(i64 %x) {
     21 ; CHECK-LABEL: mask64:
     22 ; CHECK:       ## BB#0:
     23 ; CHECK-NEXT:    kmovq %rdi, %k0
     24 ; CHECK-NEXT:    knotq %k0, %k0
     25 ; CHECK-NEXT:    kmovq %k0, %rax
     26 ; CHECK-NEXT:    retq
     27   %m0 = bitcast i64 %x to <64 x i1>
     28   %m1 = xor <64 x i1> %m0, <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                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     35                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
     36   %ret = bitcast <64 x i1> %m1 to i64
     37   ret i64 %ret
     38 }
     39 
     40 define void @mask32_mem(i32* %ptr) {
     41 ; CHECK-LABEL: mask32_mem:
     42 ; CHECK:       ## BB#0:
     43 ; CHECK-NEXT:    kmovd (%rdi), %k0
     44 ; CHECK-NEXT:    knotd %k0, %k0
     45 ; CHECK-NEXT:    kmovd %k0, (%rdi)
     46 ; CHECK-NEXT:    retq
     47   %x = load i32, i32* %ptr, align 4
     48   %m0 = bitcast i32 %x to <32 x i1>
     49   %m1 = xor <32 x i1> %m0, <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                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     52                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
     53   %ret = bitcast <32 x i1> %m1 to i32
     54   store i32 %ret, i32* %ptr, align 4
     55   ret void
     56 }
     57 
     58 define void @mask64_mem(i64* %ptr) {
     59 ; CHECK-LABEL: mask64_mem:
     60 ; CHECK:       ## BB#0:
     61 ; CHECK-NEXT:    kmovq (%rdi), %k0
     62 ; CHECK-NEXT:    knotq %k0, %k0
     63 ; CHECK-NEXT:    kmovq %k0, (%rdi)
     64 ; CHECK-NEXT:    retq
     65   %x = load i64, i64* %ptr, align 4
     66   %m0 = bitcast i64 %x to <64 x i1>
     67   %m1 = xor <64 x i1> %m0, <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                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     74                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
     75   %ret = bitcast <64 x i1> %m1 to i64
     76   store i64 %ret, i64* %ptr, align 4
     77   ret void
     78 }
     79 
     80 define i32 @mand32(i32 %x, i32 %y) {
     81 ; CHECK-LABEL: mand32:
     82 ; CHECK:       ## BB#0:
     83 ; CHECK-NEXT:    movl %edi, %eax
     84 ; CHECK-NEXT:    andl %esi, %eax
     85 ; CHECK-NEXT:    xorl %esi, %edi
     86 ; CHECK-NEXT:    orl %eax, %edi
     87 ; CHECK-NEXT:    movl %edi, %eax
     88 ; CHECK-NEXT:    retq
     89   %ma = bitcast i32 %x to <32 x i1>
     90   %mb = bitcast i32 %y to <32 x i1>
     91   %mc = and <32 x i1> %ma, %mb
     92   %md = xor <32 x i1> %ma, %mb
     93   %me = or <32 x i1> %mc, %md
     94   %ret = bitcast <32 x i1> %me to i32
     95   ret i32 %ret
     96 }
     97 
     98 define i32 @mand32_mem(<32 x i1>* %x, <32 x i1>* %y) {
     99 ; CHECK-LABEL: mand32_mem:
    100 ; CHECK:       ## BB#0:
    101 ; CHECK-NEXT:    kmovd (%rdi), %k0
    102 ; CHECK-NEXT:    kmovd (%rsi), %k1
    103 ; CHECK-NEXT:    kandd %k1, %k0, %k2
    104 ; CHECK-NEXT:    kxord %k1, %k0, %k0
    105 ; CHECK-NEXT:    kord %k0, %k2, %k0
    106 ; CHECK-NEXT:    kmovd %k0, %eax
    107 ; CHECK-NEXT:    retq
    108   %ma = load <32 x i1>, <32 x i1>* %x
    109   %mb = load <32 x i1>, <32 x i1>* %y
    110   %mc = and <32 x i1> %ma, %mb
    111   %md = xor <32 x i1> %ma, %mb
    112   %me = or <32 x i1> %mc, %md
    113   %ret = bitcast <32 x i1> %me to i32
    114   ret i32 %ret
    115 }
    116 
    117 define i64 @mand64(i64 %x, i64 %y) {
    118 ; CHECK-LABEL: mand64:
    119 ; CHECK:       ## BB#0:
    120 ; CHECK-NEXT:    movq %rdi, %rax
    121 ; CHECK-NEXT:    andq %rsi, %rax
    122 ; CHECK-NEXT:    xorq %rsi, %rdi
    123 ; CHECK-NEXT:    orq %rax, %rdi
    124 ; CHECK-NEXT:    movq %rdi, %rax
    125 ; CHECK-NEXT:    retq
    126   %ma = bitcast i64 %x to <64 x i1>
    127   %mb = bitcast i64 %y to <64 x i1>
    128   %mc = and <64 x i1> %ma, %mb
    129   %md = xor <64 x i1> %ma, %mb
    130   %me = or <64 x i1> %mc, %md
    131   %ret = bitcast <64 x i1> %me to i64
    132   ret i64 %ret
    133 }
    134 
    135 define i64 @mand64_mem(<64 x i1>* %x, <64 x i1>* %y) {
    136 ; CHECK-LABEL: mand64_mem:
    137 ; CHECK:       ## BB#0:
    138 ; CHECK-NEXT:    kmovq (%rdi), %k0
    139 ; CHECK-NEXT:    kmovq (%rsi), %k1
    140 ; CHECK-NEXT:    kandq %k1, %k0, %k2
    141 ; CHECK-NEXT:    kxorq %k1, %k0, %k0
    142 ; CHECK-NEXT:    korq %k0, %k2, %k0
    143 ; CHECK-NEXT:    kmovq %k0, %rax
    144 ; CHECK-NEXT:    retq
    145   %ma = load <64 x i1>, <64 x i1>* %x
    146   %mb = load <64 x i1>, <64 x i1>* %y
    147   %mc = and <64 x i1> %ma, %mb
    148   %md = xor <64 x i1> %ma, %mb
    149   %me = or <64 x i1> %mc, %md
    150   %ret = bitcast <64 x i1> %me to i64
    151   ret i64 %ret
    152 }
    153