1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse2 | FileCheck %s --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.1 | FileCheck %s --check-prefix=SSE --check-prefix=SSE41 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx | FileCheck %s --check-prefix=AVX --check-prefix=AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefix=AVX --check-prefix=AVX2 6 7; PR33276 - https://bugs.llvm.org/show_bug.cgi?id=33276 8; If both operands of an unsigned icmp are known non-negative, then 9; we don't need to flip the sign bits in order to map to signed pcmpgt*. 10 11define <2 x i1> @ugt_v2i64(<2 x i64> %x, <2 x i64> %y) { 12; SSE-LABEL: ugt_v2i64: 13; SSE: # %bb.0: 14; SSE-NEXT: psrlq $1, %xmm0 15; SSE-NEXT: psrlq $1, %xmm1 16; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 17; SSE-NEXT: pxor %xmm2, %xmm1 18; SSE-NEXT: pxor %xmm2, %xmm0 19; SSE-NEXT: movdqa %xmm0, %xmm2 20; SSE-NEXT: pcmpgtd %xmm1, %xmm2 21; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 22; SSE-NEXT: pcmpeqd %xmm1, %xmm0 23; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3] 24; SSE-NEXT: pand %xmm3, %xmm1 25; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 26; SSE-NEXT: por %xmm1, %xmm0 27; SSE-NEXT: retq 28; 29; AVX-LABEL: ugt_v2i64: 30; AVX: # %bb.0: 31; AVX-NEXT: vpsrlq $1, %xmm0, %xmm0 32; AVX-NEXT: vpsrlq $1, %xmm1, %xmm1 33; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 34; AVX-NEXT: retq 35 %sh1 = lshr <2 x i64> %x, <i64 1, i64 1> 36 %sh2 = lshr <2 x i64> %y, <i64 1, i64 1> 37 %cmp = icmp ugt <2 x i64> %sh1, %sh2 38 ret <2 x i1> %cmp 39} 40 41define <2 x i1> @ult_v2i64(<2 x i64> %x, <2 x i64> %y) { 42; SSE-LABEL: ult_v2i64: 43; SSE: # %bb.0: 44; SSE-NEXT: psrlq $1, %xmm0 45; SSE-NEXT: psrlq $1, %xmm1 46; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 47; SSE-NEXT: pxor %xmm2, %xmm0 48; SSE-NEXT: pxor %xmm2, %xmm1 49; SSE-NEXT: movdqa %xmm1, %xmm2 50; SSE-NEXT: pcmpgtd %xmm0, %xmm2 51; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 52; SSE-NEXT: pcmpeqd %xmm0, %xmm1 53; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm1[1,1,3,3] 54; SSE-NEXT: pand %xmm3, %xmm1 55; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm2[1,1,3,3] 56; SSE-NEXT: por %xmm1, %xmm0 57; SSE-NEXT: retq 58; 59; AVX-LABEL: ult_v2i64: 60; AVX: # %bb.0: 61; AVX-NEXT: vpsrlq $1, %xmm0, %xmm0 62; AVX-NEXT: vpsrlq $1, %xmm1, %xmm1 63; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 64; AVX-NEXT: retq 65 %sh1 = lshr <2 x i64> %x, <i64 1, i64 1> 66 %sh2 = lshr <2 x i64> %y, <i64 1, i64 1> 67 %cmp = icmp ult <2 x i64> %sh1, %sh2 68 ret <2 x i1> %cmp 69} 70 71define <2 x i1> @uge_v2i64(<2 x i64> %x, <2 x i64> %y) { 72; SSE-LABEL: uge_v2i64: 73; SSE: # %bb.0: 74; SSE-NEXT: psrlq $1, %xmm0 75; SSE-NEXT: psrlq $1, %xmm1 76; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 77; SSE-NEXT: pxor %xmm2, %xmm0 78; SSE-NEXT: pxor %xmm2, %xmm1 79; SSE-NEXT: movdqa %xmm1, %xmm2 80; SSE-NEXT: pcmpgtd %xmm0, %xmm2 81; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 82; SSE-NEXT: pcmpeqd %xmm0, %xmm1 83; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm1[1,1,3,3] 84; SSE-NEXT: pand %xmm3, %xmm0 85; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 86; SSE-NEXT: por %xmm0, %xmm1 87; SSE-NEXT: pcmpeqd %xmm0, %xmm0 88; SSE-NEXT: pxor %xmm1, %xmm0 89; SSE-NEXT: retq 90; 91; AVX-LABEL: uge_v2i64: 92; AVX: # %bb.0: 93; AVX-NEXT: vpsrlq $1, %xmm0, %xmm0 94; AVX-NEXT: vpsrlq $1, %xmm1, %xmm1 95; AVX-NEXT: vpcmpgtq %xmm0, %xmm1, %xmm0 96; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 97; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 98; AVX-NEXT: retq 99 %sh1 = lshr <2 x i64> %x, <i64 1, i64 1> 100 %sh2 = lshr <2 x i64> %y, <i64 1, i64 1> 101 %cmp = icmp uge <2 x i64> %sh1, %sh2 102 ret <2 x i1> %cmp 103} 104 105define <2 x i1> @ule_v2i64(<2 x i64> %x, <2 x i64> %y) { 106; SSE-LABEL: ule_v2i64: 107; SSE: # %bb.0: 108; SSE-NEXT: psrlq $1, %xmm0 109; SSE-NEXT: psrlq $1, %xmm1 110; SSE-NEXT: movdqa {{.*#+}} xmm2 = [2147483648,0,2147483648,0] 111; SSE-NEXT: pxor %xmm2, %xmm1 112; SSE-NEXT: pxor %xmm2, %xmm0 113; SSE-NEXT: movdqa %xmm0, %xmm2 114; SSE-NEXT: pcmpgtd %xmm1, %xmm2 115; SSE-NEXT: pshufd {{.*#+}} xmm3 = xmm2[0,0,2,2] 116; SSE-NEXT: pcmpeqd %xmm1, %xmm0 117; SSE-NEXT: pshufd {{.*#+}} xmm0 = xmm0[1,1,3,3] 118; SSE-NEXT: pand %xmm3, %xmm0 119; SSE-NEXT: pshufd {{.*#+}} xmm1 = xmm2[1,1,3,3] 120; SSE-NEXT: por %xmm0, %xmm1 121; SSE-NEXT: pcmpeqd %xmm0, %xmm0 122; SSE-NEXT: pxor %xmm1, %xmm0 123; SSE-NEXT: retq 124; 125; AVX-LABEL: ule_v2i64: 126; AVX: # %bb.0: 127; AVX-NEXT: vpsrlq $1, %xmm0, %xmm0 128; AVX-NEXT: vpsrlq $1, %xmm1, %xmm1 129; AVX-NEXT: vpcmpgtq %xmm1, %xmm0, %xmm0 130; AVX-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1 131; AVX-NEXT: vpxor %xmm1, %xmm0, %xmm0 132; AVX-NEXT: retq 133 %sh1 = lshr <2 x i64> %x, <i64 1, i64 1> 134 %sh2 = lshr <2 x i64> %y, <i64 1, i64 1> 135 %cmp = icmp ule <2 x i64> %sh1, %sh2 136 ret <2 x i1> %cmp 137} 138 139define <4 x i1> @ugt_v4i32(<4 x i32> %x, <4 x i32> %y) { 140; SSE-LABEL: ugt_v4i32: 141; SSE: # %bb.0: 142; SSE-NEXT: psrld $1, %xmm0 143; SSE-NEXT: psrld $1, %xmm1 144; SSE-NEXT: pcmpgtd %xmm1, %xmm0 145; SSE-NEXT: retq 146; 147; AVX-LABEL: ugt_v4i32: 148; AVX: # %bb.0: 149; AVX-NEXT: vpsrld $1, %xmm0, %xmm0 150; AVX-NEXT: vpsrld $1, %xmm1, %xmm1 151; AVX-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0 152; AVX-NEXT: retq 153 %sh1 = lshr <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1> 154 %sh2 = lshr <4 x i32> %y, <i32 1, i32 1, i32 1, i32 1> 155 %cmp = icmp ugt <4 x i32> %sh1, %sh2 156 ret <4 x i1> %cmp 157} 158 159define <4 x i1> @ult_v4i32(<4 x i32> %x, <4 x i32> %y) { 160; SSE-LABEL: ult_v4i32: 161; SSE: # %bb.0: 162; SSE-NEXT: psrld $1, %xmm0 163; SSE-NEXT: psrld $1, %xmm1 164; SSE-NEXT: pcmpgtd %xmm0, %xmm1 165; SSE-NEXT: movdqa %xmm1, %xmm0 166; SSE-NEXT: retq 167; 168; AVX-LABEL: ult_v4i32: 169; AVX: # %bb.0: 170; AVX-NEXT: vpsrld $1, %xmm0, %xmm0 171; AVX-NEXT: vpsrld $1, %xmm1, %xmm1 172; AVX-NEXT: vpcmpgtd %xmm0, %xmm1, %xmm0 173; AVX-NEXT: retq 174 %sh1 = lshr <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1> 175 %sh2 = lshr <4 x i32> %y, <i32 1, i32 1, i32 1, i32 1> 176 %cmp = icmp ult <4 x i32> %sh1, %sh2 177 ret <4 x i1> %cmp 178} 179 180define <4 x i1> @uge_v4i32(<4 x i32> %x, <4 x i32> %y) { 181; SSE2-LABEL: uge_v4i32: 182; SSE2: # %bb.0: 183; SSE2-NEXT: psrld $1, %xmm0 184; SSE2-NEXT: psrld $1, %xmm1 185; SSE2-NEXT: pcmpgtd %xmm0, %xmm1 186; SSE2-NEXT: pcmpeqd %xmm0, %xmm0 187; SSE2-NEXT: pxor %xmm1, %xmm0 188; SSE2-NEXT: retq 189; 190; SSE41-LABEL: uge_v4i32: 191; SSE41: # %bb.0: 192; SSE41-NEXT: psrld $1, %xmm0 193; SSE41-NEXT: psrld $1, %xmm1 194; SSE41-NEXT: pmaxud %xmm0, %xmm1 195; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 196; SSE41-NEXT: retq 197; 198; AVX-LABEL: uge_v4i32: 199; AVX: # %bb.0: 200; AVX-NEXT: vpsrld $1, %xmm0, %xmm0 201; AVX-NEXT: vpsrld $1, %xmm1, %xmm1 202; AVX-NEXT: vpmaxud %xmm1, %xmm0, %xmm1 203; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 204; AVX-NEXT: retq 205 %sh1 = lshr <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1> 206 %sh2 = lshr <4 x i32> %y, <i32 1, i32 1, i32 1, i32 1> 207 %cmp = icmp uge <4 x i32> %sh1, %sh2 208 ret <4 x i1> %cmp 209} 210 211define <4 x i1> @ule_v4i32(<4 x i32> %x, <4 x i32> %y) { 212; SSE2-LABEL: ule_v4i32: 213; SSE2: # %bb.0: 214; SSE2-NEXT: psrld $1, %xmm0 215; SSE2-NEXT: psrld $1, %xmm1 216; SSE2-NEXT: pcmpgtd %xmm1, %xmm0 217; SSE2-NEXT: pcmpeqd %xmm1, %xmm1 218; SSE2-NEXT: pxor %xmm1, %xmm0 219; SSE2-NEXT: retq 220; 221; SSE41-LABEL: ule_v4i32: 222; SSE41: # %bb.0: 223; SSE41-NEXT: psrld $1, %xmm0 224; SSE41-NEXT: psrld $1, %xmm1 225; SSE41-NEXT: pminud %xmm0, %xmm1 226; SSE41-NEXT: pcmpeqd %xmm1, %xmm0 227; SSE41-NEXT: retq 228; 229; AVX-LABEL: ule_v4i32: 230; AVX: # %bb.0: 231; AVX-NEXT: vpsrld $1, %xmm0, %xmm0 232; AVX-NEXT: vpsrld $1, %xmm1, %xmm1 233; AVX-NEXT: vpminud %xmm1, %xmm0, %xmm1 234; AVX-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0 235; AVX-NEXT: retq 236 %sh1 = lshr <4 x i32> %x, <i32 1, i32 1, i32 1, i32 1> 237 %sh2 = lshr <4 x i32> %y, <i32 1, i32 1, i32 1, i32 1> 238 %cmp = icmp ule <4 x i32> %sh1, %sh2 239 ret <4 x i1> %cmp 240} 241 242define <8 x i1> @ugt_v8i16(<8 x i16> %x, <8 x i16> %y) { 243; SSE-LABEL: ugt_v8i16: 244; SSE: # %bb.0: 245; SSE-NEXT: psrlw $1, %xmm0 246; SSE-NEXT: psrlw $1, %xmm1 247; SSE-NEXT: pcmpgtw %xmm1, %xmm0 248; SSE-NEXT: retq 249; 250; AVX-LABEL: ugt_v8i16: 251; AVX: # %bb.0: 252; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0 253; AVX-NEXT: vpsrlw $1, %xmm1, %xmm1 254; AVX-NEXT: vpcmpgtw %xmm1, %xmm0, %xmm0 255; AVX-NEXT: retq 256 %sh1 = lshr <8 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 257 %sh2 = lshr <8 x i16> %y, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 258 %cmp = icmp ugt <8 x i16> %sh1, %sh2 259 ret <8 x i1> %cmp 260} 261 262define <8 x i1> @ult_v8i16(<8 x i16> %x, <8 x i16> %y) { 263; SSE-LABEL: ult_v8i16: 264; SSE: # %bb.0: 265; SSE-NEXT: psrlw $1, %xmm0 266; SSE-NEXT: psrlw $1, %xmm1 267; SSE-NEXT: pcmpgtw %xmm0, %xmm1 268; SSE-NEXT: movdqa %xmm1, %xmm0 269; SSE-NEXT: retq 270; 271; AVX-LABEL: ult_v8i16: 272; AVX: # %bb.0: 273; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0 274; AVX-NEXT: vpsrlw $1, %xmm1, %xmm1 275; AVX-NEXT: vpcmpgtw %xmm0, %xmm1, %xmm0 276; AVX-NEXT: retq 277 %sh1 = lshr <8 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 278 %sh2 = lshr <8 x i16> %y, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 279 %cmp = icmp ult <8 x i16> %sh1, %sh2 280 ret <8 x i1> %cmp 281} 282 283define <8 x i1> @uge_v8i16(<8 x i16> %x, <8 x i16> %y) { 284; SSE2-LABEL: uge_v8i16: 285; SSE2: # %bb.0: 286; SSE2-NEXT: psrlw $1, %xmm0 287; SSE2-NEXT: psrlw $1, %xmm1 288; SSE2-NEXT: psubusw %xmm0, %xmm1 289; SSE2-NEXT: pxor %xmm0, %xmm0 290; SSE2-NEXT: pcmpeqw %xmm1, %xmm0 291; SSE2-NEXT: retq 292; 293; SSE41-LABEL: uge_v8i16: 294; SSE41: # %bb.0: 295; SSE41-NEXT: psrlw $1, %xmm0 296; SSE41-NEXT: psrlw $1, %xmm1 297; SSE41-NEXT: pmaxuw %xmm0, %xmm1 298; SSE41-NEXT: pcmpeqw %xmm1, %xmm0 299; SSE41-NEXT: retq 300; 301; AVX-LABEL: uge_v8i16: 302; AVX: # %bb.0: 303; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0 304; AVX-NEXT: vpsrlw $1, %xmm1, %xmm1 305; AVX-NEXT: vpmaxuw %xmm1, %xmm0, %xmm1 306; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 307; AVX-NEXT: retq 308 %sh1 = lshr <8 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 309 %sh2 = lshr <8 x i16> %y, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 310 %cmp = icmp uge <8 x i16> %sh1, %sh2 311 ret <8 x i1> %cmp 312} 313 314define <8 x i1> @ule_v8i16(<8 x i16> %x, <8 x i16> %y) { 315; SSE2-LABEL: ule_v8i16: 316; SSE2: # %bb.0: 317; SSE2-NEXT: psrlw $1, %xmm0 318; SSE2-NEXT: psrlw $1, %xmm1 319; SSE2-NEXT: psubusw %xmm1, %xmm0 320; SSE2-NEXT: pxor %xmm1, %xmm1 321; SSE2-NEXT: pcmpeqw %xmm1, %xmm0 322; SSE2-NEXT: retq 323; 324; SSE41-LABEL: ule_v8i16: 325; SSE41: # %bb.0: 326; SSE41-NEXT: psrlw $1, %xmm0 327; SSE41-NEXT: psrlw $1, %xmm1 328; SSE41-NEXT: pminuw %xmm0, %xmm1 329; SSE41-NEXT: pcmpeqw %xmm1, %xmm0 330; SSE41-NEXT: retq 331; 332; AVX-LABEL: ule_v8i16: 333; AVX: # %bb.0: 334; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0 335; AVX-NEXT: vpsrlw $1, %xmm1, %xmm1 336; AVX-NEXT: vpminuw %xmm1, %xmm0, %xmm1 337; AVX-NEXT: vpcmpeqw %xmm1, %xmm0, %xmm0 338; AVX-NEXT: retq 339 %sh1 = lshr <8 x i16> %x, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 340 %sh2 = lshr <8 x i16> %y, <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1> 341 %cmp = icmp ule <8 x i16> %sh1, %sh2 342 ret <8 x i1> %cmp 343} 344 345define <16 x i1> @ugt_v16i8(<16 x i8> %x, <16 x i8> %y) { 346; SSE-LABEL: ugt_v16i8: 347; SSE: # %bb.0: 348; SSE-NEXT: psrlw $1, %xmm0 349; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 350; SSE-NEXT: pand %xmm2, %xmm0 351; SSE-NEXT: psrlw $1, %xmm1 352; SSE-NEXT: pand %xmm2, %xmm1 353; SSE-NEXT: pcmpgtb %xmm1, %xmm0 354; SSE-NEXT: retq 355; 356; AVX-LABEL: ugt_v16i8: 357; AVX: # %bb.0: 358; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0 359; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 360; AVX-NEXT: vpand %xmm2, %xmm0, %xmm0 361; AVX-NEXT: vpsrlw $1, %xmm1, %xmm1 362; AVX-NEXT: vpand %xmm2, %xmm1, %xmm1 363; AVX-NEXT: vpcmpgtb %xmm1, %xmm0, %xmm0 364; AVX-NEXT: retq 365 %sh1 = lshr <16 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 366 %sh2 = lshr <16 x i8> %y, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 367 %cmp = icmp ugt <16 x i8> %sh1, %sh2 368 ret <16 x i1> %cmp 369} 370 371define <16 x i1> @ult_v16i8(<16 x i8> %x, <16 x i8> %y) { 372; SSE-LABEL: ult_v16i8: 373; SSE: # %bb.0: 374; SSE-NEXT: psrlw $1, %xmm0 375; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 376; SSE-NEXT: pand %xmm2, %xmm0 377; SSE-NEXT: psrlw $1, %xmm1 378; SSE-NEXT: pand %xmm1, %xmm2 379; SSE-NEXT: pcmpgtb %xmm0, %xmm2 380; SSE-NEXT: movdqa %xmm2, %xmm0 381; SSE-NEXT: retq 382; 383; AVX-LABEL: ult_v16i8: 384; AVX: # %bb.0: 385; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0 386; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 387; AVX-NEXT: vpand %xmm2, %xmm0, %xmm0 388; AVX-NEXT: vpsrlw $1, %xmm1, %xmm1 389; AVX-NEXT: vpand %xmm2, %xmm1, %xmm1 390; AVX-NEXT: vpcmpgtb %xmm0, %xmm1, %xmm0 391; AVX-NEXT: retq 392 %sh1 = lshr <16 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 393 %sh2 = lshr <16 x i8> %y, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 394 %cmp = icmp ult <16 x i8> %sh1, %sh2 395 ret <16 x i1> %cmp 396} 397 398define <16 x i1> @uge_v16i8(<16 x i8> %x, <16 x i8> %y) { 399; SSE-LABEL: uge_v16i8: 400; SSE: # %bb.0: 401; SSE-NEXT: psrlw $1, %xmm0 402; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 403; SSE-NEXT: pand %xmm2, %xmm0 404; SSE-NEXT: psrlw $1, %xmm1 405; SSE-NEXT: pand %xmm2, %xmm1 406; SSE-NEXT: pmaxub %xmm0, %xmm1 407; SSE-NEXT: pcmpeqb %xmm1, %xmm0 408; SSE-NEXT: retq 409; 410; AVX-LABEL: uge_v16i8: 411; AVX: # %bb.0: 412; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0 413; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 414; AVX-NEXT: vpand %xmm2, %xmm0, %xmm0 415; AVX-NEXT: vpsrlw $1, %xmm1, %xmm1 416; AVX-NEXT: vpand %xmm2, %xmm1, %xmm1 417; AVX-NEXT: vpmaxub %xmm1, %xmm0, %xmm1 418; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 419; AVX-NEXT: retq 420 %sh1 = lshr <16 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 421 %sh2 = lshr <16 x i8> %y, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 422 %cmp = icmp uge <16 x i8> %sh1, %sh2 423 ret <16 x i1> %cmp 424} 425 426define <16 x i1> @ule_v16i8(<16 x i8> %x, <16 x i8> %y) { 427; SSE-LABEL: ule_v16i8: 428; SSE: # %bb.0: 429; SSE-NEXT: psrlw $1, %xmm0 430; SSE-NEXT: movdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 431; SSE-NEXT: pand %xmm2, %xmm0 432; SSE-NEXT: psrlw $1, %xmm1 433; SSE-NEXT: pand %xmm2, %xmm1 434; SSE-NEXT: pminub %xmm0, %xmm1 435; SSE-NEXT: pcmpeqb %xmm1, %xmm0 436; SSE-NEXT: retq 437; 438; AVX-LABEL: ule_v16i8: 439; AVX: # %bb.0: 440; AVX-NEXT: vpsrlw $1, %xmm0, %xmm0 441; AVX-NEXT: vmovdqa {{.*#+}} xmm2 = [127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127] 442; AVX-NEXT: vpand %xmm2, %xmm0, %xmm0 443; AVX-NEXT: vpsrlw $1, %xmm1, %xmm1 444; AVX-NEXT: vpand %xmm2, %xmm1, %xmm1 445; AVX-NEXT: vpminub %xmm1, %xmm0, %xmm1 446; AVX-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0 447; AVX-NEXT: retq 448 %sh1 = lshr <16 x i8> %x, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 449 %sh2 = lshr <16 x i8> %y, <i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1, i8 1> 450 %cmp = icmp ule <16 x i8> %sh1, %sh2 451 ret <16 x i1> %cmp 452} 453 454