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=ANY --check-prefix=NO512 --check-prefix=SSE --check-prefix=SSE2 3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=sse4.1 | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=SSE --check-prefix=SSE41 4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=AVXANY --check-prefix=AVX1 5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx2 | FileCheck %s --check-prefix=ANY --check-prefix=NO512 --check-prefix=AVXANY --check-prefix=AVX2 6; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512f | FileCheck %s --check-prefix=ANY --check-prefix=AVXANY --check-prefix=AVX512 --check-prefix=AVX512F 7; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=avx512bw | FileCheck %s --check-prefix=ANY --check-prefix=AVXANY --check-prefix=AVX512 --check-prefix=AVX512BW 8 9; Equality checks of 128/256-bit values can use PMOVMSK or PTEST to avoid scalarization. 10 11define i32 @ne_i128(<2 x i64> %x, <2 x i64> %y) { 12; SSE2-LABEL: ne_i128: 13; SSE2: # %bb.0: 14; SSE2-NEXT: pcmpeqb %xmm1, %xmm0 15; SSE2-NEXT: pmovmskb %xmm0, %ecx 16; SSE2-NEXT: xorl %eax, %eax 17; SSE2-NEXT: cmpl $65535, %ecx # imm = 0xFFFF 18; SSE2-NEXT: setne %al 19; SSE2-NEXT: retq 20; 21; SSE41-LABEL: ne_i128: 22; SSE41: # %bb.0: 23; SSE41-NEXT: pxor %xmm1, %xmm0 24; SSE41-NEXT: xorl %eax, %eax 25; SSE41-NEXT: ptest %xmm0, %xmm0 26; SSE41-NEXT: setne %al 27; SSE41-NEXT: retq 28; 29; AVXANY-LABEL: ne_i128: 30; AVXANY: # %bb.0: 31; AVXANY-NEXT: vpxor %xmm1, %xmm0, %xmm0 32; AVXANY-NEXT: xorl %eax, %eax 33; AVXANY-NEXT: vptest %xmm0, %xmm0 34; AVXANY-NEXT: setne %al 35; AVXANY-NEXT: retq 36 %bcx = bitcast <2 x i64> %x to i128 37 %bcy = bitcast <2 x i64> %y to i128 38 %cmp = icmp ne i128 %bcx, %bcy 39 %zext = zext i1 %cmp to i32 40 ret i32 %zext 41} 42 43define i32 @eq_i128(<2 x i64> %x, <2 x i64> %y) { 44; SSE2-LABEL: eq_i128: 45; SSE2: # %bb.0: 46; SSE2-NEXT: pcmpeqb %xmm1, %xmm0 47; SSE2-NEXT: pmovmskb %xmm0, %ecx 48; SSE2-NEXT: xorl %eax, %eax 49; SSE2-NEXT: cmpl $65535, %ecx # imm = 0xFFFF 50; SSE2-NEXT: sete %al 51; SSE2-NEXT: retq 52; 53; SSE41-LABEL: eq_i128: 54; SSE41: # %bb.0: 55; SSE41-NEXT: pxor %xmm1, %xmm0 56; SSE41-NEXT: xorl %eax, %eax 57; SSE41-NEXT: ptest %xmm0, %xmm0 58; SSE41-NEXT: sete %al 59; SSE41-NEXT: retq 60; 61; AVXANY-LABEL: eq_i128: 62; AVXANY: # %bb.0: 63; AVXANY-NEXT: vpxor %xmm1, %xmm0, %xmm0 64; AVXANY-NEXT: xorl %eax, %eax 65; AVXANY-NEXT: vptest %xmm0, %xmm0 66; AVXANY-NEXT: sete %al 67; AVXANY-NEXT: retq 68 %bcx = bitcast <2 x i64> %x to i128 69 %bcy = bitcast <2 x i64> %y to i128 70 %cmp = icmp eq i128 %bcx, %bcy 71 %zext = zext i1 %cmp to i32 72 ret i32 %zext 73} 74 75define i32 @ne_i256(<4 x i64> %x, <4 x i64> %y) { 76; SSE2-LABEL: ne_i256: 77; SSE2: # %bb.0: 78; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[2,3,2,3] 79; SSE2-NEXT: movq %xmm4, %rax 80; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3] 81; SSE2-NEXT: movq %xmm4, %rcx 82; SSE2-NEXT: movq %xmm0, %rdx 83; SSE2-NEXT: movq %xmm1, %rsi 84; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3] 85; SSE2-NEXT: movq %xmm0, %rdi 86; SSE2-NEXT: xorq %rax, %rdi 87; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3] 88; SSE2-NEXT: movq %xmm0, %r8 89; SSE2-NEXT: xorq %rcx, %r8 90; SSE2-NEXT: orq %rdi, %r8 91; SSE2-NEXT: movq %xmm2, %rax 92; SSE2-NEXT: xorq %rdx, %rax 93; SSE2-NEXT: movq %xmm3, %rcx 94; SSE2-NEXT: xorq %rsi, %rcx 95; SSE2-NEXT: orq %rax, %rcx 96; SSE2-NEXT: xorl %eax, %eax 97; SSE2-NEXT: orq %r8, %rcx 98; SSE2-NEXT: setne %al 99; SSE2-NEXT: retq 100; 101; SSE41-LABEL: ne_i256: 102; SSE41: # %bb.0: 103; SSE41-NEXT: movq %xmm0, %rax 104; SSE41-NEXT: movq %xmm1, %rcx 105; SSE41-NEXT: pextrq $1, %xmm0, %rdx 106; SSE41-NEXT: pextrq $1, %xmm1, %rsi 107; SSE41-NEXT: movq %xmm2, %rdi 108; SSE41-NEXT: xorq %rax, %rdi 109; SSE41-NEXT: movq %xmm3, %r8 110; SSE41-NEXT: xorq %rcx, %r8 111; SSE41-NEXT: orq %rdi, %r8 112; SSE41-NEXT: pextrq $1, %xmm2, %rax 113; SSE41-NEXT: xorq %rdx, %rax 114; SSE41-NEXT: pextrq $1, %xmm3, %rcx 115; SSE41-NEXT: xorq %rsi, %rcx 116; SSE41-NEXT: orq %rax, %rcx 117; SSE41-NEXT: xorl %eax, %eax 118; SSE41-NEXT: orq %r8, %rcx 119; SSE41-NEXT: setne %al 120; SSE41-NEXT: retq 121; 122; AVX1-LABEL: ne_i256: 123; AVX1: # %bb.0: 124; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 125; AVX1-NEXT: xorl %eax, %eax 126; AVX1-NEXT: vptest %ymm0, %ymm0 127; AVX1-NEXT: setne %al 128; AVX1-NEXT: vzeroupper 129; AVX1-NEXT: retq 130; 131; AVX2-LABEL: ne_i256: 132; AVX2: # %bb.0: 133; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 134; AVX2-NEXT: xorl %eax, %eax 135; AVX2-NEXT: vptest %ymm0, %ymm0 136; AVX2-NEXT: setne %al 137; AVX2-NEXT: vzeroupper 138; AVX2-NEXT: retq 139; 140; AVX512-LABEL: ne_i256: 141; AVX512: # %bb.0: 142; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 143; AVX512-NEXT: xorl %eax, %eax 144; AVX512-NEXT: vptest %ymm0, %ymm0 145; AVX512-NEXT: setne %al 146; AVX512-NEXT: vzeroupper 147; AVX512-NEXT: retq 148 %bcx = bitcast <4 x i64> %x to i256 149 %bcy = bitcast <4 x i64> %y to i256 150 %cmp = icmp ne i256 %bcx, %bcy 151 %zext = zext i1 %cmp to i32 152 ret i32 %zext 153} 154 155define i32 @eq_i256(<4 x i64> %x, <4 x i64> %y) { 156; SSE2-LABEL: eq_i256: 157; SSE2: # %bb.0: 158; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm0[2,3,2,3] 159; SSE2-NEXT: movq %xmm4, %rax 160; SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm1[2,3,2,3] 161; SSE2-NEXT: movq %xmm4, %rcx 162; SSE2-NEXT: movq %xmm0, %rdx 163; SSE2-NEXT: movq %xmm1, %rsi 164; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm2[2,3,2,3] 165; SSE2-NEXT: movq %xmm0, %rdi 166; SSE2-NEXT: xorq %rax, %rdi 167; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm3[2,3,2,3] 168; SSE2-NEXT: movq %xmm0, %r8 169; SSE2-NEXT: xorq %rcx, %r8 170; SSE2-NEXT: orq %rdi, %r8 171; SSE2-NEXT: movq %xmm2, %rax 172; SSE2-NEXT: xorq %rdx, %rax 173; SSE2-NEXT: movq %xmm3, %rcx 174; SSE2-NEXT: xorq %rsi, %rcx 175; SSE2-NEXT: orq %rax, %rcx 176; SSE2-NEXT: xorl %eax, %eax 177; SSE2-NEXT: orq %r8, %rcx 178; SSE2-NEXT: sete %al 179; SSE2-NEXT: retq 180; 181; SSE41-LABEL: eq_i256: 182; SSE41: # %bb.0: 183; SSE41-NEXT: movq %xmm0, %rax 184; SSE41-NEXT: movq %xmm1, %rcx 185; SSE41-NEXT: pextrq $1, %xmm0, %rdx 186; SSE41-NEXT: pextrq $1, %xmm1, %rsi 187; SSE41-NEXT: movq %xmm2, %rdi 188; SSE41-NEXT: xorq %rax, %rdi 189; SSE41-NEXT: movq %xmm3, %r8 190; SSE41-NEXT: xorq %rcx, %r8 191; SSE41-NEXT: orq %rdi, %r8 192; SSE41-NEXT: pextrq $1, %xmm2, %rax 193; SSE41-NEXT: xorq %rdx, %rax 194; SSE41-NEXT: pextrq $1, %xmm3, %rcx 195; SSE41-NEXT: xorq %rsi, %rcx 196; SSE41-NEXT: orq %rax, %rcx 197; SSE41-NEXT: xorl %eax, %eax 198; SSE41-NEXT: orq %r8, %rcx 199; SSE41-NEXT: sete %al 200; SSE41-NEXT: retq 201; 202; AVX1-LABEL: eq_i256: 203; AVX1: # %bb.0: 204; AVX1-NEXT: vxorps %ymm1, %ymm0, %ymm0 205; AVX1-NEXT: xorl %eax, %eax 206; AVX1-NEXT: vptest %ymm0, %ymm0 207; AVX1-NEXT: sete %al 208; AVX1-NEXT: vzeroupper 209; AVX1-NEXT: retq 210; 211; AVX2-LABEL: eq_i256: 212; AVX2: # %bb.0: 213; AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0 214; AVX2-NEXT: xorl %eax, %eax 215; AVX2-NEXT: vptest %ymm0, %ymm0 216; AVX2-NEXT: sete %al 217; AVX2-NEXT: vzeroupper 218; AVX2-NEXT: retq 219; 220; AVX512-LABEL: eq_i256: 221; AVX512: # %bb.0: 222; AVX512-NEXT: vpxor %ymm1, %ymm0, %ymm0 223; AVX512-NEXT: xorl %eax, %eax 224; AVX512-NEXT: vptest %ymm0, %ymm0 225; AVX512-NEXT: sete %al 226; AVX512-NEXT: vzeroupper 227; AVX512-NEXT: retq 228 %bcx = bitcast <4 x i64> %x to i256 229 %bcy = bitcast <4 x i64> %y to i256 230 %cmp = icmp eq i256 %bcx, %bcy 231 %zext = zext i1 %cmp to i32 232 ret i32 %zext 233} 234 235define i32 @ne_i512(<8 x i64> %x, <8 x i64> %y) { 236; SSE2-LABEL: ne_i512: 237; SSE2: # %bb.0: 238; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,3,2,3] 239; SSE2-NEXT: movq %xmm8, %rdx 240; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm2[2,3,2,3] 241; SSE2-NEXT: movq %xmm8, %rsi 242; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm1[2,3,2,3] 243; SSE2-NEXT: movq %xmm8, %rdi 244; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm3[2,3,2,3] 245; SSE2-NEXT: movq %xmm8, %r8 246; SSE2-NEXT: movq %xmm0, %r9 247; SSE2-NEXT: movq %xmm2, %r10 248; SSE2-NEXT: movq %xmm1, %rcx 249; SSE2-NEXT: movq %xmm3, %rax 250; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3] 251; SSE2-NEXT: movq %xmm0, %r11 252; SSE2-NEXT: xorq %rdx, %r11 253; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[2,3,2,3] 254; SSE2-NEXT: movq %xmm0, %rdx 255; SSE2-NEXT: xorq %rsi, %rdx 256; SSE2-NEXT: orq %r11, %rdx 257; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[2,3,2,3] 258; SSE2-NEXT: movq %xmm0, %rsi 259; SSE2-NEXT: xorq %rdi, %rsi 260; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[2,3,2,3] 261; SSE2-NEXT: movq %xmm0, %rdi 262; SSE2-NEXT: xorq %r8, %rdi 263; SSE2-NEXT: orq %rsi, %rdi 264; SSE2-NEXT: orq %rdx, %rdi 265; SSE2-NEXT: movq %xmm4, %rdx 266; SSE2-NEXT: xorq %r9, %rdx 267; SSE2-NEXT: movq %xmm6, %rsi 268; SSE2-NEXT: xorq %r10, %rsi 269; SSE2-NEXT: orq %rdx, %rsi 270; SSE2-NEXT: movq %xmm5, %rdx 271; SSE2-NEXT: xorq %rcx, %rdx 272; SSE2-NEXT: movq %xmm7, %rcx 273; SSE2-NEXT: xorq %rax, %rcx 274; SSE2-NEXT: orq %rdx, %rcx 275; SSE2-NEXT: orq %rsi, %rcx 276; SSE2-NEXT: xorl %eax, %eax 277; SSE2-NEXT: orq %rdi, %rcx 278; SSE2-NEXT: setne %al 279; SSE2-NEXT: retq 280; 281; SSE41-LABEL: ne_i512: 282; SSE41: # %bb.0: 283; SSE41-NEXT: movq %xmm0, %rcx 284; SSE41-NEXT: movq %xmm2, %rdx 285; SSE41-NEXT: movq %xmm1, %rsi 286; SSE41-NEXT: movq %xmm3, %rdi 287; SSE41-NEXT: pextrq $1, %xmm0, %r8 288; SSE41-NEXT: pextrq $1, %xmm2, %r9 289; SSE41-NEXT: pextrq $1, %xmm1, %r10 290; SSE41-NEXT: pextrq $1, %xmm3, %rax 291; SSE41-NEXT: movq %xmm4, %r11 292; SSE41-NEXT: xorq %rcx, %r11 293; SSE41-NEXT: movq %xmm6, %rcx 294; SSE41-NEXT: xorq %rdx, %rcx 295; SSE41-NEXT: orq %r11, %rcx 296; SSE41-NEXT: movq %xmm5, %rdx 297; SSE41-NEXT: xorq %rsi, %rdx 298; SSE41-NEXT: movq %xmm7, %rsi 299; SSE41-NEXT: xorq %rdi, %rsi 300; SSE41-NEXT: orq %rdx, %rsi 301; SSE41-NEXT: orq %rcx, %rsi 302; SSE41-NEXT: pextrq $1, %xmm4, %rcx 303; SSE41-NEXT: xorq %r8, %rcx 304; SSE41-NEXT: pextrq $1, %xmm6, %rdx 305; SSE41-NEXT: xorq %r9, %rdx 306; SSE41-NEXT: orq %rcx, %rdx 307; SSE41-NEXT: pextrq $1, %xmm5, %rcx 308; SSE41-NEXT: xorq %r10, %rcx 309; SSE41-NEXT: pextrq $1, %xmm7, %rdi 310; SSE41-NEXT: xorq %rax, %rdi 311; SSE41-NEXT: orq %rcx, %rdi 312; SSE41-NEXT: orq %rdx, %rdi 313; SSE41-NEXT: xorl %eax, %eax 314; SSE41-NEXT: orq %rsi, %rdi 315; SSE41-NEXT: setne %al 316; SSE41-NEXT: retq 317; 318; AVX1-LABEL: ne_i512: 319; AVX1: # %bb.0: 320; AVX1-NEXT: vmovq %xmm0, %rdx 321; AVX1-NEXT: vmovq %xmm1, %rsi 322; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 323; AVX1-NEXT: vmovq %xmm4, %rdi 324; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 325; AVX1-NEXT: vmovq %xmm5, %r8 326; AVX1-NEXT: vpextrq $1, %xmm0, %r9 327; AVX1-NEXT: vpextrq $1, %xmm1, %r10 328; AVX1-NEXT: vpextrq $1, %xmm4, %rcx 329; AVX1-NEXT: vpextrq $1, %xmm5, %rax 330; AVX1-NEXT: vmovq %xmm2, %r11 331; AVX1-NEXT: xorq %rdx, %r11 332; AVX1-NEXT: vmovq %xmm3, %rdx 333; AVX1-NEXT: xorq %rsi, %rdx 334; AVX1-NEXT: orq %r11, %rdx 335; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm0 336; AVX1-NEXT: vmovq %xmm0, %rsi 337; AVX1-NEXT: xorq %rdi, %rsi 338; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1 339; AVX1-NEXT: vmovq %xmm1, %rdi 340; AVX1-NEXT: xorq %r8, %rdi 341; AVX1-NEXT: orq %rsi, %rdi 342; AVX1-NEXT: orq %rdx, %rdi 343; AVX1-NEXT: vpextrq $1, %xmm2, %rdx 344; AVX1-NEXT: xorq %r9, %rdx 345; AVX1-NEXT: vpextrq $1, %xmm3, %rsi 346; AVX1-NEXT: xorq %r10, %rsi 347; AVX1-NEXT: orq %rdx, %rsi 348; AVX1-NEXT: vpextrq $1, %xmm0, %rdx 349; AVX1-NEXT: xorq %rcx, %rdx 350; AVX1-NEXT: vpextrq $1, %xmm1, %rcx 351; AVX1-NEXT: xorq %rax, %rcx 352; AVX1-NEXT: orq %rdx, %rcx 353; AVX1-NEXT: orq %rsi, %rcx 354; AVX1-NEXT: xorl %eax, %eax 355; AVX1-NEXT: orq %rdi, %rcx 356; AVX1-NEXT: setne %al 357; AVX1-NEXT: vzeroupper 358; AVX1-NEXT: retq 359; 360; AVX2-LABEL: ne_i512: 361; AVX2: # %bb.0: 362; AVX2-NEXT: vmovq %xmm0, %rdx 363; AVX2-NEXT: vmovq %xmm1, %rsi 364; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 365; AVX2-NEXT: vmovq %xmm4, %rdi 366; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5 367; AVX2-NEXT: vmovq %xmm5, %r8 368; AVX2-NEXT: vpextrq $1, %xmm0, %r9 369; AVX2-NEXT: vpextrq $1, %xmm1, %r10 370; AVX2-NEXT: vpextrq $1, %xmm4, %rcx 371; AVX2-NEXT: vpextrq $1, %xmm5, %rax 372; AVX2-NEXT: vmovq %xmm2, %r11 373; AVX2-NEXT: xorq %rdx, %r11 374; AVX2-NEXT: vmovq %xmm3, %rdx 375; AVX2-NEXT: xorq %rsi, %rdx 376; AVX2-NEXT: orq %r11, %rdx 377; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm0 378; AVX2-NEXT: vmovq %xmm0, %rsi 379; AVX2-NEXT: xorq %rdi, %rsi 380; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm1 381; AVX2-NEXT: vmovq %xmm1, %rdi 382; AVX2-NEXT: xorq %r8, %rdi 383; AVX2-NEXT: orq %rsi, %rdi 384; AVX2-NEXT: orq %rdx, %rdi 385; AVX2-NEXT: vpextrq $1, %xmm2, %rdx 386; AVX2-NEXT: xorq %r9, %rdx 387; AVX2-NEXT: vpextrq $1, %xmm3, %rsi 388; AVX2-NEXT: xorq %r10, %rsi 389; AVX2-NEXT: orq %rdx, %rsi 390; AVX2-NEXT: vpextrq $1, %xmm0, %rdx 391; AVX2-NEXT: xorq %rcx, %rdx 392; AVX2-NEXT: vpextrq $1, %xmm1, %rcx 393; AVX2-NEXT: xorq %rax, %rcx 394; AVX2-NEXT: orq %rdx, %rcx 395; AVX2-NEXT: orq %rsi, %rcx 396; AVX2-NEXT: xorl %eax, %eax 397; AVX2-NEXT: orq %rdi, %rcx 398; AVX2-NEXT: setne %al 399; AVX2-NEXT: vzeroupper 400; AVX2-NEXT: retq 401; 402; AVX512-LABEL: ne_i512: 403; AVX512: # %bb.0: 404; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 405; AVX512-NEXT: xorl %eax, %eax 406; AVX512-NEXT: kortestw %k0, %k0 407; AVX512-NEXT: setne %al 408; AVX512-NEXT: vzeroupper 409; AVX512-NEXT: retq 410 %bcx = bitcast <8 x i64> %x to i512 411 %bcy = bitcast <8 x i64> %y to i512 412 %cmp = icmp ne i512 %bcx, %bcy 413 %zext = zext i1 %cmp to i32 414 ret i32 %zext 415} 416 417define i32 @eq_i512(<8 x i64> %x, <8 x i64> %y) { 418; SSE2-LABEL: eq_i512: 419; SSE2: # %bb.0: 420; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm0[2,3,2,3] 421; SSE2-NEXT: movq %xmm8, %rdx 422; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm2[2,3,2,3] 423; SSE2-NEXT: movq %xmm8, %rsi 424; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm1[2,3,2,3] 425; SSE2-NEXT: movq %xmm8, %rdi 426; SSE2-NEXT: pshufd {{.*#+}} xmm8 = xmm3[2,3,2,3] 427; SSE2-NEXT: movq %xmm8, %r8 428; SSE2-NEXT: movq %xmm0, %r9 429; SSE2-NEXT: movq %xmm2, %r10 430; SSE2-NEXT: movq %xmm1, %rcx 431; SSE2-NEXT: movq %xmm3, %rax 432; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm4[2,3,2,3] 433; SSE2-NEXT: movq %xmm0, %r11 434; SSE2-NEXT: xorq %rdx, %r11 435; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm6[2,3,2,3] 436; SSE2-NEXT: movq %xmm0, %rdx 437; SSE2-NEXT: xorq %rsi, %rdx 438; SSE2-NEXT: orq %r11, %rdx 439; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm5[2,3,2,3] 440; SSE2-NEXT: movq %xmm0, %rsi 441; SSE2-NEXT: xorq %rdi, %rsi 442; SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm7[2,3,2,3] 443; SSE2-NEXT: movq %xmm0, %rdi 444; SSE2-NEXT: xorq %r8, %rdi 445; SSE2-NEXT: orq %rsi, %rdi 446; SSE2-NEXT: orq %rdx, %rdi 447; SSE2-NEXT: movq %xmm4, %rdx 448; SSE2-NEXT: xorq %r9, %rdx 449; SSE2-NEXT: movq %xmm6, %rsi 450; SSE2-NEXT: xorq %r10, %rsi 451; SSE2-NEXT: orq %rdx, %rsi 452; SSE2-NEXT: movq %xmm5, %rdx 453; SSE2-NEXT: xorq %rcx, %rdx 454; SSE2-NEXT: movq %xmm7, %rcx 455; SSE2-NEXT: xorq %rax, %rcx 456; SSE2-NEXT: orq %rdx, %rcx 457; SSE2-NEXT: orq %rsi, %rcx 458; SSE2-NEXT: xorl %eax, %eax 459; SSE2-NEXT: orq %rdi, %rcx 460; SSE2-NEXT: sete %al 461; SSE2-NEXT: retq 462; 463; SSE41-LABEL: eq_i512: 464; SSE41: # %bb.0: 465; SSE41-NEXT: movq %xmm0, %rcx 466; SSE41-NEXT: movq %xmm2, %rdx 467; SSE41-NEXT: movq %xmm1, %rsi 468; SSE41-NEXT: movq %xmm3, %rdi 469; SSE41-NEXT: pextrq $1, %xmm0, %r8 470; SSE41-NEXT: pextrq $1, %xmm2, %r9 471; SSE41-NEXT: pextrq $1, %xmm1, %r10 472; SSE41-NEXT: pextrq $1, %xmm3, %rax 473; SSE41-NEXT: movq %xmm4, %r11 474; SSE41-NEXT: xorq %rcx, %r11 475; SSE41-NEXT: movq %xmm6, %rcx 476; SSE41-NEXT: xorq %rdx, %rcx 477; SSE41-NEXT: orq %r11, %rcx 478; SSE41-NEXT: movq %xmm5, %rdx 479; SSE41-NEXT: xorq %rsi, %rdx 480; SSE41-NEXT: movq %xmm7, %rsi 481; SSE41-NEXT: xorq %rdi, %rsi 482; SSE41-NEXT: orq %rdx, %rsi 483; SSE41-NEXT: orq %rcx, %rsi 484; SSE41-NEXT: pextrq $1, %xmm4, %rcx 485; SSE41-NEXT: xorq %r8, %rcx 486; SSE41-NEXT: pextrq $1, %xmm6, %rdx 487; SSE41-NEXT: xorq %r9, %rdx 488; SSE41-NEXT: orq %rcx, %rdx 489; SSE41-NEXT: pextrq $1, %xmm5, %rcx 490; SSE41-NEXT: xorq %r10, %rcx 491; SSE41-NEXT: pextrq $1, %xmm7, %rdi 492; SSE41-NEXT: xorq %rax, %rdi 493; SSE41-NEXT: orq %rcx, %rdi 494; SSE41-NEXT: orq %rdx, %rdi 495; SSE41-NEXT: xorl %eax, %eax 496; SSE41-NEXT: orq %rsi, %rdi 497; SSE41-NEXT: sete %al 498; SSE41-NEXT: retq 499; 500; AVX1-LABEL: eq_i512: 501; AVX1: # %bb.0: 502; AVX1-NEXT: vmovq %xmm0, %rdx 503; AVX1-NEXT: vmovq %xmm1, %rsi 504; AVX1-NEXT: vextractf128 $1, %ymm0, %xmm4 505; AVX1-NEXT: vmovq %xmm4, %rdi 506; AVX1-NEXT: vextractf128 $1, %ymm1, %xmm5 507; AVX1-NEXT: vmovq %xmm5, %r8 508; AVX1-NEXT: vpextrq $1, %xmm0, %r9 509; AVX1-NEXT: vpextrq $1, %xmm1, %r10 510; AVX1-NEXT: vpextrq $1, %xmm4, %rcx 511; AVX1-NEXT: vpextrq $1, %xmm5, %rax 512; AVX1-NEXT: vmovq %xmm2, %r11 513; AVX1-NEXT: xorq %rdx, %r11 514; AVX1-NEXT: vmovq %xmm3, %rdx 515; AVX1-NEXT: xorq %rsi, %rdx 516; AVX1-NEXT: orq %r11, %rdx 517; AVX1-NEXT: vextractf128 $1, %ymm2, %xmm0 518; AVX1-NEXT: vmovq %xmm0, %rsi 519; AVX1-NEXT: xorq %rdi, %rsi 520; AVX1-NEXT: vextractf128 $1, %ymm3, %xmm1 521; AVX1-NEXT: vmovq %xmm1, %rdi 522; AVX1-NEXT: xorq %r8, %rdi 523; AVX1-NEXT: orq %rsi, %rdi 524; AVX1-NEXT: orq %rdx, %rdi 525; AVX1-NEXT: vpextrq $1, %xmm2, %rdx 526; AVX1-NEXT: xorq %r9, %rdx 527; AVX1-NEXT: vpextrq $1, %xmm3, %rsi 528; AVX1-NEXT: xorq %r10, %rsi 529; AVX1-NEXT: orq %rdx, %rsi 530; AVX1-NEXT: vpextrq $1, %xmm0, %rdx 531; AVX1-NEXT: xorq %rcx, %rdx 532; AVX1-NEXT: vpextrq $1, %xmm1, %rcx 533; AVX1-NEXT: xorq %rax, %rcx 534; AVX1-NEXT: orq %rdx, %rcx 535; AVX1-NEXT: orq %rsi, %rcx 536; AVX1-NEXT: xorl %eax, %eax 537; AVX1-NEXT: orq %rdi, %rcx 538; AVX1-NEXT: sete %al 539; AVX1-NEXT: vzeroupper 540; AVX1-NEXT: retq 541; 542; AVX2-LABEL: eq_i512: 543; AVX2: # %bb.0: 544; AVX2-NEXT: vmovq %xmm0, %rdx 545; AVX2-NEXT: vmovq %xmm1, %rsi 546; AVX2-NEXT: vextracti128 $1, %ymm0, %xmm4 547; AVX2-NEXT: vmovq %xmm4, %rdi 548; AVX2-NEXT: vextracti128 $1, %ymm1, %xmm5 549; AVX2-NEXT: vmovq %xmm5, %r8 550; AVX2-NEXT: vpextrq $1, %xmm0, %r9 551; AVX2-NEXT: vpextrq $1, %xmm1, %r10 552; AVX2-NEXT: vpextrq $1, %xmm4, %rcx 553; AVX2-NEXT: vpextrq $1, %xmm5, %rax 554; AVX2-NEXT: vmovq %xmm2, %r11 555; AVX2-NEXT: xorq %rdx, %r11 556; AVX2-NEXT: vmovq %xmm3, %rdx 557; AVX2-NEXT: xorq %rsi, %rdx 558; AVX2-NEXT: orq %r11, %rdx 559; AVX2-NEXT: vextracti128 $1, %ymm2, %xmm0 560; AVX2-NEXT: vmovq %xmm0, %rsi 561; AVX2-NEXT: xorq %rdi, %rsi 562; AVX2-NEXT: vextracti128 $1, %ymm3, %xmm1 563; AVX2-NEXT: vmovq %xmm1, %rdi 564; AVX2-NEXT: xorq %r8, %rdi 565; AVX2-NEXT: orq %rsi, %rdi 566; AVX2-NEXT: orq %rdx, %rdi 567; AVX2-NEXT: vpextrq $1, %xmm2, %rdx 568; AVX2-NEXT: xorq %r9, %rdx 569; AVX2-NEXT: vpextrq $1, %xmm3, %rsi 570; AVX2-NEXT: xorq %r10, %rsi 571; AVX2-NEXT: orq %rdx, %rsi 572; AVX2-NEXT: vpextrq $1, %xmm0, %rdx 573; AVX2-NEXT: xorq %rcx, %rdx 574; AVX2-NEXT: vpextrq $1, %xmm1, %rcx 575; AVX2-NEXT: xorq %rax, %rcx 576; AVX2-NEXT: orq %rdx, %rcx 577; AVX2-NEXT: orq %rsi, %rcx 578; AVX2-NEXT: xorl %eax, %eax 579; AVX2-NEXT: orq %rdi, %rcx 580; AVX2-NEXT: sete %al 581; AVX2-NEXT: vzeroupper 582; AVX2-NEXT: retq 583; 584; AVX512-LABEL: eq_i512: 585; AVX512: # %bb.0: 586; AVX512-NEXT: vpcmpneqd %zmm1, %zmm0, %k0 587; AVX512-NEXT: xorl %eax, %eax 588; AVX512-NEXT: kortestw %k0, %k0 589; AVX512-NEXT: sete %al 590; AVX512-NEXT: vzeroupper 591; AVX512-NEXT: retq 592 %bcx = bitcast <8 x i64> %x to i512 593 %bcy = bitcast <8 x i64> %y to i512 594 %cmp = icmp eq i512 %bcx, %bcy 595 %zext = zext i1 %cmp to i32 596 ret i32 %zext 597} 598 599define i1 @ne_v4i256(<4 x i256> %a0) { 600; SSE2-LABEL: ne_v4i256: 601; SSE2: # %bb.0: 602; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %rax 603; SSE2-NEXT: movq {{[0-9]+}}(%rsp), %r10 604; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %r10 605; SSE2-NEXT: movq %r10, %xmm0 606; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %rax 607; SSE2-NEXT: movq %rax, %xmm1 608; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 609; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %rcx 610; SSE2-NEXT: movq %rcx, %xmm0 611; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %rdx 612; SSE2-NEXT: movq %rdx, %xmm2 613; SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0] 614; SSE2-NEXT: por %xmm1, %xmm2 615; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %r9 616; SSE2-NEXT: movq %r9, %xmm0 617; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %r8 618; SSE2-NEXT: movq %r8, %xmm1 619; SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 620; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %rsi 621; SSE2-NEXT: movq %rsi, %xmm0 622; SSE2-NEXT: orq {{[0-9]+}}(%rsp), %rdi 623; SSE2-NEXT: movq %rdi, %xmm3 624; SSE2-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0] 625; SSE2-NEXT: por %xmm1, %xmm3 626; SSE2-NEXT: por %xmm2, %xmm3 627; SSE2-NEXT: pxor %xmm0, %xmm0 628; SSE2-NEXT: pcmpeqd %xmm3, %xmm0 629; SSE2-NEXT: movmskps %xmm0, %eax 630; SSE2-NEXT: xorl $15, %eax 631; SSE2-NEXT: sete %al 632; SSE2-NEXT: retq 633; 634; SSE41-LABEL: ne_v4i256: 635; SSE41: # %bb.0: 636; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %rax 637; SSE41-NEXT: movq {{[0-9]+}}(%rsp), %r10 638; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %r10 639; SSE41-NEXT: movq %r10, %xmm0 640; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %rax 641; SSE41-NEXT: movq %rax, %xmm1 642; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 643; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %rcx 644; SSE41-NEXT: movq %rcx, %xmm0 645; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %rdx 646; SSE41-NEXT: movq %rdx, %xmm2 647; SSE41-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm0[0] 648; SSE41-NEXT: por %xmm1, %xmm2 649; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %r9 650; SSE41-NEXT: movq %r9, %xmm0 651; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %r8 652; SSE41-NEXT: movq %r8, %xmm1 653; SSE41-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0] 654; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %rsi 655; SSE41-NEXT: movq %rsi, %xmm0 656; SSE41-NEXT: orq {{[0-9]+}}(%rsp), %rdi 657; SSE41-NEXT: movq %rdi, %xmm3 658; SSE41-NEXT: punpcklqdq {{.*#+}} xmm3 = xmm3[0],xmm0[0] 659; SSE41-NEXT: por %xmm1, %xmm3 660; SSE41-NEXT: por %xmm2, %xmm3 661; SSE41-NEXT: ptest %xmm3, %xmm3 662; SSE41-NEXT: sete %al 663; SSE41-NEXT: retq 664; 665; AVX1-LABEL: ne_v4i256: 666; AVX1: # %bb.0: 667; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %rax 668; AVX1-NEXT: movq {{[0-9]+}}(%rsp), %r10 669; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %r10 670; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %rcx 671; AVX1-NEXT: orq %r10, %rcx 672; AVX1-NEXT: vmovq %rcx, %xmm0 673; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %rax 674; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %rdx 675; AVX1-NEXT: orq %rax, %rdx 676; AVX1-NEXT: vmovq %rdx, %xmm1 677; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 678; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %r9 679; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %rsi 680; AVX1-NEXT: orq %r9, %rsi 681; AVX1-NEXT: vmovq %rsi, %xmm1 682; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %r8 683; AVX1-NEXT: orq {{[0-9]+}}(%rsp), %rdi 684; AVX1-NEXT: orq %r8, %rdi 685; AVX1-NEXT: vmovq %rdi, %xmm2 686; AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 687; AVX1-NEXT: vinsertf128 $1, %xmm0, %ymm1, %ymm0 688; AVX1-NEXT: vptest %ymm0, %ymm0 689; AVX1-NEXT: sete %al 690; AVX1-NEXT: vzeroupper 691; AVX1-NEXT: retq 692; 693; AVX2-LABEL: ne_v4i256: 694; AVX2: # %bb.0: 695; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %rax 696; AVX2-NEXT: movq {{[0-9]+}}(%rsp), %r10 697; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %r10 698; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %rcx 699; AVX2-NEXT: orq %r10, %rcx 700; AVX2-NEXT: vmovq %rcx, %xmm0 701; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %rax 702; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %rdx 703; AVX2-NEXT: orq %rax, %rdx 704; AVX2-NEXT: vmovq %rdx, %xmm1 705; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0] 706; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %r9 707; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %rsi 708; AVX2-NEXT: orq %r9, %rsi 709; AVX2-NEXT: vmovq %rsi, %xmm1 710; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %r8 711; AVX2-NEXT: orq {{[0-9]+}}(%rsp), %rdi 712; AVX2-NEXT: orq %r8, %rdi 713; AVX2-NEXT: vmovq %rdi, %xmm2 714; AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm1 = xmm2[0],xmm1[0] 715; AVX2-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 716; AVX2-NEXT: vptest %ymm0, %ymm0 717; AVX2-NEXT: sete %al 718; AVX2-NEXT: vzeroupper 719; AVX2-NEXT: retq 720; 721; AVX512-LABEL: ne_v4i256: 722; AVX512: # %bb.0: 723; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %rax 724; AVX512-NEXT: movq {{[0-9]+}}(%rsp), %r10 725; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %rax 726; AVX512-NEXT: vmovd %eax, %xmm0 727; AVX512-NEXT: shrq $32, %rax 728; AVX512-NEXT: vpinsrd $1, %eax, %xmm0, %xmm0 729; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %r10 730; AVX512-NEXT: vpinsrd $2, %r10d, %xmm0, %xmm0 731; AVX512-NEXT: shrq $32, %r10 732; AVX512-NEXT: vpinsrd $3, %r10d, %xmm0, %xmm0 733; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %r8 734; AVX512-NEXT: vmovd %r8d, %xmm1 735; AVX512-NEXT: shrq $32, %r8 736; AVX512-NEXT: vpinsrd $1, %r8d, %xmm1, %xmm1 737; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %r9 738; AVX512-NEXT: vpinsrd $2, %r9d, %xmm1, %xmm1 739; AVX512-NEXT: shrq $32, %r9 740; AVX512-NEXT: vpinsrd $3, %r9d, %xmm1, %xmm1 741; AVX512-NEXT: vinserti128 $1, %xmm0, %ymm1, %ymm0 742; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %rdx 743; AVX512-NEXT: vmovd %edx, %xmm1 744; AVX512-NEXT: shrq $32, %rdx 745; AVX512-NEXT: vpinsrd $1, %edx, %xmm1, %xmm1 746; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %rcx 747; AVX512-NEXT: vpinsrd $2, %ecx, %xmm1, %xmm1 748; AVX512-NEXT: shrq $32, %rcx 749; AVX512-NEXT: vpinsrd $3, %ecx, %xmm1, %xmm1 750; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %rdi 751; AVX512-NEXT: vmovd %edi, %xmm2 752; AVX512-NEXT: shrq $32, %rdi 753; AVX512-NEXT: vpinsrd $1, %edi, %xmm2, %xmm2 754; AVX512-NEXT: orq {{[0-9]+}}(%rsp), %rsi 755; AVX512-NEXT: vpinsrd $2, %esi, %xmm2, %xmm2 756; AVX512-NEXT: shrq $32, %rsi 757; AVX512-NEXT: vpinsrd $3, %esi, %xmm2, %xmm2 758; AVX512-NEXT: vinserti128 $1, %xmm1, %ymm2, %ymm1 759; AVX512-NEXT: vinserti64x4 $1, %ymm0, %zmm1, %zmm0 760; AVX512-NEXT: vptestmd %zmm0, %zmm0, %k0 761; AVX512-NEXT: kortestw %k0, %k0 762; AVX512-NEXT: sete %al 763; AVX512-NEXT: vzeroupper 764; AVX512-NEXT: retq 765 %c = icmp ne <4 x i256> %a0, zeroinitializer 766 %b = bitcast <4 x i1> %c to i4 767 %r = icmp eq i4 %b, 0 768 ret i1 %r 769} 770 771; This test models the expansion of 'memcmp(a, b, 32) != 0' 772; if we allowed 2 pairs of 16-byte loads per block. 773 774define i32 @ne_i128_pair(ptr %a, ptr %b) { 775; SSE2-LABEL: ne_i128_pair: 776; SSE2: # %bb.0: 777; SSE2-NEXT: movdqa (%rdi), %xmm0 778; SSE2-NEXT: movdqa 16(%rdi), %xmm1 779; SSE2-NEXT: pcmpeqb 16(%rsi), %xmm1 780; SSE2-NEXT: pcmpeqb (%rsi), %xmm0 781; SSE2-NEXT: pand %xmm1, %xmm0 782; SSE2-NEXT: pmovmskb %xmm0, %ecx 783; SSE2-NEXT: xorl %eax, %eax 784; SSE2-NEXT: cmpl $65535, %ecx # imm = 0xFFFF 785; SSE2-NEXT: setne %al 786; SSE2-NEXT: retq 787; 788; SSE41-LABEL: ne_i128_pair: 789; SSE41: # %bb.0: 790; SSE41-NEXT: movdqa (%rdi), %xmm0 791; SSE41-NEXT: movdqa 16(%rdi), %xmm1 792; SSE41-NEXT: pxor 16(%rsi), %xmm1 793; SSE41-NEXT: pxor (%rsi), %xmm0 794; SSE41-NEXT: por %xmm1, %xmm0 795; SSE41-NEXT: xorl %eax, %eax 796; SSE41-NEXT: ptest %xmm0, %xmm0 797; SSE41-NEXT: setne %al 798; SSE41-NEXT: retq 799; 800; AVXANY-LABEL: ne_i128_pair: 801; AVXANY: # %bb.0: 802; AVXANY-NEXT: vmovdqa (%rdi), %xmm0 803; AVXANY-NEXT: vmovdqa 16(%rdi), %xmm1 804; AVXANY-NEXT: vpxor 16(%rsi), %xmm1, %xmm1 805; AVXANY-NEXT: vpxor (%rsi), %xmm0, %xmm0 806; AVXANY-NEXT: vpor %xmm1, %xmm0, %xmm0 807; AVXANY-NEXT: xorl %eax, %eax 808; AVXANY-NEXT: vptest %xmm0, %xmm0 809; AVXANY-NEXT: setne %al 810; AVXANY-NEXT: retq 811 %a0 = load i128, ptr %a 812 %b0 = load i128, ptr %b 813 %xor1 = xor i128 %a0, %b0 814 %ap1 = getelementptr i128, ptr %a, i128 1 815 %bp1 = getelementptr i128, ptr %b, i128 1 816 %a1 = load i128, ptr %ap1 817 %b1 = load i128, ptr %bp1 818 %xor2 = xor i128 %a1, %b1 819 %or = or i128 %xor1, %xor2 820 %cmp = icmp ne i128 %or, 0 821 %z = zext i1 %cmp to i32 822 ret i32 %z 823} 824 825; This test models the expansion of 'memcmp(a, b, 32) == 0' 826; if we allowed 2 pairs of 16-byte loads per block. 827 828define i32 @eq_i128_pair(ptr %a, ptr %b) { 829; SSE2-LABEL: eq_i128_pair: 830; SSE2: # %bb.0: 831; SSE2-NEXT: movdqa (%rdi), %xmm0 832; SSE2-NEXT: movdqa 16(%rdi), %xmm1 833; SSE2-NEXT: pcmpeqb 16(%rsi), %xmm1 834; SSE2-NEXT: pcmpeqb (%rsi), %xmm0 835; SSE2-NEXT: pand %xmm1, %xmm0 836; SSE2-NEXT: pmovmskb %xmm0, %ecx 837; SSE2-NEXT: xorl %eax, %eax 838; SSE2-NEXT: cmpl $65535, %ecx # imm = 0xFFFF 839; SSE2-NEXT: sete %al 840; SSE2-NEXT: retq 841; 842; SSE41-LABEL: eq_i128_pair: 843; SSE41: # %bb.0: 844; SSE41-NEXT: movdqa (%rdi), %xmm0 845; SSE41-NEXT: movdqa 16(%rdi), %xmm1 846; SSE41-NEXT: pxor 16(%rsi), %xmm1 847; SSE41-NEXT: pxor (%rsi), %xmm0 848; SSE41-NEXT: por %xmm1, %xmm0 849; SSE41-NEXT: xorl %eax, %eax 850; SSE41-NEXT: ptest %xmm0, %xmm0 851; SSE41-NEXT: sete %al 852; SSE41-NEXT: retq 853; 854; AVXANY-LABEL: eq_i128_pair: 855; AVXANY: # %bb.0: 856; AVXANY-NEXT: vmovdqa (%rdi), %xmm0 857; AVXANY-NEXT: vmovdqa 16(%rdi), %xmm1 858; AVXANY-NEXT: vpxor 16(%rsi), %xmm1, %xmm1 859; AVXANY-NEXT: vpxor (%rsi), %xmm0, %xmm0 860; AVXANY-NEXT: vpor %xmm1, %xmm0, %xmm0 861; AVXANY-NEXT: xorl %eax, %eax 862; AVXANY-NEXT: vptest %xmm0, %xmm0 863; AVXANY-NEXT: sete %al 864; AVXANY-NEXT: retq 865 %a0 = load i128, ptr %a 866 %b0 = load i128, ptr %b 867 %xor1 = xor i128 %a0, %b0 868 %ap1 = getelementptr i128, ptr %a, i128 1 869 %bp1 = getelementptr i128, ptr %b, i128 1 870 %a1 = load i128, ptr %ap1 871 %b1 = load i128, ptr %bp1 872 %xor2 = xor i128 %a1, %b1 873 %or = or i128 %xor1, %xor2 874 %cmp = icmp eq i128 %or, 0 875 %z = zext i1 %cmp to i32 876 ret i32 %z 877} 878 879; This test models the expansion of 'memcmp(a, b, 64) != 0' 880; if we allowed 2 pairs of 32-byte loads per block. 881 882define i32 @ne_i256_pair(ptr %a, ptr %b) { 883; SSE-LABEL: ne_i256_pair: 884; SSE: # %bb.0: 885; SSE-NEXT: movq 16(%rdi), %rax 886; SSE-NEXT: movq 24(%rdi), %rcx 887; SSE-NEXT: movq (%rdi), %rdx 888; SSE-NEXT: movq 8(%rdi), %r8 889; SSE-NEXT: xorq 8(%rsi), %r8 890; SSE-NEXT: xorq 24(%rsi), %rcx 891; SSE-NEXT: xorq (%rsi), %rdx 892; SSE-NEXT: xorq 16(%rsi), %rax 893; SSE-NEXT: movq 48(%rdi), %r9 894; SSE-NEXT: movq 32(%rdi), %r10 895; SSE-NEXT: movq 56(%rdi), %r11 896; SSE-NEXT: movq 40(%rdi), %rdi 897; SSE-NEXT: xorq 40(%rsi), %rdi 898; SSE-NEXT: orq %r8, %rdi 899; SSE-NEXT: xorq 56(%rsi), %r11 900; SSE-NEXT: orq %rcx, %r11 901; SSE-NEXT: orq %rdi, %r11 902; SSE-NEXT: xorq 32(%rsi), %r10 903; SSE-NEXT: orq %rdx, %r10 904; SSE-NEXT: xorq 48(%rsi), %r9 905; SSE-NEXT: orq %rax, %r9 906; SSE-NEXT: orq %r10, %r9 907; SSE-NEXT: xorl %eax, %eax 908; SSE-NEXT: orq %r11, %r9 909; SSE-NEXT: setne %al 910; SSE-NEXT: retq 911; 912; AVX1-LABEL: ne_i256_pair: 913; AVX1: # %bb.0: 914; AVX1-NEXT: vmovups (%rdi), %ymm0 915; AVX1-NEXT: vmovups 32(%rdi), %ymm1 916; AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1 917; AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 918; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 919; AVX1-NEXT: xorl %eax, %eax 920; AVX1-NEXT: vptest %ymm0, %ymm0 921; AVX1-NEXT: setne %al 922; AVX1-NEXT: vzeroupper 923; AVX1-NEXT: retq 924; 925; AVX2-LABEL: ne_i256_pair: 926; AVX2: # %bb.0: 927; AVX2-NEXT: vmovdqu (%rdi), %ymm0 928; AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 929; AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1 930; AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 931; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 932; AVX2-NEXT: xorl %eax, %eax 933; AVX2-NEXT: vptest %ymm0, %ymm0 934; AVX2-NEXT: setne %al 935; AVX2-NEXT: vzeroupper 936; AVX2-NEXT: retq 937; 938; AVX512-LABEL: ne_i256_pair: 939; AVX512: # %bb.0: 940; AVX512-NEXT: vmovdqu (%rdi), %ymm0 941; AVX512-NEXT: vmovdqu 32(%rdi), %ymm1 942; AVX512-NEXT: vpxor 32(%rsi), %ymm1, %ymm1 943; AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0 944; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 945; AVX512-NEXT: xorl %eax, %eax 946; AVX512-NEXT: vptest %ymm0, %ymm0 947; AVX512-NEXT: setne %al 948; AVX512-NEXT: vzeroupper 949; AVX512-NEXT: retq 950 %a0 = load i256, ptr %a 951 %b0 = load i256, ptr %b 952 %xor1 = xor i256 %a0, %b0 953 %ap1 = getelementptr i256, ptr %a, i256 1 954 %bp1 = getelementptr i256, ptr %b, i256 1 955 %a1 = load i256, ptr %ap1 956 %b1 = load i256, ptr %bp1 957 %xor2 = xor i256 %a1, %b1 958 %or = or i256 %xor1, %xor2 959 %cmp = icmp ne i256 %or, 0 960 %z = zext i1 %cmp to i32 961 ret i32 %z 962} 963 964; This test models the expansion of 'memcmp(a, b, 64) == 0' 965; if we allowed 2 pairs of 32-byte loads per block. 966 967define i32 @eq_i256_pair(ptr %a, ptr %b) { 968; SSE-LABEL: eq_i256_pair: 969; SSE: # %bb.0: 970; SSE-NEXT: movq 16(%rdi), %rax 971; SSE-NEXT: movq 24(%rdi), %rcx 972; SSE-NEXT: movq (%rdi), %rdx 973; SSE-NEXT: movq 8(%rdi), %r8 974; SSE-NEXT: xorq 8(%rsi), %r8 975; SSE-NEXT: xorq 24(%rsi), %rcx 976; SSE-NEXT: xorq (%rsi), %rdx 977; SSE-NEXT: xorq 16(%rsi), %rax 978; SSE-NEXT: movq 48(%rdi), %r9 979; SSE-NEXT: movq 32(%rdi), %r10 980; SSE-NEXT: movq 56(%rdi), %r11 981; SSE-NEXT: movq 40(%rdi), %rdi 982; SSE-NEXT: xorq 40(%rsi), %rdi 983; SSE-NEXT: orq %r8, %rdi 984; SSE-NEXT: xorq 56(%rsi), %r11 985; SSE-NEXT: orq %rcx, %r11 986; SSE-NEXT: orq %rdi, %r11 987; SSE-NEXT: xorq 32(%rsi), %r10 988; SSE-NEXT: orq %rdx, %r10 989; SSE-NEXT: xorq 48(%rsi), %r9 990; SSE-NEXT: orq %rax, %r9 991; SSE-NEXT: orq %r10, %r9 992; SSE-NEXT: xorl %eax, %eax 993; SSE-NEXT: orq %r11, %r9 994; SSE-NEXT: sete %al 995; SSE-NEXT: retq 996; 997; AVX1-LABEL: eq_i256_pair: 998; AVX1: # %bb.0: 999; AVX1-NEXT: vmovups (%rdi), %ymm0 1000; AVX1-NEXT: vmovups 32(%rdi), %ymm1 1001; AVX1-NEXT: vxorps 32(%rsi), %ymm1, %ymm1 1002; AVX1-NEXT: vxorps (%rsi), %ymm0, %ymm0 1003; AVX1-NEXT: vorps %ymm1, %ymm0, %ymm0 1004; AVX1-NEXT: xorl %eax, %eax 1005; AVX1-NEXT: vptest %ymm0, %ymm0 1006; AVX1-NEXT: sete %al 1007; AVX1-NEXT: vzeroupper 1008; AVX1-NEXT: retq 1009; 1010; AVX2-LABEL: eq_i256_pair: 1011; AVX2: # %bb.0: 1012; AVX2-NEXT: vmovdqu (%rdi), %ymm0 1013; AVX2-NEXT: vmovdqu 32(%rdi), %ymm1 1014; AVX2-NEXT: vpxor 32(%rsi), %ymm1, %ymm1 1015; AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0 1016; AVX2-NEXT: vpor %ymm1, %ymm0, %ymm0 1017; AVX2-NEXT: xorl %eax, %eax 1018; AVX2-NEXT: vptest %ymm0, %ymm0 1019; AVX2-NEXT: sete %al 1020; AVX2-NEXT: vzeroupper 1021; AVX2-NEXT: retq 1022; 1023; AVX512-LABEL: eq_i256_pair: 1024; AVX512: # %bb.0: 1025; AVX512-NEXT: vmovdqu (%rdi), %ymm0 1026; AVX512-NEXT: vmovdqu 32(%rdi), %ymm1 1027; AVX512-NEXT: vpxor 32(%rsi), %ymm1, %ymm1 1028; AVX512-NEXT: vpxor (%rsi), %ymm0, %ymm0 1029; AVX512-NEXT: vpor %ymm1, %ymm0, %ymm0 1030; AVX512-NEXT: xorl %eax, %eax 1031; AVX512-NEXT: vptest %ymm0, %ymm0 1032; AVX512-NEXT: sete %al 1033; AVX512-NEXT: vzeroupper 1034; AVX512-NEXT: retq 1035 %a0 = load i256, ptr %a 1036 %b0 = load i256, ptr %b 1037 %xor1 = xor i256 %a0, %b0 1038 %ap1 = getelementptr i256, ptr %a, i256 1 1039 %bp1 = getelementptr i256, ptr %b, i256 1 1040 %a1 = load i256, ptr %ap1 1041 %b1 = load i256, ptr %bp1 1042 %xor2 = xor i256 %a1, %b1 1043 %or = or i256 %xor1, %xor2 1044 %cmp = icmp eq i256 %or, 0 1045 %z = zext i1 %cmp to i32 1046 ret i32 %z 1047} 1048 1049; This test models the expansion of 'memcmp(a, b, 64) != 0' 1050; if we allowed 2 pairs of 64-byte loads per block. 1051 1052define i32 @ne_i512_pair(ptr %a, ptr %b) { 1053; NO512-LABEL: ne_i512_pair: 1054; NO512: # %bb.0: 1055; NO512-NEXT: movq 40(%rdi), %rax 1056; NO512-NEXT: movq 56(%rdi), %rcx 1057; NO512-NEXT: movq 24(%rdi), %rdx 1058; NO512-NEXT: xorq 24(%rsi), %rdx 1059; NO512-NEXT: xorq 56(%rsi), %rcx 1060; NO512-NEXT: movq 88(%rdi), %r8 1061; NO512-NEXT: xorq 88(%rsi), %r8 1062; NO512-NEXT: orq %rdx, %r8 1063; NO512-NEXT: movq 120(%rdi), %rdx 1064; NO512-NEXT: xorq 120(%rsi), %rdx 1065; NO512-NEXT: orq %rcx, %rdx 1066; NO512-NEXT: movq 8(%rdi), %rcx 1067; NO512-NEXT: xorq 8(%rsi), %rcx 1068; NO512-NEXT: xorq 40(%rsi), %rax 1069; NO512-NEXT: orq %r8, %rdx 1070; NO512-NEXT: movq 72(%rdi), %r8 1071; NO512-NEXT: xorq 72(%rsi), %r8 1072; NO512-NEXT: orq %rcx, %r8 1073; NO512-NEXT: movq 104(%rdi), %rcx 1074; NO512-NEXT: xorq 104(%rsi), %rcx 1075; NO512-NEXT: orq %rax, %rcx 1076; NO512-NEXT: movq 48(%rdi), %rax 1077; NO512-NEXT: orq %r8, %rcx 1078; NO512-NEXT: movq 16(%rdi), %r8 1079; NO512-NEXT: xorq 16(%rsi), %r8 1080; NO512-NEXT: xorq 48(%rsi), %rax 1081; NO512-NEXT: orq %rdx, %rcx 1082; NO512-NEXT: movq 80(%rdi), %rdx 1083; NO512-NEXT: xorq 80(%rsi), %rdx 1084; NO512-NEXT: orq %r8, %rdx 1085; NO512-NEXT: movq 112(%rdi), %r8 1086; NO512-NEXT: xorq 112(%rsi), %r8 1087; NO512-NEXT: orq %rax, %r8 1088; NO512-NEXT: movq (%rdi), %rax 1089; NO512-NEXT: xorq (%rsi), %rax 1090; NO512-NEXT: orq %rdx, %r8 1091; NO512-NEXT: movq 64(%rdi), %rdx 1092; NO512-NEXT: xorq 64(%rsi), %rdx 1093; NO512-NEXT: orq %rax, %rdx 1094; NO512-NEXT: movq 32(%rdi), %rax 1095; NO512-NEXT: xorq 32(%rsi), %rax 1096; NO512-NEXT: movq 96(%rdi), %rdi 1097; NO512-NEXT: xorq 96(%rsi), %rdi 1098; NO512-NEXT: orq %rax, %rdi 1099; NO512-NEXT: orq %rdx, %rdi 1100; NO512-NEXT: orq %r8, %rdi 1101; NO512-NEXT: xorl %eax, %eax 1102; NO512-NEXT: orq %rcx, %rdi 1103; NO512-NEXT: setne %al 1104; NO512-NEXT: retq 1105; 1106; AVX512F-LABEL: ne_i512_pair: 1107; AVX512F: # %bb.0: 1108; AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 1109; AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 1110; AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0 1111; AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 1112; AVX512F-NEXT: xorl %eax, %eax 1113; AVX512F-NEXT: kortestw %k0, %k1 1114; AVX512F-NEXT: setne %al 1115; AVX512F-NEXT: vzeroupper 1116; AVX512F-NEXT: retq 1117; 1118; AVX512BW-LABEL: ne_i512_pair: 1119; AVX512BW: # %bb.0: 1120; AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 1121; AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 1122; AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k0 1123; AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1 1124; AVX512BW-NEXT: xorl %eax, %eax 1125; AVX512BW-NEXT: kortestq %k0, %k1 1126; AVX512BW-NEXT: setne %al 1127; AVX512BW-NEXT: vzeroupper 1128; AVX512BW-NEXT: retq 1129 %a0 = load i512, ptr %a 1130 %b0 = load i512, ptr %b 1131 %xor1 = xor i512 %a0, %b0 1132 %ap1 = getelementptr i512, ptr %a, i512 1 1133 %bp1 = getelementptr i512, ptr %b, i512 1 1134 %a1 = load i512, ptr %ap1 1135 %b1 = load i512, ptr %bp1 1136 %xor2 = xor i512 %a1, %b1 1137 %or = or i512 %xor1, %xor2 1138 %cmp = icmp ne i512 %or, 0 1139 %z = zext i1 %cmp to i32 1140 ret i32 %z 1141} 1142 1143; This test models the expansion of 'memcmp(a, b, 64) == 0' 1144; if we allowed 2 pairs of 64-byte loads per block. 1145 1146define i32 @eq_i512_pair(ptr %a, ptr %b) { 1147; NO512-LABEL: eq_i512_pair: 1148; NO512: # %bb.0: 1149; NO512-NEXT: movq 40(%rdi), %rax 1150; NO512-NEXT: movq 56(%rdi), %rcx 1151; NO512-NEXT: movq 24(%rdi), %rdx 1152; NO512-NEXT: xorq 24(%rsi), %rdx 1153; NO512-NEXT: xorq 56(%rsi), %rcx 1154; NO512-NEXT: movq 88(%rdi), %r8 1155; NO512-NEXT: xorq 88(%rsi), %r8 1156; NO512-NEXT: orq %rdx, %r8 1157; NO512-NEXT: movq 120(%rdi), %rdx 1158; NO512-NEXT: xorq 120(%rsi), %rdx 1159; NO512-NEXT: orq %rcx, %rdx 1160; NO512-NEXT: movq 8(%rdi), %rcx 1161; NO512-NEXT: xorq 8(%rsi), %rcx 1162; NO512-NEXT: xorq 40(%rsi), %rax 1163; NO512-NEXT: orq %r8, %rdx 1164; NO512-NEXT: movq 72(%rdi), %r8 1165; NO512-NEXT: xorq 72(%rsi), %r8 1166; NO512-NEXT: orq %rcx, %r8 1167; NO512-NEXT: movq 104(%rdi), %rcx 1168; NO512-NEXT: xorq 104(%rsi), %rcx 1169; NO512-NEXT: orq %rax, %rcx 1170; NO512-NEXT: movq 48(%rdi), %rax 1171; NO512-NEXT: orq %r8, %rcx 1172; NO512-NEXT: movq 16(%rdi), %r8 1173; NO512-NEXT: xorq 16(%rsi), %r8 1174; NO512-NEXT: xorq 48(%rsi), %rax 1175; NO512-NEXT: orq %rdx, %rcx 1176; NO512-NEXT: movq 80(%rdi), %rdx 1177; NO512-NEXT: xorq 80(%rsi), %rdx 1178; NO512-NEXT: orq %r8, %rdx 1179; NO512-NEXT: movq 112(%rdi), %r8 1180; NO512-NEXT: xorq 112(%rsi), %r8 1181; NO512-NEXT: orq %rax, %r8 1182; NO512-NEXT: movq (%rdi), %rax 1183; NO512-NEXT: xorq (%rsi), %rax 1184; NO512-NEXT: orq %rdx, %r8 1185; NO512-NEXT: movq 64(%rdi), %rdx 1186; NO512-NEXT: xorq 64(%rsi), %rdx 1187; NO512-NEXT: orq %rax, %rdx 1188; NO512-NEXT: movq 32(%rdi), %rax 1189; NO512-NEXT: xorq 32(%rsi), %rax 1190; NO512-NEXT: movq 96(%rdi), %rdi 1191; NO512-NEXT: xorq 96(%rsi), %rdi 1192; NO512-NEXT: orq %rax, %rdi 1193; NO512-NEXT: orq %rdx, %rdi 1194; NO512-NEXT: orq %r8, %rdi 1195; NO512-NEXT: xorl %eax, %eax 1196; NO512-NEXT: orq %rcx, %rdi 1197; NO512-NEXT: sete %al 1198; NO512-NEXT: retq 1199; 1200; AVX512F-LABEL: eq_i512_pair: 1201; AVX512F: # %bb.0: 1202; AVX512F-NEXT: vmovdqu64 (%rdi), %zmm0 1203; AVX512F-NEXT: vmovdqu64 64(%rdi), %zmm1 1204; AVX512F-NEXT: vpcmpneqd 64(%rsi), %zmm1, %k0 1205; AVX512F-NEXT: vpcmpneqd (%rsi), %zmm0, %k1 1206; AVX512F-NEXT: xorl %eax, %eax 1207; AVX512F-NEXT: kortestw %k0, %k1 1208; AVX512F-NEXT: sete %al 1209; AVX512F-NEXT: vzeroupper 1210; AVX512F-NEXT: retq 1211; 1212; AVX512BW-LABEL: eq_i512_pair: 1213; AVX512BW: # %bb.0: 1214; AVX512BW-NEXT: vmovdqu64 (%rdi), %zmm0 1215; AVX512BW-NEXT: vmovdqu64 64(%rdi), %zmm1 1216; AVX512BW-NEXT: vpcmpneqb 64(%rsi), %zmm1, %k0 1217; AVX512BW-NEXT: vpcmpneqb (%rsi), %zmm0, %k1 1218; AVX512BW-NEXT: xorl %eax, %eax 1219; AVX512BW-NEXT: kortestq %k0, %k1 1220; AVX512BW-NEXT: sete %al 1221; AVX512BW-NEXT: vzeroupper 1222; AVX512BW-NEXT: retq 1223 %a0 = load i512, ptr %a 1224 %b0 = load i512, ptr %b 1225 %xor1 = xor i512 %a0, %b0 1226 %ap1 = getelementptr i512, ptr %a, i512 1 1227 %bp1 = getelementptr i512, ptr %b, i512 1 1228 %a1 = load i512, ptr %ap1 1229 %b1 = load i512, ptr %bp1 1230 %xor2 = xor i512 %a1, %b1 1231 %or = or i512 %xor1, %xor2 1232 %cmp = icmp eq i512 %or, 0 1233 %z = zext i1 %cmp to i32 1234 ret i32 %z 1235} 1236 1237; PR41971: Comparison using vector types is not favorable here. 1238define i1 @eq_i128_args(i128 %a, i128 %b) { 1239; ANY-LABEL: eq_i128_args: 1240; ANY: # %bb.0: 1241; ANY-NEXT: xorq %rcx, %rsi 1242; ANY-NEXT: xorq %rdx, %rdi 1243; ANY-NEXT: orq %rsi, %rdi 1244; ANY-NEXT: sete %al 1245; ANY-NEXT: retq 1246 %r = icmp eq i128 %a, %b 1247 ret i1 %r 1248} 1249 1250define i1 @eq_i256_args(i256 %a, i256 %b) { 1251; ANY-LABEL: eq_i256_args: 1252; ANY: # %bb.0: 1253; ANY-NEXT: xorq %r9, %rsi 1254; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rcx 1255; ANY-NEXT: orq %rsi, %rcx 1256; ANY-NEXT: xorq %r8, %rdi 1257; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rdx 1258; ANY-NEXT: orq %rdi, %rdx 1259; ANY-NEXT: orq %rcx, %rdx 1260; ANY-NEXT: sete %al 1261; ANY-NEXT: retq 1262 %r = icmp eq i256 %a, %b 1263 ret i1 %r 1264} 1265 1266define i1 @eq_i512_args(i512 %a, i512 %b) { 1267; ANY-LABEL: eq_i512_args: 1268; ANY: # %bb.0: 1269; ANY-NEXT: movq {{[0-9]+}}(%rsp), %rax 1270; ANY-NEXT: movq {{[0-9]+}}(%rsp), %r10 1271; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %r10 1272; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rcx 1273; ANY-NEXT: orq %r10, %rcx 1274; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %r9 1275; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rsi 1276; ANY-NEXT: orq %r9, %rsi 1277; ANY-NEXT: orq %rcx, %rsi 1278; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rax 1279; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rdx 1280; ANY-NEXT: orq %rax, %rdx 1281; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %r8 1282; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rdi 1283; ANY-NEXT: orq %r8, %rdi 1284; ANY-NEXT: orq %rdx, %rdi 1285; ANY-NEXT: orq %rsi, %rdi 1286; ANY-NEXT: sete %al 1287; ANY-NEXT: retq 1288 %r = icmp eq i512 %a, %b 1289 ret i1 %r 1290} 1291 1292define i1 @eq_i128_op(i128 %a, i128 %b) { 1293; ANY-LABEL: eq_i128_op: 1294; ANY: # %bb.0: 1295; ANY-NEXT: addq $1, %rdi 1296; ANY-NEXT: adcq $0, %rsi 1297; ANY-NEXT: xorq %rdx, %rdi 1298; ANY-NEXT: xorq %rcx, %rsi 1299; ANY-NEXT: orq %rdi, %rsi 1300; ANY-NEXT: sete %al 1301; ANY-NEXT: retq 1302 %a2 = add i128 %a, 1 1303 %r = icmp eq i128 %a2, %b 1304 ret i1 %r 1305} 1306 1307define i1 @eq_i256_op(i256 %a, i256 %b) { 1308; ANY-LABEL: eq_i256_op: 1309; ANY: # %bb.0: 1310; ANY-NEXT: addq $1, %rdi 1311; ANY-NEXT: adcq $0, %rsi 1312; ANY-NEXT: adcq $0, %rdx 1313; ANY-NEXT: adcq $0, %rcx 1314; ANY-NEXT: xorq %r8, %rdi 1315; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rdx 1316; ANY-NEXT: orq %rdi, %rdx 1317; ANY-NEXT: xorq %r9, %rsi 1318; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rcx 1319; ANY-NEXT: orq %rsi, %rcx 1320; ANY-NEXT: orq %rdx, %rcx 1321; ANY-NEXT: sete %al 1322; ANY-NEXT: retq 1323 %a2 = add i256 %a, 1 1324 %r = icmp eq i256 %a2, %b 1325 ret i1 %r 1326} 1327 1328define i1 @eq_i512_op(i512 %a, i512 %b) { 1329; SSE-LABEL: eq_i512_op: 1330; SSE: # %bb.0: 1331; SSE-NEXT: movq {{[0-9]+}}(%rsp), %rax 1332; SSE-NEXT: movq {{[0-9]+}}(%rsp), %r10 1333; SSE-NEXT: addq $1, %rdi 1334; SSE-NEXT: adcq $0, %rsi 1335; SSE-NEXT: adcq $0, %rdx 1336; SSE-NEXT: adcq $0, %rcx 1337; SSE-NEXT: adcq $0, %r8 1338; SSE-NEXT: adcq $0, %r9 1339; SSE-NEXT: adcq $0, %r10 1340; SSE-NEXT: adcq $0, %rax 1341; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %rsi 1342; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %r9 1343; SSE-NEXT: orq %rsi, %r9 1344; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %rcx 1345; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %rax 1346; SSE-NEXT: orq %rcx, %rax 1347; SSE-NEXT: orq %r9, %rax 1348; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %rdx 1349; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %r10 1350; SSE-NEXT: orq %rdx, %r10 1351; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %r8 1352; SSE-NEXT: xorq {{[0-9]+}}(%rsp), %rdi 1353; SSE-NEXT: orq %r8, %rdi 1354; SSE-NEXT: orq %r10, %rdi 1355; SSE-NEXT: orq %rax, %rdi 1356; SSE-NEXT: sete %al 1357; SSE-NEXT: retq 1358; 1359; AVXANY-LABEL: eq_i512_op: 1360; AVXANY: # %bb.0: 1361; AVXANY-NEXT: movq {{[0-9]+}}(%rsp), %r10 1362; AVXANY-NEXT: movq {{[0-9]+}}(%rsp), %rax 1363; AVXANY-NEXT: addq $1, %rdi 1364; AVXANY-NEXT: adcq $0, %rsi 1365; AVXANY-NEXT: adcq $0, %rdx 1366; AVXANY-NEXT: adcq $0, %rcx 1367; AVXANY-NEXT: adcq $0, %r8 1368; AVXANY-NEXT: adcq $0, %r9 1369; AVXANY-NEXT: adcq $0, %r10 1370; AVXANY-NEXT: adcq $0, %rax 1371; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %rsi 1372; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %r9 1373; AVXANY-NEXT: orq %rsi, %r9 1374; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %rcx 1375; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %rax 1376; AVXANY-NEXT: orq %rcx, %rax 1377; AVXANY-NEXT: orq %r9, %rax 1378; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %rdx 1379; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %r10 1380; AVXANY-NEXT: orq %rdx, %r10 1381; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %r8 1382; AVXANY-NEXT: xorq {{[0-9]+}}(%rsp), %rdi 1383; AVXANY-NEXT: orq %r8, %rdi 1384; AVXANY-NEXT: orq %r10, %rdi 1385; AVXANY-NEXT: orq %rax, %rdi 1386; AVXANY-NEXT: sete %al 1387; AVXANY-NEXT: retq 1388 %a2 = add i512 %a, 1 1389 %r = icmp eq i512 %a2, %b 1390 ret i1 %r 1391} 1392 1393define i1 @eq_i128_load_arg(ptr%p, i128 %b) { 1394; ANY-LABEL: eq_i128_load_arg: 1395; ANY: # %bb.0: 1396; ANY-NEXT: xorq 8(%rdi), %rdx 1397; ANY-NEXT: xorq (%rdi), %rsi 1398; ANY-NEXT: orq %rdx, %rsi 1399; ANY-NEXT: sete %al 1400; ANY-NEXT: retq 1401 %a = load i128, ptr %p 1402 %r = icmp eq i128 %a, %b 1403 ret i1 %r 1404} 1405 1406define i1 @eq_i256_load_arg(ptr%p, i256 %b) { 1407; ANY-LABEL: eq_i256_load_arg: 1408; ANY: # %bb.0: 1409; ANY-NEXT: xorq 24(%rdi), %r8 1410; ANY-NEXT: xorq 8(%rdi), %rdx 1411; ANY-NEXT: orq %r8, %rdx 1412; ANY-NEXT: xorq 16(%rdi), %rcx 1413; ANY-NEXT: xorq (%rdi), %rsi 1414; ANY-NEXT: orq %rcx, %rsi 1415; ANY-NEXT: orq %rdx, %rsi 1416; ANY-NEXT: sete %al 1417; ANY-NEXT: retq 1418 %a = load i256, ptr %p 1419 %r = icmp eq i256 %a, %b 1420 ret i1 %r 1421} 1422 1423define i1 @eq_i512_load_arg(ptr%p, i512 %b) { 1424; ANY-LABEL: eq_i512_load_arg: 1425; ANY: # %bb.0: 1426; ANY-NEXT: movq 40(%rdi), %rax 1427; ANY-NEXT: movq 48(%rdi), %r10 1428; ANY-NEXT: movq 56(%rdi), %r11 1429; ANY-NEXT: xorq 24(%rdi), %r8 1430; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %r11 1431; ANY-NEXT: orq %r8, %r11 1432; ANY-NEXT: xorq 8(%rdi), %rdx 1433; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %rax 1434; ANY-NEXT: orq %rdx, %rax 1435; ANY-NEXT: orq %r11, %rax 1436; ANY-NEXT: xorq 32(%rdi), %r9 1437; ANY-NEXT: xorq (%rdi), %rsi 1438; ANY-NEXT: orq %r9, %rsi 1439; ANY-NEXT: xorq 16(%rdi), %rcx 1440; ANY-NEXT: xorq {{[0-9]+}}(%rsp), %r10 1441; ANY-NEXT: orq %rcx, %r10 1442; ANY-NEXT: orq %rsi, %r10 1443; ANY-NEXT: orq %rax, %r10 1444; ANY-NEXT: sete %al 1445; ANY-NEXT: retq 1446 %a = load i512, ptr %p 1447 %r = icmp eq i512 %a, %b 1448 ret i1 %r 1449} 1450