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 <32 x i8> @test256_1(<32 x i8> %x, <32 x i8> %y) nounwind { 5 ; CHECK-LABEL: test256_1: 6 ; CHECK: ## BB#0: 7 ; CHECK-NEXT: vpcmpeqb %ymm1, %ymm0, %k1 8 ; CHECK-NEXT: vpblendmb %ymm0, %ymm1, %ymm0 {%k1} 9 ; CHECK-NEXT: retq 10 %mask = icmp eq <32 x i8> %x, %y 11 %max = select <32 x i1> %mask, <32 x i8> %x, <32 x i8> %y 12 ret <32 x i8> %max 13 } 14 15 define <32 x i8> @test256_2(<32 x i8> %x, <32 x i8> %y, <32 x i8> %x1) nounwind { 16 ; CHECK-LABEL: test256_2: 17 ; CHECK: ## BB#0: 18 ; CHECK-NEXT: vpcmpgtb %ymm1, %ymm0, %k1 19 ; CHECK-NEXT: vpblendmb %ymm0, %ymm2, %ymm0 {%k1} 20 ; CHECK-NEXT: retq 21 %mask = icmp sgt <32 x i8> %x, %y 22 %max = select <32 x i1> %mask, <32 x i8> %x, <32 x i8> %x1 23 ret <32 x i8> %max 24 } 25 26 define <16 x i16> @test256_3(<16 x i16> %x, <16 x i16> %y, <16 x i16> %x1) nounwind { 27 ; CHECK-LABEL: test256_3: 28 ; CHECK: ## BB#0: 29 ; CHECK-NEXT: vpcmplew %ymm0, %ymm1, %k1 30 ; CHECK-NEXT: vpblendmw %ymm2, %ymm1, %ymm0 {%k1} 31 ; CHECK-NEXT: retq 32 %mask = icmp sge <16 x i16> %x, %y 33 %max = select <16 x i1> %mask, <16 x i16> %x1, <16 x i16> %y 34 ret <16 x i16> %max 35 } 36 37 define <32 x i8> @test256_4(<32 x i8> %x, <32 x i8> %y, <32 x i8> %x1) nounwind { 38 ; CHECK-LABEL: test256_4: 39 ; CHECK: ## BB#0: 40 ; CHECK-NEXT: vpcmpnleub %ymm1, %ymm0, %k1 41 ; CHECK-NEXT: vpblendmb %ymm0, %ymm2, %ymm0 {%k1} 42 ; CHECK-NEXT: retq 43 %mask = icmp ugt <32 x i8> %x, %y 44 %max = select <32 x i1> %mask, <32 x i8> %x, <32 x i8> %x1 45 ret <32 x i8> %max 46 } 47 48 define <16 x i16> @test256_5(<16 x i16> %x, <16 x i16> %x1, <16 x i16>* %yp) nounwind { 49 ; CHECK-LABEL: test256_5: 50 ; CHECK: ## BB#0: 51 ; CHECK-NEXT: vpcmpeqw (%rdi), %ymm0, %k1 52 ; CHECK-NEXT: vpblendmw %ymm0, %ymm1, %ymm0 {%k1} 53 ; CHECK-NEXT: retq 54 %y = load <16 x i16>, <16 x i16>* %yp, align 4 55 %mask = icmp eq <16 x i16> %x, %y 56 %max = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> %x1 57 ret <16 x i16> %max 58 } 59 60 define <16 x i16> @test256_6(<16 x i16> %x, <16 x i16> %x1, <16 x i16>* %y.ptr) nounwind { 61 ; CHECK-LABEL: test256_6: 62 ; CHECK: ## BB#0: 63 ; CHECK-NEXT: vpcmpgtw (%rdi), %ymm0, %k1 64 ; CHECK-NEXT: vpblendmw %ymm0, %ymm1, %ymm0 {%k1} 65 ; CHECK-NEXT: retq 66 %y = load <16 x i16>, <16 x i16>* %y.ptr, align 4 67 %mask = icmp sgt <16 x i16> %x, %y 68 %max = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> %x1 69 ret <16 x i16> %max 70 } 71 72 define <16 x i16> @test256_7(<16 x i16> %x, <16 x i16> %x1, <16 x i16>* %y.ptr) nounwind { 73 ; CHECK-LABEL: test256_7: 74 ; CHECK: ## BB#0: 75 ; CHECK-NEXT: vpcmplew (%rdi), %ymm0, %k1 76 ; CHECK-NEXT: vpblendmw %ymm0, %ymm1, %ymm0 {%k1} 77 ; CHECK-NEXT: retq 78 %y = load <16 x i16>, <16 x i16>* %y.ptr, align 4 79 %mask = icmp sle <16 x i16> %x, %y 80 %max = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> %x1 81 ret <16 x i16> %max 82 } 83 84 define <16 x i16> @test256_8(<16 x i16> %x, <16 x i16> %x1, <16 x i16>* %y.ptr) nounwind { 85 ; CHECK-LABEL: test256_8: 86 ; CHECK: ## BB#0: 87 ; CHECK-NEXT: vpcmpleuw (%rdi), %ymm0, %k1 88 ; CHECK-NEXT: vpblendmw %ymm0, %ymm1, %ymm0 {%k1} 89 ; CHECK-NEXT: retq 90 %y = load <16 x i16>, <16 x i16>* %y.ptr, align 4 91 %mask = icmp ule <16 x i16> %x, %y 92 %max = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> %x1 93 ret <16 x i16> %max 94 } 95 96 define <16 x i16> @test256_9(<16 x i16> %x, <16 x i16> %y, <16 x i16> %x1, <16 x i16> %y1) nounwind { 97 ; CHECK-LABEL: test256_9: 98 ; CHECK: ## BB#0: 99 ; CHECK-NEXT: vpcmpeqw %ymm1, %ymm0, %k1 100 ; CHECK-NEXT: vpcmpeqw %ymm3, %ymm2, %k1 {%k1} 101 ; CHECK-NEXT: vpblendmw %ymm0, %ymm1, %ymm0 {%k1} 102 ; CHECK-NEXT: retq 103 %mask1 = icmp eq <16 x i16> %x1, %y1 104 %mask0 = icmp eq <16 x i16> %x, %y 105 %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer 106 %max = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> %y 107 ret <16 x i16> %max 108 } 109 110 define <32 x i8> @test256_10(<32 x i8> %x, <32 x i8> %y, <32 x i8> %x1, <32 x i8> %y1) nounwind { 111 ; CHECK-LABEL: test256_10: 112 ; CHECK: ## BB#0: 113 ; CHECK-NEXT: vpcmpleb %ymm1, %ymm0, %k1 114 ; CHECK-NEXT: vpcmpleb %ymm2, %ymm3, %k1 {%k1} 115 ; CHECK-NEXT: vpblendmb %ymm0, %ymm2, %ymm0 {%k1} 116 ; CHECK-NEXT: retq 117 %mask1 = icmp sge <32 x i8> %x1, %y1 118 %mask0 = icmp sle <32 x i8> %x, %y 119 %mask = select <32 x i1> %mask0, <32 x i1> %mask1, <32 x i1> zeroinitializer 120 %max = select <32 x i1> %mask, <32 x i8> %x, <32 x i8> %x1 121 ret <32 x i8> %max 122 } 123 124 define <32 x i8> @test256_11(<32 x i8> %x, <32 x i8>* %y.ptr, <32 x i8> %x1, <32 x i8> %y1) nounwind { 125 ; CHECK-LABEL: test256_11: 126 ; CHECK: ## BB#0: 127 ; CHECK-NEXT: vpcmpgtb %ymm2, %ymm1, %k1 128 ; CHECK-NEXT: vpcmpgtb (%rdi), %ymm0, %k1 {%k1} 129 ; CHECK-NEXT: vpblendmb %ymm0, %ymm1, %ymm0 {%k1} 130 ; CHECK-NEXT: retq 131 %mask1 = icmp sgt <32 x i8> %x1, %y1 132 %y = load <32 x i8>, <32 x i8>* %y.ptr, align 4 133 %mask0 = icmp sgt <32 x i8> %x, %y 134 %mask = select <32 x i1> %mask0, <32 x i1> %mask1, <32 x i1> zeroinitializer 135 %max = select <32 x i1> %mask, <32 x i8> %x, <32 x i8> %x1 136 ret <32 x i8> %max 137 } 138 139 define <16 x i16> @test256_12(<16 x i16> %x, <16 x i16>* %y.ptr, <16 x i16> %x1, <16 x i16> %y1) nounwind { 140 ; CHECK-LABEL: test256_12: 141 ; CHECK: ## BB#0: 142 ; CHECK-NEXT: vpcmplew %ymm1, %ymm2, %k1 143 ; CHECK-NEXT: vpcmpleuw (%rdi), %ymm0, %k1 {%k1} 144 ; CHECK-NEXT: vpblendmw %ymm0, %ymm1, %ymm0 {%k1} 145 ; CHECK-NEXT: retq 146 %mask1 = icmp sge <16 x i16> %x1, %y1 147 %y = load <16 x i16>, <16 x i16>* %y.ptr, align 4 148 %mask0 = icmp ule <16 x i16> %x, %y 149 %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer 150 %max = select <16 x i1> %mask, <16 x i16> %x, <16 x i16> %x1 151 ret <16 x i16> %max 152 } 153 154 define <16 x i8> @test128_1(<16 x i8> %x, <16 x i8> %y) nounwind { 155 ; CHECK-LABEL: test128_1: 156 ; CHECK: ## BB#0: 157 ; CHECK-NEXT: vpcmpeqb %xmm1, %xmm0, %k1 158 ; CHECK-NEXT: vpblendmb %xmm0, %xmm1, %xmm0 {%k1} 159 ; CHECK-NEXT: retq 160 %mask = icmp eq <16 x i8> %x, %y 161 %max = select <16 x i1> %mask, <16 x i8> %x, <16 x i8> %y 162 ret <16 x i8> %max 163 } 164 165 define <16 x i8> @test128_2(<16 x i8> %x, <16 x i8> %y, <16 x i8> %x1) nounwind { 166 ; CHECK-LABEL: test128_2: 167 ; CHECK: ## BB#0: 168 ; CHECK-NEXT: vpcmpgtb %xmm1, %xmm0, %k1 169 ; CHECK-NEXT: vpblendmb %xmm0, %xmm2, %xmm0 {%k1} 170 ; CHECK-NEXT: retq 171 %mask = icmp sgt <16 x i8> %x, %y 172 %max = select <16 x i1> %mask, <16 x i8> %x, <16 x i8> %x1 173 ret <16 x i8> %max 174 } 175 176 define <8 x i16> @test128_3(<8 x i16> %x, <8 x i16> %y, <8 x i16> %x1) nounwind { 177 ; CHECK-LABEL: test128_3: 178 ; CHECK: ## BB#0: 179 ; CHECK-NEXT: vpcmplew %xmm0, %xmm1, %k1 180 ; CHECK-NEXT: vpblendmw %xmm2, %xmm1, %xmm0 {%k1} 181 ; CHECK-NEXT: retq 182 %mask = icmp sge <8 x i16> %x, %y 183 %max = select <8 x i1> %mask, <8 x i16> %x1, <8 x i16> %y 184 ret <8 x i16> %max 185 } 186 187 define <16 x i8> @test128_4(<16 x i8> %x, <16 x i8> %y, <16 x i8> %x1) nounwind { 188 ; CHECK-LABEL: test128_4: 189 ; CHECK: ## BB#0: 190 ; CHECK-NEXT: vpcmpnleub %xmm1, %xmm0, %k1 191 ; CHECK-NEXT: vpblendmb %xmm0, %xmm2, %xmm0 {%k1} 192 ; CHECK-NEXT: retq 193 %mask = icmp ugt <16 x i8> %x, %y 194 %max = select <16 x i1> %mask, <16 x i8> %x, <16 x i8> %x1 195 ret <16 x i8> %max 196 } 197 198 define <8 x i16> @test128_5(<8 x i16> %x, <8 x i16> %x1, <8 x i16>* %yp) nounwind { 199 ; CHECK-LABEL: test128_5: 200 ; CHECK: ## BB#0: 201 ; CHECK-NEXT: vpcmpeqw (%rdi), %xmm0, %k1 202 ; CHECK-NEXT: vpblendmw %xmm0, %xmm1, %xmm0 {%k1} 203 ; CHECK-NEXT: retq 204 %y = load <8 x i16>, <8 x i16>* %yp, align 4 205 %mask = icmp eq <8 x i16> %x, %y 206 %max = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> %x1 207 ret <8 x i16> %max 208 } 209 210 define <8 x i16> @test128_6(<8 x i16> %x, <8 x i16> %x1, <8 x i16>* %y.ptr) nounwind { 211 ; CHECK-LABEL: test128_6: 212 ; CHECK: ## BB#0: 213 ; CHECK-NEXT: vpcmpgtw (%rdi), %xmm0, %k1 214 ; CHECK-NEXT: vpblendmw %xmm0, %xmm1, %xmm0 {%k1} 215 ; CHECK-NEXT: retq 216 %y = load <8 x i16>, <8 x i16>* %y.ptr, align 4 217 %mask = icmp sgt <8 x i16> %x, %y 218 %max = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> %x1 219 ret <8 x i16> %max 220 } 221 222 define <8 x i16> @test128_7(<8 x i16> %x, <8 x i16> %x1, <8 x i16>* %y.ptr) nounwind { 223 ; CHECK-LABEL: test128_7: 224 ; CHECK: ## BB#0: 225 ; CHECK-NEXT: vpcmplew (%rdi), %xmm0, %k1 226 ; CHECK-NEXT: vpblendmw %xmm0, %xmm1, %xmm0 {%k1} 227 ; CHECK-NEXT: retq 228 %y = load <8 x i16>, <8 x i16>* %y.ptr, align 4 229 %mask = icmp sle <8 x i16> %x, %y 230 %max = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> %x1 231 ret <8 x i16> %max 232 } 233 234 define <8 x i16> @test128_8(<8 x i16> %x, <8 x i16> %x1, <8 x i16>* %y.ptr) nounwind { 235 ; CHECK-LABEL: test128_8: 236 ; CHECK: ## BB#0: 237 ; CHECK-NEXT: vpcmpleuw (%rdi), %xmm0, %k1 238 ; CHECK-NEXT: vpblendmw %xmm0, %xmm1, %xmm0 {%k1} 239 ; CHECK-NEXT: retq 240 %y = load <8 x i16>, <8 x i16>* %y.ptr, align 4 241 %mask = icmp ule <8 x i16> %x, %y 242 %max = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> %x1 243 ret <8 x i16> %max 244 } 245 246 define <8 x i16> @test128_9(<8 x i16> %x, <8 x i16> %y, <8 x i16> %x1, <8 x i16> %y1) nounwind { 247 ; CHECK-LABEL: test128_9: 248 ; CHECK: ## BB#0: 249 ; CHECK-NEXT: vpcmpeqw %xmm1, %xmm0, %k1 250 ; CHECK-NEXT: vpcmpeqw %xmm3, %xmm2, %k1 {%k1} 251 ; CHECK-NEXT: vpblendmw %xmm0, %xmm1, %xmm0 {%k1} 252 ; CHECK-NEXT: retq 253 %mask1 = icmp eq <8 x i16> %x1, %y1 254 %mask0 = icmp eq <8 x i16> %x, %y 255 %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer 256 %max = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> %y 257 ret <8 x i16> %max 258 } 259 260 define <16 x i8> @test128_10(<16 x i8> %x, <16 x i8> %y, <16 x i8> %x1, <16 x i8> %y1) nounwind { 261 ; CHECK-LABEL: test128_10: 262 ; CHECK: ## BB#0: 263 ; CHECK-NEXT: vpcmpleb %xmm1, %xmm0, %k1 264 ; CHECK-NEXT: vpcmpleb %xmm2, %xmm3, %k1 {%k1} 265 ; CHECK-NEXT: vpblendmb %xmm0, %xmm2, %xmm0 {%k1} 266 ; CHECK-NEXT: retq 267 %mask1 = icmp sge <16 x i8> %x1, %y1 268 %mask0 = icmp sle <16 x i8> %x, %y 269 %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer 270 %max = select <16 x i1> %mask, <16 x i8> %x, <16 x i8> %x1 271 ret <16 x i8> %max 272 } 273 274 define <16 x i8> @test128_11(<16 x i8> %x, <16 x i8>* %y.ptr, <16 x i8> %x1, <16 x i8> %y1) nounwind { 275 ; CHECK-LABEL: test128_11: 276 ; CHECK: ## BB#0: 277 ; CHECK-NEXT: vpcmpgtb %xmm2, %xmm1, %k1 278 ; CHECK-NEXT: vpcmpgtb (%rdi), %xmm0, %k1 {%k1} 279 ; CHECK-NEXT: vpblendmb %xmm0, %xmm1, %xmm0 {%k1} 280 ; CHECK-NEXT: retq 281 %mask1 = icmp sgt <16 x i8> %x1, %y1 282 %y = load <16 x i8>, <16 x i8>* %y.ptr, align 4 283 %mask0 = icmp sgt <16 x i8> %x, %y 284 %mask = select <16 x i1> %mask0, <16 x i1> %mask1, <16 x i1> zeroinitializer 285 %max = select <16 x i1> %mask, <16 x i8> %x, <16 x i8> %x1 286 ret <16 x i8> %max 287 } 288 289 define <8 x i16> @test128_12(<8 x i16> %x, <8 x i16>* %y.ptr, <8 x i16> %x1, <8 x i16> %y1) nounwind { 290 ; CHECK-LABEL: test128_12: 291 ; CHECK: ## BB#0: 292 ; CHECK-NEXT: vpcmplew %xmm1, %xmm2, %k1 293 ; CHECK-NEXT: vpcmpleuw (%rdi), %xmm0, %k1 {%k1} 294 ; CHECK-NEXT: vpblendmw %xmm0, %xmm1, %xmm0 {%k1} 295 ; CHECK-NEXT: retq 296 %mask1 = icmp sge <8 x i16> %x1, %y1 297 %y = load <8 x i16>, <8 x i16>* %y.ptr, align 4 298 %mask0 = icmp ule <8 x i16> %x, %y 299 %mask = select <8 x i1> %mask0, <8 x i1> %mask1, <8 x i1> zeroinitializer 300 %max = select <8 x i1> %mask, <8 x i16> %x, <8 x i16> %x1 301 ret <8 x i16> %max 302 } 303