267 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-apple-darwin -mcpu=skx | FileCheck %s3 4define i32 @mask32(i32 %x) {5; CHECK-LABEL: mask32:6; CHECK: ## %bb.0:7; CHECK-NEXT: movl %edi, %eax8; CHECK-NEXT: notl %eax9; CHECK-NEXT: retq10 %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 i3216 ret i32 %ret17}18 19define i64 @mask64(i64 %x) {20; CHECK-LABEL: mask64:21; CHECK: ## %bb.0:22; CHECK-NEXT: movq %rdi, %rax23; CHECK-NEXT: notq %rax24; CHECK-NEXT: retq25 %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 i6435 ret i64 %ret36}37 38define void @mask32_mem(ptr %ptr) {39; CHECK-LABEL: mask32_mem:40; CHECK: ## %bb.0:41; CHECK-NEXT: kmovd (%rdi), %k042; CHECK-NEXT: knotd %k0, %k043; CHECK-NEXT: kmovd %k0, (%rdi)44; CHECK-NEXT: retq45 %x = load i32, ptr %ptr, align 446 %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 i3252 store i32 %ret, ptr %ptr, align 453 ret void54}55 56define void @mask64_mem(ptr %ptr) {57; CHECK-LABEL: mask64_mem:58; CHECK: ## %bb.0:59; CHECK-NEXT: kmovq (%rdi), %k060; CHECK-NEXT: knotq %k0, %k061; CHECK-NEXT: kmovq %k0, (%rdi)62; CHECK-NEXT: retq63 %x = load i64, ptr %ptr, align 464 %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 i6474 store i64 %ret, ptr %ptr, align 475 ret void76}77 78define i32 @mand32(i32 %x, i32 %y) {79; CHECK-LABEL: mand32:80; CHECK: ## %bb.0:81; CHECK-NEXT: movl %edi, %eax82; CHECK-NEXT: orl %esi, %eax83; CHECK-NEXT: retq84 %ma = bitcast i32 %x to <32 x i1>85 %mb = bitcast i32 %y to <32 x i1>86 %mc = and <32 x i1> %ma, %mb87 %md = xor <32 x i1> %ma, %mb88 %me = or <32 x i1> %mc, %md89 %ret = bitcast <32 x i1> %me to i3290 ret i32 %ret91}92 93define i32 @mand32_mem(ptr %x, ptr %y) {94; CHECK-LABEL: mand32_mem:95; CHECK: ## %bb.0:96; CHECK-NEXT: kmovd (%rdi), %k097; CHECK-NEXT: kmovd (%rsi), %k198; CHECK-NEXT: kord %k1, %k0, %k099; CHECK-NEXT: kmovd %k0, %eax100; CHECK-NEXT: retq101 %ma = load <32 x i1>, ptr %x102 %mb = load <32 x i1>, ptr %y103 %mc = and <32 x i1> %ma, %mb104 %md = xor <32 x i1> %ma, %mb105 %me = or <32 x i1> %mc, %md106 %ret = bitcast <32 x i1> %me to i32107 ret i32 %ret108}109 110define i64 @mand64(i64 %x, i64 %y) {111; CHECK-LABEL: mand64:112; CHECK: ## %bb.0:113; CHECK-NEXT: movq %rdi, %rax114; CHECK-NEXT: orq %rsi, %rax115; CHECK-NEXT: retq116 %ma = bitcast i64 %x to <64 x i1>117 %mb = bitcast i64 %y to <64 x i1>118 %mc = and <64 x i1> %ma, %mb119 %md = xor <64 x i1> %ma, %mb120 %me = or <64 x i1> %mc, %md121 %ret = bitcast <64 x i1> %me to i64122 ret i64 %ret123}124 125define i64 @mand64_mem(ptr %x, ptr %y) {126; CHECK-LABEL: mand64_mem:127; CHECK: ## %bb.0:128; CHECK-NEXT: kmovq (%rdi), %k0129; CHECK-NEXT: kmovq (%rsi), %k1130; CHECK-NEXT: korq %k1, %k0, %k0131; CHECK-NEXT: kmovq %k0, %rax132; CHECK-NEXT: retq133 %ma = load <64 x i1>, ptr %x134 %mb = load <64 x i1>, ptr %y135 %mc = and <64 x i1> %ma, %mb136 %md = xor <64 x i1> %ma, %mb137 %me = or <64 x i1> %mc, %md138 %ret = bitcast <64 x i1> %me to i64139 ret i64 %ret140}141 142define i32 @test_v32i1_add(i32 %x, i32 %y) {143; CHECK-LABEL: test_v32i1_add:144; CHECK: ## %bb.0:145; CHECK-NEXT: movl %edi, %eax146; CHECK-NEXT: xorl %esi, %eax147; CHECK-NEXT: retq148 %m0 = bitcast i32 %x to <32 x i1>149 %m1 = bitcast i32 %y to <32 x i1>150 %m2 = add <32 x i1> %m0, %m1151 %ret = bitcast <32 x i1> %m2 to i32152 ret i32 %ret153}154 155define i32 @test_v32i1_sub(i32 %x, i32 %y) {156; CHECK-LABEL: test_v32i1_sub:157; CHECK: ## %bb.0:158; CHECK-NEXT: movl %edi, %eax159; CHECK-NEXT: xorl %esi, %eax160; CHECK-NEXT: retq161 %m0 = bitcast i32 %x to <32 x i1>162 %m1 = bitcast i32 %y to <32 x i1>163 %m2 = sub <32 x i1> %m0, %m1164 %ret = bitcast <32 x i1> %m2 to i32165 ret i32 %ret166}167 168define i32 @test_v32i1_mul(i32 %x, i32 %y) {169; CHECK-LABEL: test_v32i1_mul:170; CHECK: ## %bb.0:171; CHECK-NEXT: movl %edi, %eax172; CHECK-NEXT: andl %esi, %eax173; CHECK-NEXT: retq174 %m0 = bitcast i32 %x to <32 x i1>175 %m1 = bitcast i32 %y to <32 x i1>176 %m2 = mul <32 x i1> %m0, %m1177 %ret = bitcast <32 x i1> %m2 to i32178 ret i32 %ret179}180 181define i64 @test_v64i1_add(i64 %x, i64 %y) {182; CHECK-LABEL: test_v64i1_add:183; CHECK: ## %bb.0:184; CHECK-NEXT: movq %rdi, %rax185; CHECK-NEXT: xorq %rsi, %rax186; CHECK-NEXT: retq187 %m0 = bitcast i64 %x to <64 x i1>188 %m1 = bitcast i64 %y to <64 x i1>189 %m2 = add <64 x i1> %m0, %m1190 %ret = bitcast <64 x i1> %m2 to i64191 ret i64 %ret192}193 194define i64 @test_v64i1_sub(i64 %x, i64 %y) {195; CHECK-LABEL: test_v64i1_sub:196; CHECK: ## %bb.0:197; CHECK-NEXT: movq %rdi, %rax198; CHECK-NEXT: xorq %rsi, %rax199; CHECK-NEXT: retq200 %m0 = bitcast i64 %x to <64 x i1>201 %m1 = bitcast i64 %y to <64 x i1>202 %m2 = sub <64 x i1> %m0, %m1203 %ret = bitcast <64 x i1> %m2 to i64204 ret i64 %ret205}206 207define i64 @test_v64i1_mul(i64 %x, i64 %y) {208; CHECK-LABEL: test_v64i1_mul:209; CHECK: ## %bb.0:210; CHECK-NEXT: movq %rdi, %rax211; CHECK-NEXT: andq %rsi, %rax212; CHECK-NEXT: retq213 %m0 = bitcast i64 %x to <64 x i1>214 %m1 = bitcast i64 %y to <64 x i1>215 %m2 = mul <64 x i1> %m0, %m1216 %ret = bitcast <64 x i1> %m2 to i64217 ret i64 %ret218}219 220define <32 x i1> @bitcast_f32_to_v32i1(float %x) {221; CHECK-LABEL: bitcast_f32_to_v32i1:222; CHECK: ## %bb.0:223; CHECK-NEXT: vmovd %xmm0, %eax224; CHECK-NEXT: kmovd %eax, %k0225; CHECK-NEXT: vpmovm2b %k0, %ymm0226; CHECK-NEXT: retq227 %a = bitcast float %x to <32 x i1>228 ret <32 x i1> %a229}230 231define <64 x i1> @bitcast_f64_to_v64i1(double %x) {232; CHECK-LABEL: bitcast_f64_to_v64i1:233; CHECK: ## %bb.0:234; CHECK-NEXT: vmovq %xmm0, %rax235; CHECK-NEXT: kmovq %rax, %k0236; CHECK-NEXT: vpmovm2b %k0, %zmm0237; CHECK-NEXT: retq238 %a = bitcast double %x to <64 x i1>239 ret <64 x i1> %a240}241 242define float @bitcast_v32i1_to_f32(<32 x i1> %x) {243; CHECK-LABEL: bitcast_v32i1_to_f32:244; CHECK: ## %bb.0:245; CHECK-NEXT: vpsllw $7, %ymm0, %ymm0246; CHECK-NEXT: vpmovmskb %ymm0, %eax247; CHECK-NEXT: vmovd %eax, %xmm0248; CHECK-NEXT: vzeroupper249; CHECK-NEXT: retq250 %a = bitcast <32 x i1> %x to float251 ret float %a252}253 254define double @bitcast_v64i1_to_f64(<64 x i1> %x) {255; CHECK-LABEL: bitcast_v64i1_to_f64:256; CHECK: ## %bb.0:257; CHECK-NEXT: vpsllw $7, %zmm0, %zmm0258; CHECK-NEXT: vpmovb2m %zmm0, %k0259; CHECK-NEXT: kmovq %k0, %rax260; CHECK-NEXT: vmovq %rax, %xmm0261; CHECK-NEXT: vzeroupper262; CHECK-NEXT: retq263 %a = bitcast <64 x i1> %x to double264 ret double %a265}266 267