Home | History | Annotate | Download | only in X86
      1 ; RUN: llc < %s -march=x86-64 -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s
      2 
      3 define i32 @mask32(i32 %x) {
      4   %m0 = bitcast i32 %x to <32 x i1>
      5   %m1 = xor <32 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
      6                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
      7                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
      8                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
      9   %ret = bitcast <32 x i1> %m1 to i32
     10   ret i32 %ret
     11 ; CHECK-LABEL: mask32
     12 ; CHECK: kmovd
     13 ; CHECK-NEXT: knotd
     14 ; CHECK-NEXT: kmovd
     15 ; CHECK_NEXT: ret
     16 }
     17 
     18 define i64 @mask64(i64 %x) {
     19   %m0 = bitcast i64 %x to <64 x i1>
     20   %m1 = xor <64 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     21                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     22                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     23                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     24                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     25                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     26                             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   %ret = bitcast <64 x i1> %m1 to i64
     29   ret i64 %ret
     30 ; CHECK-LABEL: mask64
     31 ; CHECK: kmovq
     32 ; CHECK-NEXT: knotq
     33 ; CHECK-NEXT: kmovq
     34 ; CHECK_NEXT: ret
     35 }
     36 
     37 define void @mask32_mem(i32* %ptr) {
     38   %x = load i32, i32* %ptr, align 4
     39   %m0 = bitcast i32 %x to <32 x i1>
     40   %m1 = xor <32 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     41                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     42                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     43                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
     44   %ret = bitcast <32 x i1> %m1 to i32
     45   store i32 %ret, i32* %ptr, align 4
     46   ret void
     47 ; CHECK-LABEL: mask32_mem
     48 ; CHECK: kmovd ([[ARG1:%rdi|%rcx]]), %k{{[0-7]}}
     49 ; CHECK-NEXT: knotd
     50 ; CHECK-NEXT: kmovd %k{{[0-7]}}, ([[ARG1]])
     51 ; CHECK_NEXT: ret
     52 }
     53 
     54 define void @mask64_mem(i64* %ptr) {
     55   %x = load i64, i64* %ptr, align 4
     56   %m0 = bitcast i64 %x to <64 x i1>
     57   %m1 = xor <64 x i1> %m0, <i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     58                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     59                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     60                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     61                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     62                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     63                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1,
     64                             i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1, i1 -1>
     65   %ret = bitcast <64 x i1> %m1 to i64
     66   store i64 %ret, i64* %ptr, align 4
     67   ret void
     68 ; CHECK-LABEL: mask64_mem
     69 ; CHECK: kmovq ([[ARG1]]), %k{{[0-7]}}
     70 ; CHECK-NEXT: knotq
     71 ; CHECK-NEXT: kmovq %k{{[0-7]}}, ([[ARG1]])
     72 ; CHECK_NEXT: ret
     73 }
     74 
     75 define i32 @mand32(i32 %x, i32 %y) {
     76   %ma = bitcast i32 %x to <32 x i1>
     77   %mb = bitcast i32 %y to <32 x i1>
     78   %mc = and <32 x i1> %ma, %mb
     79   %md = xor <32 x i1> %ma, %mb
     80   %me = or <32 x i1> %mc, %md
     81   %ret = bitcast <32 x i1> %me to i32
     82 ; CHECK: kandd
     83 ; CHECK: kxord
     84 ; CHECK: kord
     85   ret i32 %ret
     86 }
     87 
     88 define i64 @mand64(i64 %x, i64 %y) {
     89   %ma = bitcast i64 %x to <64 x i1>
     90   %mb = bitcast i64 %y to <64 x i1>
     91   %mc = and <64 x i1> %ma, %mb
     92   %md = xor <64 x i1> %ma, %mb
     93   %me = or <64 x i1> %mc, %md
     94   %ret = bitcast <64 x i1> %me to i64
     95 ; CHECK: kandq
     96 ; CHECK: kxorq
     97 ; CHECK: korq
     98   ret i64 %ret
     99 }
    100