120 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+sse4.2 | FileCheck %s3 4define i1 @cmp_allbits_concat_i8(i8 %x, i8 %y) {5; CHECK-LABEL: cmp_allbits_concat_i8:6; CHECK: # %bb.0:7; CHECK-NEXT: andl %esi, %edi8; CHECK-NEXT: cmpb $-1, %dil9; CHECK-NEXT: sete %al10; CHECK-NEXT: retq11 %zx = zext i8 %x to i1612 %zy = zext i8 %y to i1613 %sh = shl i16 %zx, 814 %or = or i16 %zy, %sh15 %r = icmp eq i16 %or, -116 ret i1 %r17}18 19define i1 @cmp_anybits_concat_i32(i32 %x, i32 %y) {20; CHECK-LABEL: cmp_anybits_concat_i32:21; CHECK: # %bb.0:22; CHECK-NEXT: orl %esi, %edi23; CHECK-NEXT: setne %al24; CHECK-NEXT: retq25 %zx = zext i32 %x to i6426 %zy = zext i32 %y to i6427 %sh = shl i64 %zx, 3228 %or = or i64 %zy, %sh29 %r = icmp ne i64 %or, 030 ret i1 %r31}32 33define i1 @cmp_anybits_concat_shl_shl_i16(i16 %x, i16 %y) {34; CHECK-LABEL: cmp_anybits_concat_shl_shl_i16:35; CHECK: # %bb.0:36; CHECK-NEXT: movzwl %di, %eax37; CHECK-NEXT: movzwl %si, %ecx38; CHECK-NEXT: shll $8, %ecx39; CHECK-NEXT: orl %eax, %ecx40; CHECK-NEXT: sete %al41; CHECK-NEXT: retq42 %zx = zext i16 %x to i6443 %zy = zext i16 %y to i6444 %sx = shl i64 %zx, 3245 %sy = shl i64 %zy, 846 %or = or i64 %sx, %sy47 %r = icmp eq i64 %or, 048 ret i1 %r49}50 51define i1 @cmp_anybits_concat_shl_shl_i16_commute(i16 %x, i16 %y) {52; CHECK-LABEL: cmp_anybits_concat_shl_shl_i16_commute:53; CHECK: # %bb.0:54; CHECK-NEXT: movzwl %di, %eax55; CHECK-NEXT: movzwl %si, %ecx56; CHECK-NEXT: shll $8, %ecx57; CHECK-NEXT: orl %eax, %ecx58; CHECK-NEXT: sete %al59; CHECK-NEXT: retq60 %zx = zext i16 %x to i6461 %zy = zext i16 %y to i6462 %sx = shl i64 %zx, 3263 %sy = shl i64 %zy, 864 %or = or i64 %sy, %sx65 %r = icmp eq i64 %or, 066 ret i1 %r67}68 69; FIXME: Add vector support, but its only worth it if we can freely truncate the70; concat'd vectors.71 72define <16 x i8> @cmp_allbits_concat_v16i8(<16 x i8> %x, <16 x i8> %y) {73; CHECK-LABEL: cmp_allbits_concat_v16i8:74; CHECK: # %bb.0:75; CHECK-NEXT: movdqa %xmm1, %xmm276; CHECK-NEXT: punpcklbw {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1],xmm2[2],xmm0[2],xmm2[3],xmm0[3],xmm2[4],xmm0[4],xmm2[5],xmm0[5],xmm2[6],xmm0[6],xmm2[7],xmm0[7]77; CHECK-NEXT: punpckhbw {{.*#+}} xmm1 = xmm1[8],xmm0[8],xmm1[9],xmm0[9],xmm1[10],xmm0[10],xmm1[11],xmm0[11],xmm1[12],xmm0[12],xmm1[13],xmm0[13],xmm1[14],xmm0[14],xmm1[15],xmm0[15]78; CHECK-NEXT: pcmpeqd %xmm0, %xmm079; CHECK-NEXT: pcmpeqw %xmm0, %xmm180; CHECK-NEXT: pcmpeqw %xmm0, %xmm281; CHECK-NEXT: packsswb %xmm1, %xmm282; CHECK-NEXT: movdqa %xmm2, %xmm083; CHECK-NEXT: retq84 %zx = zext <16 x i8> %x to <16 x i16>85 %zy = zext <16 x i8> %y to <16 x i16>86 %sh = shl <16 x i16> %zx, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>87 %or = or <16 x i16> %zy, %sh88 %r = icmp eq <16 x i16> %or, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1>89 %s = sext <16 x i1> %r to <16 x i8>90 ret <16 x i8> %s91}92 93define <2 x i64> @cmp_nobits_concat_v2i64(<2 x i64> %x, <2 x i64> %y) {94; CHECK-LABEL: cmp_nobits_concat_v2i64:95; CHECK: # %bb.0:96; CHECK-NEXT: movq %xmm0, %rax97; CHECK-NEXT: pextrq $1, %xmm0, %rcx98; CHECK-NEXT: movq %xmm1, %rdx99; CHECK-NEXT: pextrq $1, %xmm1, %rsi100; CHECK-NEXT: xorl %edi, %edi101; CHECK-NEXT: orq %rcx, %rsi102; CHECK-NEXT: sete %dil103; CHECK-NEXT: negq %rdi104; CHECK-NEXT: movq %rdi, %xmm1105; CHECK-NEXT: xorl %ecx, %ecx106; CHECK-NEXT: orq %rax, %rdx107; CHECK-NEXT: sete %cl108; CHECK-NEXT: negq %rcx109; CHECK-NEXT: movq %rcx, %xmm0110; CHECK-NEXT: punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]111; CHECK-NEXT: retq112 %zx = zext <2 x i64> %x to <2 x i128>113 %zy = zext <2 x i64> %y to <2 x i128>114 %sh = shl <2 x i128> %zx, <i128 64, i128 64>115 %or = or <2 x i128> %zy, %sh116 %r = icmp eq <2 x i128> %or, zeroinitializer117 %s = sext <2 x i1> %r to <2 x i64>118 ret <2 x i64> %s119}120