Files
derek.holloway 7502bf64a4
CodeQL / Analyze (actions) (push) Canceled after 0s
CodeQL / Analyze (python) (push) Canceled after 0s
pre-commit / pre-commit (push) Canceled after 0s
Multi-Arch CI / setup (push) Canceled after 0s
Publish build_manylinux_x86_64 images / publish_build_manylinux_x86_64 (push) Canceled after 0s
Setup (Multi-Arch) / setup (push) Canceled after 0s
Multi-Arch CI / Linux::${{ fromJSON(needs.setup.outputs.linux_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubi10 image / publish_no_rocm_image_ubi10 (push) Canceled after 0s
Multi-Arch CI / Windows::${{ fromJSON(needs.setup.outputs.windows_build_config || '{}').build_variant_label || 'skip' }} (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Multi-Arch CI / Manifest Diff (push) Canceled after 0s
TheRock Manifest Diff Report / Generate Manifest Diff Report (push) Canceled after 0s
Multi-Arch CI / CI Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_ocl_rt images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04_rocgdb images / publish_no_rocm_image_ubuntu24_04_rocgdb (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_ocl_rt (push) Canceled after 0s
Publish TheRock Docker image / build-and-push-image (push) Canceled after 0s
Unit Tests / Unit Tests :: ubuntu-24.04 (push) Canceled after 0s
Unit Tests / Unit Tests :: windows-2022 (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_media (push) Canceled after 0s
Unit Tests / Unit Tests Summary (push) Canceled after 0s
Publish no_rocm_image_ubuntu24_04 images / publish_no_rocm_image_ubuntu24_04_openmpi (push) Canceled after 0s
Flatten subprojects into a single base monorepo
2026-09-02 16:34:47 -07:00

1024 lines
35 KiB
LLVM

; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=CHECK,CHECK-NOBMI,CHECK-NOBMI-SSE2
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi2 | FileCheck %s --check-prefixes=CHECK,CHECK-BMI2,CHECK-BMI2-SSE2
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi2,+avx | FileCheck %s --check-prefixes=CHECK,CHECK-BMI2,CHECK-AVX,CHECK-AVX12,CHECK-AVX1
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi2,+avx2 | FileCheck %s --check-prefixes=CHECK,CHECK-BMI2,CHECK-AVX,CHECK-AVX12,CHECK-AVX2
; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi2,+avx512f,+avx512vl | FileCheck %s --check-prefixes=CHECK,CHECK-BMI2,CHECK-AVX,CHECK-AVX512
declare <4 x i32> @llvm.fshl.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)
declare <4 x i32> @llvm.fshr.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)
declare <16 x i16> @llvm.fshl.v16i16(<16 x i16>, <16 x i16>, <16 x i16>)
declare <16 x i16> @llvm.fshr.v16i16(<16 x i16>, <16 x i16>, <16 x i16>)
declare i64 @llvm.fshl.i64(i64, i64, i64)
declare i64 @llvm.fshr.i64(i64, i64, i64)
declare i32 @llvm.fshl.i32(i32, i32, i32)
declare i32 @llvm.fshr.i32(i32, i32, i32)
declare i16 @llvm.fshl.i16(i16, i16, i16)
declare i16 @llvm.fshr.i16(i16, i16, i16)
declare i8 @llvm.fshl.i8(i8, i8, i8)
declare i8 @llvm.fshr.i8(i8, i8, i8)
define i1 @shr_to_shl_eq_i8_s2(i8 %x) {
; CHECK-LABEL: shr_to_shl_eq_i8_s2:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: rolb $2, %al
; CHECK-NEXT: cmpb %al, %dil
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i8 %x, 63
%shr = lshr i8 %x, 2
%r = icmp eq i8 %and, %shr
ret i1 %r
}
define i1 @shl_to_shr_ne_i8_s7(i8 %x) {
; CHECK-LABEL: shl_to_shr_ne_i8_s7:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: shrb $7, %al
; CHECK-NEXT: andb $1, %dil
; CHECK-NEXT: cmpb %al, %dil
; CHECK-NEXT: setne %al
; CHECK-NEXT: retq
%shl = shl i8 %x, 7
%and = and i8 %x, 128
%r = icmp ne i8 %shl, %and
ret i1 %r
}
define i1 @rorl_to_srl_ne_i8_s5_fail(i8 %x) {
; CHECK-LABEL: rorl_to_srl_ne_i8_s5_fail:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: rolb $5, %al
; CHECK-NEXT: cmpb %dil, %al
; CHECK-NEXT: setne %al
; CHECK-NEXT: retq
%ror = call i8 @llvm.fshl.i8(i8 %x, i8 %x, i8 5)
%r = icmp ne i8 %ror, %x
ret i1 %r
}
define i1 @shr_to_shl_eq_i8_s1(i8 %x) {
; CHECK-LABEL: shr_to_shl_eq_i8_s1:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: rolb %al
; CHECK-NEXT: cmpb %al, %dil
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i8 %x, 127
%shr = lshr i8 %x, 1
%r = icmp eq i8 %and, %shr
ret i1 %r
}
define i1 @shr_to_shl_eq_i32_s3(i32 %x) {
; CHECK-LABEL: shr_to_shl_eq_i32_s3:
; CHECK: # %bb.0:
; CHECK-NEXT: # kill: def $edi killed $edi def $rdi
; CHECK-NEXT: leal (,%rdi,8), %eax
; CHECK-NEXT: andl $-8, %edi
; CHECK-NEXT: cmpl %eax, %edi
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, 536870911
%shr = lshr i32 %x, 3
%r = icmp eq i32 %and, %shr
ret i1 %r
}
define i1 @shl_to_shr_eq_i32_s3_fail(i32 %x) {
; CHECK-LABEL: shl_to_shr_eq_i32_s3_fail:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $536870911, %eax # imm = 0x1FFFFFFF
; CHECK-NEXT: shll $3, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, 536870911
%shr = shl i32 %x, 3
%r = icmp eq i32 %and, %shr
ret i1 %r
}
define i1 @shl_to_shr_ne_i32_s16(i32 %x) {
; CHECK-NOBMI-LABEL: shl_to_shr_ne_i32_s16:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: movzwl %di, %eax
; CHECK-NOBMI-NEXT: shrl $16, %edi
; CHECK-NOBMI-NEXT: cmpl %edi, %eax
; CHECK-NOBMI-NEXT: setne %al
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-LABEL: shl_to_shr_ne_i32_s16:
; CHECK-BMI2: # %bb.0:
; CHECK-BMI2-NEXT: rorxl $16, %edi, %eax
; CHECK-BMI2-NEXT: cmpl %eax, %edi
; CHECK-BMI2-NEXT: setne %al
; CHECK-BMI2-NEXT: retq
%shl = shl i32 %x, 16
%and = and i32 %x, 4294901760
%r = icmp ne i32 %shl, %and
ret i1 %r
}
define i1 @shl_to_shr_ne_i32_s16_fail(i32 %x) {
; CHECK-LABEL: shl_to_shr_ne_i32_s16_fail:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: shll $16, %eax
; CHECK-NEXT: andl $2147450880, %edi # imm = 0x7FFF8000
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: setne %al
; CHECK-NEXT: retq
%shl = shl i32 %x, 16
%and = and i32 %x, 2147450880
%r = icmp ne i32 %shl, %and
ret i1 %r
}
define i1 @shr_to_shl_eq_i16_s1(i16 %x) {
; CHECK-LABEL: shr_to_shl_eq_i16_s1:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: rolw %ax
; CHECK-NEXT: cmpw %ax, %di
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i16 %x, 32767
%shr = lshr i16 %x, 1
%r = icmp eq i16 %and, %shr
ret i1 %r
}
define i1 @shr_to_shl_eq_i16_s1_fail(i16 %x) {
; CHECK-LABEL: shr_to_shl_eq_i16_s1_fail:
; CHECK: # %bb.0:
; CHECK-NEXT: movzwl %di, %eax
; CHECK-NEXT: andl $32766, %edi # imm = 0x7FFE
; CHECK-NEXT: shrl %eax
; CHECK-NEXT: cmpw %ax, %di
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i16 %x, 32766
%shr = lshr i16 %x, 1
%r = icmp eq i16 %and, %shr
ret i1 %r
}
define i1 @shl_to_shr_eq_i64_s44(i64 %x) {
; CHECK-LABEL: shl_to_shr_eq_i64_s44:
; CHECK: # %bb.0:
; CHECK-NEXT: movq %rdi, %rax
; CHECK-NEXT: shrq $44, %rax
; CHECK-NEXT: andl $1048575, %edi # imm = 0xFFFFF
; CHECK-NEXT: cmpl %eax, %edi
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%shl = shl i64 %x, 44
%and = and i64 %x, 18446726481523507200
%r = icmp eq i64 %shl, %and
ret i1 %r
}
define i1 @shr_to_shl_ne_i64_s32(i64 %x) {
; CHECK-NOBMI-LABEL: shr_to_shl_ne_i64_s32:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: movq %rdi, %rax
; CHECK-NOBMI-NEXT: shrq $32, %rax
; CHECK-NOBMI-NEXT: cmpl %eax, %edi
; CHECK-NOBMI-NEXT: setne %al
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-LABEL: shr_to_shl_ne_i64_s32:
; CHECK-BMI2: # %bb.0:
; CHECK-BMI2-NEXT: rorxq $32, %rdi, %rax
; CHECK-BMI2-NEXT: cmpq %rax, %rdi
; CHECK-BMI2-NEXT: setne %al
; CHECK-BMI2-NEXT: retq
%and = and i64 %x, 4294967295
%shr = lshr i64 %x, 32
%r = icmp ne i64 %and, %shr
ret i1 %r
}
define i1 @rorl_to_shl_eq_i64_s16(i64 %x) {
; CHECK-NOBMI-LABEL: rorl_to_shl_eq_i64_s16:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: movq %rdi, %rax
; CHECK-NOBMI-NEXT: rolq $16, %rax
; CHECK-NOBMI-NEXT: cmpq %rdi, %rax
; CHECK-NOBMI-NEXT: sete %al
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-LABEL: rorl_to_shl_eq_i64_s16:
; CHECK-BMI2: # %bb.0:
; CHECK-BMI2-NEXT: rorxq $48, %rdi, %rax
; CHECK-BMI2-NEXT: cmpq %rdi, %rax
; CHECK-BMI2-NEXT: sete %al
; CHECK-BMI2-NEXT: retq
%ror = call i64 @llvm.fshl.i64(i64 %x, i64 %x, i64 16)
%r = icmp eq i64 %ror, %x
ret i1 %r
}
define i1 @ashr_to_shl_ne_i64_s32_fail(i64 %x) {
; CHECK-LABEL: ashr_to_shl_ne_i64_s32_fail:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: sarq $32, %rdi
; CHECK-NEXT: cmpq %rdi, %rax
; CHECK-NEXT: setne %al
; CHECK-NEXT: retq
%and = and i64 %x, 4294967295
%shr = ashr i64 %x, 32
%r = icmp ne i64 %and, %shr
ret i1 %r
}
define i1 @shl_to_shr_eq_i64_s63(i64 %x) {
; CHECK-LABEL: shl_to_shr_eq_i64_s63:
; CHECK: # %bb.0:
; CHECK-NEXT: movq %rdi, %rax
; CHECK-NEXT: shrq $63, %rax
; CHECK-NEXT: andl $1, %edi
; CHECK-NEXT: cmpl %eax, %edi
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%shl = shl i64 %x, 63
%and = and i64 %x, 9223372036854775808
%r = icmp eq i64 %shl, %and
ret i1 %r
}
define i1 @shl_to_shr_eq_i64_s63_fail(i64 %x) {
; CHECK-LABEL: shl_to_shr_eq_i64_s63_fail:
; CHECK: # %bb.0:
; CHECK-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000
; CHECK-NEXT: andq %rdi, %rax
; CHECK-NEXT: shlq $63, %rdi
; CHECK-NEXT: cmpq %rax, %rdi
; CHECK-NEXT: seta %al
; CHECK-NEXT: retq
%shl = shl i64 %x, 63
%and = and i64 %x, 9223372036854775808
%r = icmp ugt i64 %shl, %and
ret i1 %r
}
define i1 @shr_to_shl_eq_i64_s7(i64 %x) {
; CHECK-LABEL: shr_to_shl_eq_i64_s7:
; CHECK: # %bb.0:
; CHECK-NEXT: movq %rdi, %rax
; CHECK-NEXT: shlq $7, %rax
; CHECK-NEXT: andq $-128, %rdi
; CHECK-NEXT: cmpq %rax, %rdi
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i64 %x, 144115188075855871
%shr = lshr i64 %x, 7
%r = icmp eq i64 %and, %shr
ret i1 %r
}
define i1 @shl_to_shr_ne_i32_s24(i32 %x) {
; CHECK-LABEL: shl_to_shr_ne_i32_s24:
; CHECK: # %bb.0:
; CHECK-NEXT: movzbl %dil, %eax
; CHECK-NEXT: shrl $24, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: setne %al
; CHECK-NEXT: retq
%shl = shl i32 %x, 24
%and = and i32 %x, 4278190080
%r = icmp ne i32 %shl, %and
ret i1 %r
}
define i1 @shr_to_shl_ne_i32_s24_fail(i32 %x) {
; CHECK-LABEL: shr_to_shl_ne_i32_s24_fail:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: shrl $24, %eax
; CHECK-NEXT: andl $-16777216, %edi # imm = 0xFF000000
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: setne %al
; CHECK-NEXT: retq
%shl = lshr i32 %x, 24
%and = and i32 %x, 4278190080
%r = icmp ne i32 %shl, %and
ret i1 %r
}
define i1 @shr_to_shl_ne_i32_s8(i32 %x) {
; CHECK-NOBMI-LABEL: shr_to_shl_ne_i32_s8:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: movl %edi, %eax
; CHECK-NOBMI-NEXT: roll $8, %eax
; CHECK-NOBMI-NEXT: cmpl %eax, %edi
; CHECK-NOBMI-NEXT: setne %al
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-LABEL: shr_to_shl_ne_i32_s8:
; CHECK-BMI2: # %bb.0:
; CHECK-BMI2-NEXT: rorxl $24, %edi, %eax
; CHECK-BMI2-NEXT: cmpl %eax, %edi
; CHECK-BMI2-NEXT: setne %al
; CHECK-BMI2-NEXT: retq
%and = and i32 %x, 16777215
%shr = lshr i32 %x, 8
%r = icmp ne i32 %and, %shr
ret i1 %r
}
define <4 x i1> @shr_to_ror_eq_4xi32_s4(<4 x i32> %x) {
; CHECK-NOBMI-LABEL: shr_to_ror_eq_4xi32_s4:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: movdqa %xmm0, %xmm1
; CHECK-NOBMI-NEXT: psrld $4, %xmm1
; CHECK-NOBMI-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; CHECK-NOBMI-NEXT: pcmpeqd %xmm1, %xmm0
; CHECK-NOBMI-NEXT: pcmpeqd %xmm1, %xmm1
; CHECK-NOBMI-NEXT: pxor %xmm1, %xmm0
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-SSE2-LABEL: shr_to_ror_eq_4xi32_s4:
; CHECK-BMI2-SSE2: # %bb.0:
; CHECK-BMI2-SSE2-NEXT: movdqa %xmm0, %xmm1
; CHECK-BMI2-SSE2-NEXT: psrld $4, %xmm1
; CHECK-BMI2-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; CHECK-BMI2-SSE2-NEXT: pcmpeqd %xmm1, %xmm0
; CHECK-BMI2-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
; CHECK-BMI2-SSE2-NEXT: pxor %xmm1, %xmm0
; CHECK-BMI2-SSE2-NEXT: retq
;
; CHECK-AVX1-LABEL: shr_to_ror_eq_4xi32_s4:
; CHECK-AVX1: # %bb.0:
; CHECK-AVX1-NEXT: vpsrld $4, %xmm0, %xmm1
; CHECK-AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
; CHECK-AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; CHECK-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
; CHECK-AVX1-NEXT: retq
;
; CHECK-AVX2-LABEL: shr_to_ror_eq_4xi32_s4:
; CHECK-AVX2: # %bb.0:
; CHECK-AVX2-NEXT: vpsrld $4, %xmm0, %xmm1
; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [268435455,268435455,268435455,268435455]
; CHECK-AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
; CHECK-AVX2-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; CHECK-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; CHECK-AVX2-NEXT: retq
;
; CHECK-AVX512-LABEL: shr_to_ror_eq_4xi32_s4:
; CHECK-AVX512: # %bb.0:
; CHECK-AVX512-NEXT: vprold $4, %xmm0, %xmm1
; CHECK-AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
; CHECK-AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%shr = lshr <4 x i32> %x, <i32 4, i32 4, i32 4, i32 4>
%and = and <4 x i32> %x, <i32 268435455, i32 268435455, i32 268435455, i32 268435455>
%r = icmp ne <4 x i32> %shr, %and
ret <4 x i1> %r
}
define <4 x i1> @shl_to_ror_eq_4xi32_s8(<4 x i32> %x) {
; CHECK-NOBMI-LABEL: shl_to_ror_eq_4xi32_s8:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: movdqa %xmm0, %xmm1
; CHECK-NOBMI-NEXT: pslld $8, %xmm1
; CHECK-NOBMI-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; CHECK-NOBMI-NEXT: pcmpeqd %xmm1, %xmm0
; CHECK-NOBMI-NEXT: pcmpeqd %xmm1, %xmm1
; CHECK-NOBMI-NEXT: pxor %xmm1, %xmm0
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-SSE2-LABEL: shl_to_ror_eq_4xi32_s8:
; CHECK-BMI2-SSE2: # %bb.0:
; CHECK-BMI2-SSE2-NEXT: movdqa %xmm0, %xmm1
; CHECK-BMI2-SSE2-NEXT: pslld $8, %xmm1
; CHECK-BMI2-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; CHECK-BMI2-SSE2-NEXT: pcmpeqd %xmm1, %xmm0
; CHECK-BMI2-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
; CHECK-BMI2-SSE2-NEXT: pxor %xmm1, %xmm0
; CHECK-BMI2-SSE2-NEXT: retq
;
; CHECK-AVX12-LABEL: shl_to_ror_eq_4xi32_s8:
; CHECK-AVX12: # %bb.0:
; CHECK-AVX12-NEXT: vpslld $8, %xmm0, %xmm1
; CHECK-AVX12-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
; CHECK-AVX12-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
; CHECK-AVX12-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; CHECK-AVX12-NEXT: vpxor %xmm1, %xmm0, %xmm0
; CHECK-AVX12-NEXT: retq
;
; CHECK-AVX512-LABEL: shl_to_ror_eq_4xi32_s8:
; CHECK-AVX512: # %bb.0:
; CHECK-AVX512-NEXT: vprold $8, %xmm0, %xmm1
; CHECK-AVX512-NEXT: vpcmpeqd %xmm1, %xmm0, %xmm0
; CHECK-AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%shr = shl <4 x i32> %x, <i32 8, i32 8, i32 8, i32 8>
%and = and <4 x i32> %x, <i32 4294967040, i32 4294967040, i32 4294967040, i32 4294967040>
%r = icmp ne <4 x i32> %shr, %and
ret <4 x i1> %r
}
define <4 x i1> @shl_to_ror_eq_4xi32_s7_fail_no_p2(<4 x i32> %x) {
; CHECK-NOBMI-LABEL: shl_to_ror_eq_4xi32_s7_fail_no_p2:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: movdqa %xmm0, %xmm1
; CHECK-NOBMI-NEXT: pslld $7, %xmm1
; CHECK-NOBMI-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; CHECK-NOBMI-NEXT: pcmpeqd %xmm1, %xmm0
; CHECK-NOBMI-NEXT: pcmpeqd %xmm1, %xmm1
; CHECK-NOBMI-NEXT: pxor %xmm1, %xmm0
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-SSE2-LABEL: shl_to_ror_eq_4xi32_s7_fail_no_p2:
; CHECK-BMI2-SSE2: # %bb.0:
; CHECK-BMI2-SSE2-NEXT: movdqa %xmm0, %xmm1
; CHECK-BMI2-SSE2-NEXT: pslld $7, %xmm1
; CHECK-BMI2-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; CHECK-BMI2-SSE2-NEXT: pcmpeqd %xmm1, %xmm0
; CHECK-BMI2-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
; CHECK-BMI2-SSE2-NEXT: pxor %xmm1, %xmm0
; CHECK-BMI2-SSE2-NEXT: retq
;
; CHECK-AVX1-LABEL: shl_to_ror_eq_4xi32_s7_fail_no_p2:
; CHECK-AVX1: # %bb.0:
; CHECK-AVX1-NEXT: vpslld $7, %xmm0, %xmm1
; CHECK-AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
; CHECK-AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; CHECK-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
; CHECK-AVX1-NEXT: retq
;
; CHECK-AVX2-LABEL: shl_to_ror_eq_4xi32_s7_fail_no_p2:
; CHECK-AVX2: # %bb.0:
; CHECK-AVX2-NEXT: vpslld $7, %xmm0, %xmm1
; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [4294967168,4294967168,4294967168,4294967168]
; CHECK-AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
; CHECK-AVX2-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; CHECK-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; CHECK-AVX2-NEXT: retq
;
; CHECK-AVX512-LABEL: shl_to_ror_eq_4xi32_s7_fail_no_p2:
; CHECK-AVX512: # %bb.0:
; CHECK-AVX512-NEXT: vpslld $7, %xmm0, %xmm1
; CHECK-AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
; CHECK-AVX512-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
; CHECK-AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%shr = shl <4 x i32> %x, <i32 7, i32 7, i32 7, i32 7>
%and = and <4 x i32> %x, <i32 4294967168, i32 4294967168, i32 4294967168, i32 4294967168>
%r = icmp ne <4 x i32> %shr, %and
ret <4 x i1> %r
}
define <4 x i1> @shr_to_ror_eq_4xi32_s4_fail_no_splat(<4 x i32> %x) {
; CHECK-NOBMI-LABEL: shr_to_ror_eq_4xi32_s4_fail_no_splat:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: movdqa %xmm0, %xmm1
; CHECK-NOBMI-NEXT: psrld $4, %xmm1
; CHECK-NOBMI-NEXT: movdqa %xmm0, %xmm2
; CHECK-NOBMI-NEXT: psrld $8, %xmm2
; CHECK-NOBMI-NEXT: shufps {{.*#+}} xmm2 = xmm2[3,0],xmm1[2,0]
; CHECK-NOBMI-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,0]
; CHECK-NOBMI-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; CHECK-NOBMI-NEXT: pcmpeqd %xmm1, %xmm0
; CHECK-NOBMI-NEXT: pcmpeqd %xmm1, %xmm1
; CHECK-NOBMI-NEXT: pxor %xmm1, %xmm0
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-SSE2-LABEL: shr_to_ror_eq_4xi32_s4_fail_no_splat:
; CHECK-BMI2-SSE2: # %bb.0:
; CHECK-BMI2-SSE2-NEXT: movdqa %xmm0, %xmm1
; CHECK-BMI2-SSE2-NEXT: psrld $4, %xmm1
; CHECK-BMI2-SSE2-NEXT: movdqa %xmm0, %xmm2
; CHECK-BMI2-SSE2-NEXT: psrld $8, %xmm2
; CHECK-BMI2-SSE2-NEXT: shufps {{.*#+}} xmm2 = xmm2[3,0],xmm1[2,0]
; CHECK-BMI2-SSE2-NEXT: shufps {{.*#+}} xmm1 = xmm1[0,1],xmm2[2,0]
; CHECK-BMI2-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; CHECK-BMI2-SSE2-NEXT: pcmpeqd %xmm1, %xmm0
; CHECK-BMI2-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
; CHECK-BMI2-SSE2-NEXT: pxor %xmm1, %xmm0
; CHECK-BMI2-SSE2-NEXT: retq
;
; CHECK-AVX1-LABEL: shr_to_ror_eq_4xi32_s4_fail_no_splat:
; CHECK-AVX1: # %bb.0:
; CHECK-AVX1-NEXT: vpsrld $8, %xmm0, %xmm1
; CHECK-AVX1-NEXT: vpsrld $4, %xmm0, %xmm2
; CHECK-AVX1-NEXT: vpblendw {{.*#+}} xmm1 = xmm2[0,1,2,3,4,5],xmm1[6,7]
; CHECK-AVX1-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
; CHECK-AVX1-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; CHECK-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
; CHECK-AVX1-NEXT: retq
;
; CHECK-AVX2-LABEL: shr_to_ror_eq_4xi32_s4_fail_no_splat:
; CHECK-AVX2: # %bb.0:
; CHECK-AVX2-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
; CHECK-AVX2-NEXT: vpbroadcastd {{.*#+}} xmm2 = [268435455,268435455,268435455,268435455]
; CHECK-AVX2-NEXT: vpand %xmm2, %xmm0, %xmm0
; CHECK-AVX2-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
; CHECK-AVX2-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; CHECK-AVX2-NEXT: vpxor %xmm1, %xmm0, %xmm0
; CHECK-AVX2-NEXT: retq
;
; CHECK-AVX512-LABEL: shr_to_ror_eq_4xi32_s4_fail_no_splat:
; CHECK-AVX512: # %bb.0:
; CHECK-AVX512-NEXT: vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm1
; CHECK-AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
; CHECK-AVX512-NEXT: vpcmpeqd %xmm0, %xmm1, %xmm0
; CHECK-AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%shr = lshr <4 x i32> %x, <i32 4, i32 4, i32 4, i32 8>
%and = and <4 x i32> %x, <i32 268435455, i32 268435455, i32 268435455, i32 268435455>
%r = icmp ne <4 x i32> %shr, %and
ret <4 x i1> %r
}
define <16 x i1> @shl_to_ror_eq_16xi16_s8_fail_preserve_i16(<16 x i16> %x) {
; CHECK-NOBMI-LABEL: shl_to_ror_eq_16xi16_s8_fail_preserve_i16:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: movdqa %xmm0, %xmm2
; CHECK-NOBMI-NEXT: psllw $8, %xmm2
; CHECK-NOBMI-NEXT: movdqa %xmm1, %xmm3
; CHECK-NOBMI-NEXT: psllw $8, %xmm3
; CHECK-NOBMI-NEXT: movdqa {{.*#+}} xmm4 = [0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255]
; CHECK-NOBMI-NEXT: pand %xmm4, %xmm0
; CHECK-NOBMI-NEXT: pcmpeqw %xmm2, %xmm0
; CHECK-NOBMI-NEXT: pand %xmm4, %xmm1
; CHECK-NOBMI-NEXT: pcmpeqw %xmm3, %xmm1
; CHECK-NOBMI-NEXT: packsswb %xmm1, %xmm0
; CHECK-NOBMI-NEXT: pcmpeqd %xmm1, %xmm1
; CHECK-NOBMI-NEXT: pxor %xmm1, %xmm0
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-SSE2-LABEL: shl_to_ror_eq_16xi16_s8_fail_preserve_i16:
; CHECK-BMI2-SSE2: # %bb.0:
; CHECK-BMI2-SSE2-NEXT: movdqa %xmm0, %xmm2
; CHECK-BMI2-SSE2-NEXT: psllw $8, %xmm2
; CHECK-BMI2-SSE2-NEXT: movdqa %xmm1, %xmm3
; CHECK-BMI2-SSE2-NEXT: psllw $8, %xmm3
; CHECK-BMI2-SSE2-NEXT: movdqa {{.*#+}} xmm4 = [0,255,0,255,0,255,0,255,0,255,0,255,0,255,0,255]
; CHECK-BMI2-SSE2-NEXT: pand %xmm4, %xmm0
; CHECK-BMI2-SSE2-NEXT: pcmpeqw %xmm2, %xmm0
; CHECK-BMI2-SSE2-NEXT: pand %xmm4, %xmm1
; CHECK-BMI2-SSE2-NEXT: pcmpeqw %xmm3, %xmm1
; CHECK-BMI2-SSE2-NEXT: packsswb %xmm1, %xmm0
; CHECK-BMI2-SSE2-NEXT: pcmpeqd %xmm1, %xmm1
; CHECK-BMI2-SSE2-NEXT: pxor %xmm1, %xmm0
; CHECK-BMI2-SSE2-NEXT: retq
;
; CHECK-AVX1-LABEL: shl_to_ror_eq_16xi16_s8_fail_preserve_i16:
; CHECK-AVX1: # %bb.0:
; CHECK-AVX1-NEXT: vpsllw $8, %xmm0, %xmm1
; CHECK-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm2
; CHECK-AVX1-NEXT: vpsllw $8, %xmm2, %xmm2
; CHECK-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
; CHECK-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
; CHECK-AVX1-NEXT: vpcmpeqw %xmm3, %xmm2, %xmm2
; CHECK-AVX1-NEXT: vpcmpeqw %xmm0, %xmm1, %xmm0
; CHECK-AVX1-NEXT: vpacksswb %xmm2, %xmm0, %xmm0
; CHECK-AVX1-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
; CHECK-AVX1-NEXT: vpxor %xmm1, %xmm0, %xmm0
; CHECK-AVX1-NEXT: vzeroupper
; CHECK-AVX1-NEXT: retq
;
; CHECK-AVX2-LABEL: shl_to_ror_eq_16xi16_s8_fail_preserve_i16:
; CHECK-AVX2: # %bb.0:
; CHECK-AVX2-NEXT: vpsllw $8, %ymm0, %ymm1
; CHECK-AVX2-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
; CHECK-AVX2-NEXT: vpcmpeqw %ymm0, %ymm1, %ymm0
; CHECK-AVX2-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
; CHECK-AVX2-NEXT: vpxor %ymm1, %ymm0, %ymm0
; CHECK-AVX2-NEXT: vextracti128 $1, %ymm0, %xmm1
; CHECK-AVX2-NEXT: vpacksswb %xmm1, %xmm0, %xmm0
; CHECK-AVX2-NEXT: vzeroupper
; CHECK-AVX2-NEXT: retq
;
; CHECK-AVX512-LABEL: shl_to_ror_eq_16xi16_s8_fail_preserve_i16:
; CHECK-AVX512: # %bb.0:
; CHECK-AVX512-NEXT: vpsllw $8, %ymm0, %ymm1
; CHECK-AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0
; CHECK-AVX512-NEXT: vpcmpeqw %ymm0, %ymm1, %ymm0
; CHECK-AVX512-NEXT: vpmovzxwd {{.*#+}} zmm0 = ymm0[0],zero,ymm0[1],zero,ymm0[2],zero,ymm0[3],zero,ymm0[4],zero,ymm0[5],zero,ymm0[6],zero,ymm0[7],zero,ymm0[8],zero,ymm0[9],zero,ymm0[10],zero,ymm0[11],zero,ymm0[12],zero,ymm0[13],zero,ymm0[14],zero,ymm0[15],zero
; CHECK-AVX512-NEXT: vpmovdb %zmm0, %xmm0
; CHECK-AVX512-NEXT: vpternlogq $15, %xmm0, %xmm0, %xmm0
; CHECK-AVX512-NEXT: vzeroupper
; CHECK-AVX512-NEXT: retq
%shr = shl <16 x i16> %x, <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>
%and = and <16 x i16> %x, <i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040, i16 4294967040>
%r = icmp ne <16 x i16> %shr, %and
ret <16 x i1> %r
}
define <16 x i8> @shl_s3_cmp_v16i8(<16 x i8> %x, <16 x i8> %y) {
; CHECK-NOBMI-LABEL: shl_s3_cmp_v16i8:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: pcmpeqb %xmm1, %xmm0
; CHECK-NOBMI-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-SSE2-LABEL: shl_s3_cmp_v16i8:
; CHECK-BMI2-SSE2: # %bb.0:
; CHECK-BMI2-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
; CHECK-BMI2-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; CHECK-BMI2-SSE2-NEXT: retq
;
; CHECK-AVX12-LABEL: shl_s3_cmp_v16i8:
; CHECK-AVX12: # %bb.0:
; CHECK-AVX12-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
; CHECK-AVX12-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
; CHECK-AVX12-NEXT: retq
;
; CHECK-AVX512-LABEL: shl_s3_cmp_v16i8:
; CHECK-AVX512: # %bb.0:
; CHECK-AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
; CHECK-AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%cmp = icmp eq <16 x i8> %x, %y
%ext = sext <16 x i1> %cmp to <16 x i8>
%shr = shl <16 x i8> %ext, <i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3, i8 3>
ret <16 x i8> %shr
}
define <4 x i64> @shl_s31_cmp_v4f64(<4 x double> %x, <4 x double> %y) {
; CHECK-NOBMI-LABEL: shl_s31_cmp_v4f64:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: cmpeqpd %xmm3, %xmm1
; CHECK-NOBMI-NEXT: cmpeqpd %xmm2, %xmm0
; CHECK-NOBMI-NEXT: psllq $31, %xmm0
; CHECK-NOBMI-NEXT: psllq $31, %xmm1
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-SSE2-LABEL: shl_s31_cmp_v4f64:
; CHECK-BMI2-SSE2: # %bb.0:
; CHECK-BMI2-SSE2-NEXT: cmpeqpd %xmm3, %xmm1
; CHECK-BMI2-SSE2-NEXT: cmpeqpd %xmm2, %xmm0
; CHECK-BMI2-SSE2-NEXT: psllq $31, %xmm0
; CHECK-BMI2-SSE2-NEXT: psllq $31, %xmm1
; CHECK-BMI2-SSE2-NEXT: retq
;
; CHECK-AVX1-LABEL: shl_s31_cmp_v4f64:
; CHECK-AVX1: # %bb.0:
; CHECK-AVX1-NEXT: vcmpeqpd %ymm1, %ymm0, %ymm0
; CHECK-AVX1-NEXT: vandpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
; CHECK-AVX1-NEXT: retq
;
; CHECK-AVX2-LABEL: shl_s31_cmp_v4f64:
; CHECK-AVX2: # %bb.0:
; CHECK-AVX2-NEXT: vcmpeqpd %ymm1, %ymm0, %ymm0
; CHECK-AVX2-NEXT: vpsllq $31, %ymm0, %ymm0
; CHECK-AVX2-NEXT: retq
;
; CHECK-AVX512-LABEL: shl_s31_cmp_v4f64:
; CHECK-AVX512: # %bb.0:
; CHECK-AVX512-NEXT: vcmpeqpd %ymm1, %ymm0, %ymm0
; CHECK-AVX512-NEXT: vpsllq $31, %ymm0, %ymm0
; CHECK-AVX512-NEXT: retq
%cmp = fcmp oeq <4 x double> %x, %y
%ext = sext <4 x i1> %cmp to <4 x i64>
%shr = shl <4 x i64> %ext, <i64 31, i64 31, i64 31, i64 31>
ret <4 x i64> %shr
}
define <16 x i8> @shr_s1_cmp_v16i8(<16 x i8> %x, <16 x i8> %y) {
; CHECK-NOBMI-LABEL: shr_s1_cmp_v16i8:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: pcmpeqb %xmm1, %xmm0
; CHECK-NOBMI-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-SSE2-LABEL: shr_s1_cmp_v16i8:
; CHECK-BMI2-SSE2: # %bb.0:
; CHECK-BMI2-SSE2-NEXT: pcmpeqb %xmm1, %xmm0
; CHECK-BMI2-SSE2-NEXT: pand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0
; CHECK-BMI2-SSE2-NEXT: retq
;
; CHECK-AVX12-LABEL: shr_s1_cmp_v16i8:
; CHECK-AVX12: # %bb.0:
; CHECK-AVX12-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
; CHECK-AVX12-NEXT: vpand {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0
; CHECK-AVX12-NEXT: retq
;
; CHECK-AVX512-LABEL: shr_s1_cmp_v16i8:
; CHECK-AVX512: # %bb.0:
; CHECK-AVX512-NEXT: vpcmpeqb %xmm1, %xmm0, %xmm0
; CHECK-AVX512-NEXT: vpandd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0
; CHECK-AVX512-NEXT: retq
%cmp = icmp eq <16 x i8> %x, %y
%ext = sext <16 x i1> %cmp to <16 x i8>
%shr = lshr <16 x i8> %ext, <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>
ret <16 x i8> %shr
}
define <8 x i32> @shr_s9_cmp_v8i32(<8 x i32> %x, <8 x i32> %y) {
; CHECK-NOBMI-LABEL: shr_s9_cmp_v8i32:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: pcmpgtd %xmm3, %xmm1
; CHECK-NOBMI-NEXT: pcmpgtd %xmm2, %xmm0
; CHECK-NOBMI-NEXT: psrld $9, %xmm0
; CHECK-NOBMI-NEXT: psrld $9, %xmm1
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-SSE2-LABEL: shr_s9_cmp_v8i32:
; CHECK-BMI2-SSE2: # %bb.0:
; CHECK-BMI2-SSE2-NEXT: pcmpgtd %xmm3, %xmm1
; CHECK-BMI2-SSE2-NEXT: pcmpgtd %xmm2, %xmm0
; CHECK-BMI2-SSE2-NEXT: psrld $9, %xmm0
; CHECK-BMI2-SSE2-NEXT: psrld $9, %xmm1
; CHECK-BMI2-SSE2-NEXT: retq
;
; CHECK-AVX1-LABEL: shr_s9_cmp_v8i32:
; CHECK-AVX1: # %bb.0:
; CHECK-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
; CHECK-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
; CHECK-AVX1-NEXT: vpcmpgtd %xmm2, %xmm3, %xmm2
; CHECK-AVX1-NEXT: vpcmpgtd %xmm1, %xmm0, %xmm0
; CHECK-AVX1-NEXT: vinsertf128 $1, %xmm2, %ymm0, %ymm0
; CHECK-AVX1-NEXT: vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %ymm0, %ymm0
; CHECK-AVX1-NEXT: retq
;
; CHECK-AVX2-LABEL: shr_s9_cmp_v8i32:
; CHECK-AVX2: # %bb.0:
; CHECK-AVX2-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0
; CHECK-AVX2-NEXT: vpsrld $9, %ymm0, %ymm0
; CHECK-AVX2-NEXT: retq
;
; CHECK-AVX512-LABEL: shr_s9_cmp_v8i32:
; CHECK-AVX512: # %bb.0:
; CHECK-AVX512-NEXT: vpcmpgtd %ymm1, %ymm0, %ymm0
; CHECK-AVX512-NEXT: vpsrld $9, %ymm0, %ymm0
; CHECK-AVX512-NEXT: retq
%cmp = icmp sgt <8 x i32> %x, %y
%ext = sext <8 x i1> %cmp to <8 x i32>
%shr = lshr <8 x i32> %ext, <i32 9, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9, i32 9>
ret <8 x i32> %shr
}
define i1 @shr_to_shl_eq_i32_s5_fail_doesnt_add_up(i32 %x) {
; CHECK-LABEL: shr_to_shl_eq_i32_s5_fail_doesnt_add_up:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $7, %eax
; CHECK-NEXT: shrl $5, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, 7
%sh = lshr i32 %x, 5
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shr_to_shl_eq_i8_s5_fail_doesnt_add_up2(i32 %x) {
; CHECK-LABEL: shr_to_shl_eq_i8_s5_fail_doesnt_add_up2:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $268435455, %eax # imm = 0xFFFFFFF
; CHECK-NEXT: shrl $5, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, 268435455
%sh = lshr i32 %x, 5
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shr_to_shl_eq_i8_s5_fail_doesnt_add_up3(i32 %x) {
; CHECK-LABEL: shr_to_shl_eq_i8_s5_fail_doesnt_add_up3:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $67108863, %eax # imm = 0x3FFFFFF
; CHECK-NEXT: shrl $5, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, 67108863
%sh = lshr i32 %x, 5
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shr_to_shl_eq_i8_s5_fail_doesnt_not_mask(i32 %x) {
; CHECK-LABEL: shr_to_shl_eq_i8_s5_fail_doesnt_not_mask:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $11, %eax
; CHECK-NEXT: shrl $5, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, 11
%sh = lshr i32 %x, 5
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shl_to_shr_eq_i32_s9_fail_wrong_mask(i32 %x) {
; CHECK-LABEL: shl_to_shr_eq_i32_s9_fail_wrong_mask:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $511, %eax # imm = 0x1FF
; CHECK-NEXT: shll $9, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, 511
%sh = shl i32 %x, 9
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shr_to_shl_eq_i32_s5_fail_wrong_mask(i32 %x) {
; CHECK-LABEL: shr_to_shl_eq_i32_s5_fail_wrong_mask:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $-32, %eax
; CHECK-NEXT: shrl $5, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, -32
%sh = lshr i32 %x, 5
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shl_to_shr_eq_i32_s9_fail_doesnt_add_up(i32 %x) {
; CHECK-LABEL: shl_to_shr_eq_i32_s9_fail_doesnt_add_up:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $65024, %eax # imm = 0xFE00
; CHECK-NEXT: shll $9, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, 65024
%sh = shl i32 %x, 9
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shl_to_shr_eq_i32_s9_fail_doesnt_add_up2(i32 %x) {
; CHECK-LABEL: shl_to_shr_eq_i32_s9_fail_doesnt_add_up2:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $-1024, %eax # imm = 0xFC00
; CHECK-NEXT: shll $9, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, -1024
%sh = shl i32 %x, 9
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shl_to_shr_eq_i32_s9_fail_doesnt_add_up3(i32 %x) {
; CHECK-LABEL: shl_to_shr_eq_i32_s9_fail_doesnt_add_up3:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $-256, %eax
; CHECK-NEXT: shll $9, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, -256
%sh = shl i32 %x, 9
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shl_to_shr_eq_i32_s9_fail_not_mask(i32 %x) {
; CHECK-LABEL: shl_to_shr_eq_i32_s9_fail_not_mask:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $-511, %eax # imm = 0xFE01
; CHECK-NEXT: shll $9, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, -511
%sh = shl i32 %x, 9
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shl_to_shr_eq_i32_s9_fail_not_mask2(i32 %x) {
; CHECK-LABEL: shl_to_shr_eq_i32_s9_fail_not_mask2:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $-255, %eax
; CHECK-NEXT: shll $9, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, -255
%sh = shl i32 %x, 9
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shl_to_shr_eq_i32_s9_fail_wrong_mask2(i32 %x) {
; CHECK-LABEL: shl_to_shr_eq_i32_s9_fail_wrong_mask2:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: andl $8388607, %eax # imm = 0x7FFFFF
; CHECK-NEXT: shll $9, %edi
; CHECK-NEXT: cmpl %edi, %eax
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, 8388607
%sh = shl i32 %x, 9
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shl_to_shr_eq_i32_s9(i32 %x) {
; CHECK-LABEL: shl_to_shr_eq_i32_s9:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: shrl $9, %eax
; CHECK-NEXT: andl $8388607, %edi # imm = 0x7FFFFF
; CHECK-NEXT: cmpl %eax, %edi
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, -512
%sh = shl i32 %x, 9
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shr_to_shl_eq_i32_s5(i32 %x) {
; CHECK-LABEL: shr_to_shl_eq_i32_s5:
; CHECK: # %bb.0:
; CHECK-NEXT: movl %edi, %eax
; CHECK-NEXT: shll $5, %eax
; CHECK-NEXT: andl $-32, %edi
; CHECK-NEXT: cmpl %eax, %edi
; CHECK-NEXT: sete %al
; CHECK-NEXT: retq
%and = and i32 %x, 134217727
%sh = lshr i32 %x, 5
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i1 @shr_to_rotate_eq_i32_s5(i32 %x) {
; CHECK-NOBMI-LABEL: shr_to_rotate_eq_i32_s5:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: movl %edi, %eax
; CHECK-NOBMI-NEXT: roll $4, %eax
; CHECK-NOBMI-NEXT: cmpl %eax, %edi
; CHECK-NOBMI-NEXT: sete %al
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-LABEL: shr_to_rotate_eq_i32_s5:
; CHECK-BMI2: # %bb.0:
; CHECK-BMI2-NEXT: rorxl $28, %edi, %eax
; CHECK-BMI2-NEXT: cmpl %eax, %edi
; CHECK-BMI2-NEXT: sete %al
; CHECK-BMI2-NEXT: retq
%and = and i32 %x, 268435455
%sh = lshr i32 %x, 4
%r = icmp eq i32 %and, %sh
ret i1 %r
}
define i32 @issue108722(i32 %0) {
; CHECK-NOBMI-LABEL: issue108722:
; CHECK-NOBMI: # %bb.0:
; CHECK-NOBMI-NEXT: movl %edi, %ecx
; CHECK-NOBMI-NEXT: roll $24, %ecx
; CHECK-NOBMI-NEXT: xorl %eax, %eax
; CHECK-NOBMI-NEXT: cmpl %edi, %ecx
; CHECK-NOBMI-NEXT: sete %al
; CHECK-NOBMI-NEXT: retq
;
; CHECK-BMI2-LABEL: issue108722:
; CHECK-BMI2: # %bb.0:
; CHECK-BMI2-NEXT: rorxl $8, %edi, %ecx
; CHECK-BMI2-NEXT: xorl %eax, %eax
; CHECK-BMI2-NEXT: cmpl %edi, %ecx
; CHECK-BMI2-NEXT: sete %al
; CHECK-BMI2-NEXT: retq
%2 = tail call i32 @llvm.fshl.i32(i32 %0, i32 %0, i32 24)
%3 = icmp eq i32 %2, %0
%4 = zext i1 %3 to i32
ret i32 %4
}
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
; CHECK-AVX: {{.*}}
; CHECK-NOBMI-SSE2: {{.*}}