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
985 lines
37 KiB
LLVM
985 lines
37 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
|
|
; RUN: llc < %s -mtriple=i686-- -mcpu=x86-64 | FileCheck %s --check-prefixes=X86,SSE,X86-SSE,SSE2,X86-SSE2
|
|
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64 | FileCheck %s --check-prefixes=X64,SSE,X64-SSE,SSE2,X64-SSE2
|
|
; RUN: llc < %s -mtriple=i686-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=X86,SSE,X86-SSE,SSE4,X86-SSE4
|
|
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v2 | FileCheck %s --check-prefixes=X64,SSE,X64-SSE,SSE4,X64-SSE4
|
|
; RUN: llc < %s -mtriple=i686-- -mcpu=sandybridge | FileCheck %s --check-prefixes=X86,AVX,X86-AVX,AVX1,X86-AVX1
|
|
; RUN: llc < %s -mtriple=x86_64-- -mcpu=sandybridge | FileCheck %s --check-prefixes=X64,AVX,X64-AVX,AVX1,X64-AVX1
|
|
; RUN: llc < %s -mtriple=i686-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=X86,AVX,X86-AVX,AVX2,X86-AVX2
|
|
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v3 | FileCheck %s --check-prefixes=X64,AVX,X64-AVX,AVX2,X64-AVX2
|
|
; RUN: llc < %s -mtriple=x86_64-- -mcpu=knl | FileCheck %s --check-prefixes=AVX512F
|
|
; RUN: llc < %s -mtriple=x86_64-- -mcpu=x86-64-v4 | FileCheck %s --check-prefixes=AVX512VL
|
|
|
|
;
|
|
; LOGIC
|
|
;
|
|
|
|
define void @test_not_i128(ptr %p0, ptr %p1, i1 zeroext %a2, ptr %p3) nounwind {
|
|
; X86-SSE2-LABEL: test_not_i128:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: pushl %esi
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %edx
|
|
; X86-SSE2-NEXT: movzbl {{[0-9]+}}(%esp), %esi
|
|
; X86-SSE2-NEXT: negl %esi
|
|
; X86-SSE2-NEXT: movd %esi, %xmm0
|
|
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; X86-SSE2-NEXT: movdqa (%edx), %xmm1
|
|
; X86-SSE2-NEXT: pand %xmm0, %xmm1
|
|
; X86-SSE2-NEXT: por (%ecx), %xmm0
|
|
; X86-SSE2-NEXT: pcmpeqd %xmm2, %xmm2
|
|
; X86-SSE2-NEXT: pxor %xmm0, %xmm2
|
|
; X86-SSE2-NEXT: por %xmm1, %xmm2
|
|
; X86-SSE2-NEXT: movdqa %xmm2, (%eax)
|
|
; X86-SSE2-NEXT: popl %esi
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X64-SSE2-LABEL: test_not_i128:
|
|
; X64-SSE2: # %bb.0:
|
|
; X64-SSE2-NEXT: negl %edx
|
|
; X64-SSE2-NEXT: movd %edx, %xmm0
|
|
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; X64-SSE2-NEXT: movdqa (%rdi), %xmm1
|
|
; X64-SSE2-NEXT: pand %xmm0, %xmm1
|
|
; X64-SSE2-NEXT: por (%rsi), %xmm0
|
|
; X64-SSE2-NEXT: pcmpeqd %xmm2, %xmm2
|
|
; X64-SSE2-NEXT: pxor %xmm0, %xmm2
|
|
; X64-SSE2-NEXT: por %xmm1, %xmm2
|
|
; X64-SSE2-NEXT: movdqa %xmm2, (%rcx)
|
|
; X64-SSE2-NEXT: retq
|
|
;
|
|
; X86-SSE4-LABEL: test_not_i128:
|
|
; X86-SSE4: # %bb.0:
|
|
; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %edx
|
|
; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
|
|
; X86-SSE4-NEXT: pxor (%ecx), %xmm1
|
|
; X86-SSE4-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE4-NEXT: negl %ecx
|
|
; X86-SSE4-NEXT: movd %ecx, %xmm0
|
|
; X86-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; X86-SSE4-NEXT: blendvps %xmm0, (%edx), %xmm1
|
|
; X86-SSE4-NEXT: movaps %xmm1, (%eax)
|
|
; X86-SSE4-NEXT: retl
|
|
;
|
|
; X64-SSE4-LABEL: test_not_i128:
|
|
; X64-SSE4: # %bb.0:
|
|
; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
|
|
; X64-SSE4-NEXT: pxor (%rsi), %xmm1
|
|
; X64-SSE4-NEXT: negl %edx
|
|
; X64-SSE4-NEXT: movd %edx, %xmm0
|
|
; X64-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; X64-SSE4-NEXT: blendvps %xmm0, (%rdi), %xmm1
|
|
; X64-SSE4-NEXT: movaps %xmm1, (%rcx)
|
|
; X64-SSE4-NEXT: retq
|
|
;
|
|
; X86-AVX1-LABEL: test_not_i128:
|
|
; X86-AVX1: # %bb.0:
|
|
; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %edx
|
|
; X86-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
|
|
; X86-AVX1-NEXT: vpxor (%ecx), %xmm0, %xmm0
|
|
; X86-AVX1-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
|
|
; X86-AVX1-NEXT: negl %ecx
|
|
; X86-AVX1-NEXT: vmovd %ecx, %xmm1
|
|
; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
|
|
; X86-AVX1-NEXT: vblendvps %xmm1, (%edx), %xmm0, %xmm0
|
|
; X86-AVX1-NEXT: vmovaps %xmm0, (%eax)
|
|
; X86-AVX1-NEXT: retl
|
|
;
|
|
; X64-AVX1-LABEL: test_not_i128:
|
|
; X64-AVX1: # %bb.0:
|
|
; X64-AVX1-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
|
|
; X64-AVX1-NEXT: vpxor (%rsi), %xmm0, %xmm0
|
|
; X64-AVX1-NEXT: negl %edx
|
|
; X64-AVX1-NEXT: vmovd %edx, %xmm1
|
|
; X64-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
|
|
; X64-AVX1-NEXT: vblendvps %xmm1, (%rdi), %xmm0, %xmm0
|
|
; X64-AVX1-NEXT: vmovaps %xmm0, (%rcx)
|
|
; X64-AVX1-NEXT: retq
|
|
;
|
|
; X86-AVX2-LABEL: test_not_i128:
|
|
; X86-AVX2: # %bb.0:
|
|
; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-AVX2-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
|
|
; X86-AVX2-NEXT: vpxor (%eax), %xmm0, %xmm0
|
|
; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-AVX2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
|
|
; X86-AVX2-NEXT: negl %ecx
|
|
; X86-AVX2-NEXT: vmovd %ecx, %xmm1
|
|
; X86-AVX2-NEXT: vpbroadcastd %xmm1, %xmm1
|
|
; X86-AVX2-NEXT: vblendvps %xmm1, (%eax), %xmm0, %xmm0
|
|
; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-AVX2-NEXT: vmovaps %xmm0, (%eax)
|
|
; X86-AVX2-NEXT: retl
|
|
;
|
|
; X64-AVX2-LABEL: test_not_i128:
|
|
; X64-AVX2: # %bb.0:
|
|
; X64-AVX2-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
|
|
; X64-AVX2-NEXT: vpxor (%rsi), %xmm0, %xmm0
|
|
; X64-AVX2-NEXT: negl %edx
|
|
; X64-AVX2-NEXT: vmovd %edx, %xmm1
|
|
; X64-AVX2-NEXT: vpbroadcastd %xmm1, %xmm1
|
|
; X64-AVX2-NEXT: vblendvps %xmm1, (%rdi), %xmm0, %xmm0
|
|
; X64-AVX2-NEXT: vmovaps %xmm0, (%rcx)
|
|
; X64-AVX2-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: test_not_i128:
|
|
; AVX512F: # %bb.0:
|
|
; AVX512F-NEXT: vmovdqa (%rdi), %xmm0
|
|
; AVX512F-NEXT: vpcmpeqd %xmm1, %xmm1, %xmm1
|
|
; AVX512F-NEXT: vpxor (%rsi), %xmm1, %xmm1
|
|
; AVX512F-NEXT: negb %dl
|
|
; AVX512F-NEXT: kmovw %edx, %k1
|
|
; AVX512F-NEXT: vmovdqa32 %zmm0, %zmm1 {%k1}
|
|
; AVX512F-NEXT: vmovdqa %xmm1, (%rcx)
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: test_not_i128:
|
|
; AVX512VL: # %bb.0:
|
|
; AVX512VL-NEXT: vpcmpeqd %xmm0, %xmm0, %xmm0
|
|
; AVX512VL-NEXT: vpxor (%rsi), %xmm0, %xmm0
|
|
; AVX512VL-NEXT: negb %dl
|
|
; AVX512VL-NEXT: kmovd %edx, %k1
|
|
; AVX512VL-NEXT: vmovdqa32 (%rdi), %xmm0 {%k1}
|
|
; AVX512VL-NEXT: vmovdqa %xmm0, (%rcx)
|
|
; AVX512VL-NEXT: retq
|
|
%ld0 = load i128, ptr %p0
|
|
%ld1 = load i128, ptr %p1
|
|
%neg1 = xor i128 %ld1, -1
|
|
%sel = select i1 %a2, i128 %ld0, i128 %neg1
|
|
store i128 %sel, ptr %p3
|
|
ret void
|
|
}
|
|
|
|
define void @test_not_i256(ptr %p0, ptr %p1, i1 zeroext %a2, ptr %p3) nounwind {
|
|
; X86-SSE2-LABEL: test_not_i256:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %edx
|
|
; X86-SSE2-NEXT: movdqa (%edx), %xmm0
|
|
; X86-SSE2-NEXT: movdqa 16(%edx), %xmm1
|
|
; X86-SSE2-NEXT: movzbl {{[0-9]+}}(%esp), %edx
|
|
; X86-SSE2-NEXT: negl %edx
|
|
; X86-SSE2-NEXT: movd %edx, %xmm2
|
|
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
|
|
; X86-SSE2-NEXT: movdqa (%ecx), %xmm3
|
|
; X86-SSE2-NEXT: pand %xmm2, %xmm3
|
|
; X86-SSE2-NEXT: pcmpeqd %xmm4, %xmm4
|
|
; X86-SSE2-NEXT: pxor %xmm2, %xmm4
|
|
; X86-SSE2-NEXT: pandn %xmm4, %xmm0
|
|
; X86-SSE2-NEXT: por %xmm3, %xmm0
|
|
; X86-SSE2-NEXT: pand 16(%ecx), %xmm2
|
|
; X86-SSE2-NEXT: pandn %xmm4, %xmm1
|
|
; X86-SSE2-NEXT: por %xmm2, %xmm1
|
|
; X86-SSE2-NEXT: movdqa %xmm1, 16(%eax)
|
|
; X86-SSE2-NEXT: movdqa %xmm0, (%eax)
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X64-SSE2-LABEL: test_not_i256:
|
|
; X64-SSE2: # %bb.0:
|
|
; X64-SSE2-NEXT: movdqa (%rsi), %xmm0
|
|
; X64-SSE2-NEXT: movdqa 16(%rsi), %xmm1
|
|
; X64-SSE2-NEXT: negl %edx
|
|
; X64-SSE2-NEXT: movd %edx, %xmm2
|
|
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
|
|
; X64-SSE2-NEXT: movdqa (%rdi), %xmm3
|
|
; X64-SSE2-NEXT: pand %xmm2, %xmm3
|
|
; X64-SSE2-NEXT: pcmpeqd %xmm4, %xmm4
|
|
; X64-SSE2-NEXT: pxor %xmm2, %xmm4
|
|
; X64-SSE2-NEXT: pandn %xmm4, %xmm0
|
|
; X64-SSE2-NEXT: por %xmm3, %xmm0
|
|
; X64-SSE2-NEXT: pand 16(%rdi), %xmm2
|
|
; X64-SSE2-NEXT: pandn %xmm4, %xmm1
|
|
; X64-SSE2-NEXT: por %xmm2, %xmm1
|
|
; X64-SSE2-NEXT: movdqa %xmm1, 16(%rcx)
|
|
; X64-SSE2-NEXT: movdqa %xmm0, (%rcx)
|
|
; X64-SSE2-NEXT: retq
|
|
;
|
|
; X86-SSE4-LABEL: test_not_i256:
|
|
; X86-SSE4: # %bb.0:
|
|
; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
|
|
; X86-SSE4-NEXT: movdqa 16(%ecx), %xmm2
|
|
; X86-SSE4-NEXT: pxor %xmm1, %xmm2
|
|
; X86-SSE4-NEXT: pxor (%ecx), %xmm1
|
|
; X86-SSE4-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE4-NEXT: negl %ecx
|
|
; X86-SSE4-NEXT: movd %ecx, %xmm0
|
|
; X86-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; X86-SSE4-NEXT: blendvps %xmm0, (%eax), %xmm1
|
|
; X86-SSE4-NEXT: blendvps %xmm0, 16(%eax), %xmm2
|
|
; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE4-NEXT: movaps %xmm2, 16(%eax)
|
|
; X86-SSE4-NEXT: movaps %xmm1, (%eax)
|
|
; X86-SSE4-NEXT: retl
|
|
;
|
|
; X64-SSE4-LABEL: test_not_i256:
|
|
; X64-SSE4: # %bb.0:
|
|
; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
|
|
; X64-SSE4-NEXT: movdqa 16(%rsi), %xmm2
|
|
; X64-SSE4-NEXT: pxor %xmm1, %xmm2
|
|
; X64-SSE4-NEXT: pxor (%rsi), %xmm1
|
|
; X64-SSE4-NEXT: negl %edx
|
|
; X64-SSE4-NEXT: movd %edx, %xmm0
|
|
; X64-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; X64-SSE4-NEXT: blendvps %xmm0, (%rdi), %xmm1
|
|
; X64-SSE4-NEXT: blendvps %xmm0, 16(%rdi), %xmm2
|
|
; X64-SSE4-NEXT: movaps %xmm2, 16(%rcx)
|
|
; X64-SSE4-NEXT: movaps %xmm1, (%rcx)
|
|
; X64-SSE4-NEXT: retq
|
|
;
|
|
; X86-AVX1-LABEL: test_not_i256:
|
|
; X86-AVX1: # %bb.0:
|
|
; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %edx
|
|
; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-AVX1-NEXT: vmovaps (%edx), %xmm0
|
|
; X86-AVX1-NEXT: vinsertf128 $1, 16(%edx), %ymm0, %ymm0
|
|
; X86-AVX1-NEXT: vmovaps (%ecx), %xmm1
|
|
; X86-AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2
|
|
; X86-AVX1-NEXT: vcmptrueps %ymm2, %ymm2, %ymm2
|
|
; X86-AVX1-NEXT: vxorps %ymm2, %ymm0, %ymm0
|
|
; X86-AVX1-NEXT: movzbl {{[0-9]+}}(%esp), %edx
|
|
; X86-AVX1-NEXT: negl %edx
|
|
; X86-AVX1-NEXT: vmovd %edx, %xmm2
|
|
; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
|
|
; X86-AVX1-NEXT: vextractf128 $1, %ymm0, %xmm3
|
|
; X86-AVX1-NEXT: vblendvps %xmm2, 16(%ecx), %xmm3, %xmm3
|
|
; X86-AVX1-NEXT: vmovaps %xmm3, 16(%eax)
|
|
; X86-AVX1-NEXT: vblendvps %xmm2, %xmm1, %xmm0, %xmm0
|
|
; X86-AVX1-NEXT: vmovaps %xmm0, (%eax)
|
|
; X86-AVX1-NEXT: vzeroupper
|
|
; X86-AVX1-NEXT: retl
|
|
;
|
|
; X64-AVX1-LABEL: test_not_i256:
|
|
; X64-AVX1: # %bb.0:
|
|
; X64-AVX1-NEXT: vmovaps (%rdi), %xmm0
|
|
; X64-AVX1-NEXT: vmovaps (%rsi), %xmm1
|
|
; X64-AVX1-NEXT: vinsertf128 $1, 16(%rsi), %ymm1, %ymm1
|
|
; X64-AVX1-NEXT: vxorps %xmm2, %xmm2, %xmm2
|
|
; X64-AVX1-NEXT: vcmptrueps %ymm2, %ymm2, %ymm2
|
|
; X64-AVX1-NEXT: vxorps %ymm2, %ymm1, %ymm1
|
|
; X64-AVX1-NEXT: negl %edx
|
|
; X64-AVX1-NEXT: vmovd %edx, %xmm2
|
|
; X64-AVX1-NEXT: vpshufd {{.*#+}} xmm2 = xmm2[0,0,0,0]
|
|
; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm3
|
|
; X64-AVX1-NEXT: vblendvps %xmm2, 16(%rdi), %xmm3, %xmm3
|
|
; X64-AVX1-NEXT: vmovaps %xmm3, 16(%rcx)
|
|
; X64-AVX1-NEXT: vblendvps %xmm2, %xmm0, %xmm1, %xmm0
|
|
; X64-AVX1-NEXT: vmovaps %xmm0, (%rcx)
|
|
; X64-AVX1-NEXT: vzeroupper
|
|
; X64-AVX1-NEXT: retq
|
|
;
|
|
; X86-AVX2-LABEL: test_not_i256:
|
|
; X86-AVX2: # %bb.0:
|
|
; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
|
|
; X86-AVX2-NEXT: vpxor (%eax), %ymm0, %ymm0
|
|
; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-AVX2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
|
|
; X86-AVX2-NEXT: negl %ecx
|
|
; X86-AVX2-NEXT: vmovd %ecx, %xmm1
|
|
; X86-AVX2-NEXT: vpbroadcastd %xmm1, %ymm1
|
|
; X86-AVX2-NEXT: vblendvps %ymm1, (%eax), %ymm0, %ymm0
|
|
; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-AVX2-NEXT: vmovups %ymm0, (%eax)
|
|
; X86-AVX2-NEXT: vzeroupper
|
|
; X86-AVX2-NEXT: retl
|
|
;
|
|
; X64-AVX2-LABEL: test_not_i256:
|
|
; X64-AVX2: # %bb.0:
|
|
; X64-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
|
|
; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
|
|
; X64-AVX2-NEXT: negl %edx
|
|
; X64-AVX2-NEXT: vmovd %edx, %xmm1
|
|
; X64-AVX2-NEXT: vpbroadcastd %xmm1, %ymm1
|
|
; X64-AVX2-NEXT: vblendvps %ymm1, (%rdi), %ymm0, %ymm0
|
|
; X64-AVX2-NEXT: vmovups %ymm0, (%rcx)
|
|
; X64-AVX2-NEXT: vzeroupper
|
|
; X64-AVX2-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: test_not_i256:
|
|
; AVX512F: # %bb.0:
|
|
; AVX512F-NEXT: vmovdqu (%rdi), %ymm0
|
|
; AVX512F-NEXT: vpcmpeqd %ymm1, %ymm1, %ymm1
|
|
; AVX512F-NEXT: vpxor (%rsi), %ymm1, %ymm1
|
|
; AVX512F-NEXT: negb %dl
|
|
; AVX512F-NEXT: kmovw %edx, %k1
|
|
; AVX512F-NEXT: vmovdqa32 %zmm0, %zmm1 {%k1}
|
|
; AVX512F-NEXT: vmovdqu %ymm1, (%rcx)
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: test_not_i256:
|
|
; AVX512VL: # %bb.0:
|
|
; AVX512VL-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
|
|
; AVX512VL-NEXT: vpxor (%rsi), %ymm0, %ymm0
|
|
; AVX512VL-NEXT: negb %dl
|
|
; AVX512VL-NEXT: kmovd %edx, %k1
|
|
; AVX512VL-NEXT: vmovdqu32 (%rdi), %ymm0 {%k1}
|
|
; AVX512VL-NEXT: vmovdqu %ymm0, (%rcx)
|
|
; AVX512VL-NEXT: vzeroupper
|
|
; AVX512VL-NEXT: retq
|
|
%ld0 = load i256, ptr %p0
|
|
%ld1 = load i256, ptr %p1
|
|
%neg1 = xor i256 %ld1, -1
|
|
%sel = select i1 %a2, i256 %ld0, i256 %neg1
|
|
store i256 %sel, ptr %p3
|
|
ret void
|
|
}
|
|
|
|
define void @test_not_i512(ptr %p0, ptr %p1, i1 zeroext %a2, ptr %p3) nounwind {
|
|
; X86-SSE2-LABEL: test_not_i512:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE2-NEXT: movl {{[0-9]+}}(%esp), %edx
|
|
; X86-SSE2-NEXT: movdqa 48(%edx), %xmm2
|
|
; X86-SSE2-NEXT: movdqa 32(%edx), %xmm1
|
|
; X86-SSE2-NEXT: movdqa (%edx), %xmm0
|
|
; X86-SSE2-NEXT: movdqa 16(%edx), %xmm3
|
|
; X86-SSE2-NEXT: movzbl {{[0-9]+}}(%esp), %edx
|
|
; X86-SSE2-NEXT: negl %edx
|
|
; X86-SSE2-NEXT: movd %edx, %xmm4
|
|
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
|
|
; X86-SSE2-NEXT: movdqa (%ecx), %xmm6
|
|
; X86-SSE2-NEXT: pand %xmm4, %xmm6
|
|
; X86-SSE2-NEXT: pcmpeqd %xmm5, %xmm5
|
|
; X86-SSE2-NEXT: pxor %xmm4, %xmm5
|
|
; X86-SSE2-NEXT: pandn %xmm5, %xmm0
|
|
; X86-SSE2-NEXT: por %xmm6, %xmm0
|
|
; X86-SSE2-NEXT: movdqa 16(%ecx), %xmm6
|
|
; X86-SSE2-NEXT: pand %xmm4, %xmm6
|
|
; X86-SSE2-NEXT: pandn %xmm5, %xmm3
|
|
; X86-SSE2-NEXT: por %xmm6, %xmm3
|
|
; X86-SSE2-NEXT: movdqa 32(%ecx), %xmm6
|
|
; X86-SSE2-NEXT: pand %xmm4, %xmm6
|
|
; X86-SSE2-NEXT: pandn %xmm5, %xmm1
|
|
; X86-SSE2-NEXT: por %xmm6, %xmm1
|
|
; X86-SSE2-NEXT: pand 48(%ecx), %xmm4
|
|
; X86-SSE2-NEXT: pandn %xmm5, %xmm2
|
|
; X86-SSE2-NEXT: por %xmm4, %xmm2
|
|
; X86-SSE2-NEXT: movdqa %xmm2, 48(%eax)
|
|
; X86-SSE2-NEXT: movdqa %xmm1, 32(%eax)
|
|
; X86-SSE2-NEXT: movdqa %xmm3, 16(%eax)
|
|
; X86-SSE2-NEXT: movdqa %xmm0, (%eax)
|
|
; X86-SSE2-NEXT: retl
|
|
;
|
|
; X64-SSE2-LABEL: test_not_i512:
|
|
; X64-SSE2: # %bb.0:
|
|
; X64-SSE2-NEXT: movdqa (%rsi), %xmm3
|
|
; X64-SSE2-NEXT: movdqa 16(%rsi), %xmm2
|
|
; X64-SSE2-NEXT: movdqa 32(%rsi), %xmm1
|
|
; X64-SSE2-NEXT: movdqa 48(%rsi), %xmm0
|
|
; X64-SSE2-NEXT: negl %edx
|
|
; X64-SSE2-NEXT: movd %edx, %xmm4
|
|
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
|
|
; X64-SSE2-NEXT: movdqa 48(%rdi), %xmm5
|
|
; X64-SSE2-NEXT: pand %xmm4, %xmm5
|
|
; X64-SSE2-NEXT: pcmpeqd %xmm6, %xmm6
|
|
; X64-SSE2-NEXT: pxor %xmm4, %xmm6
|
|
; X64-SSE2-NEXT: pandn %xmm6, %xmm0
|
|
; X64-SSE2-NEXT: por %xmm5, %xmm0
|
|
; X64-SSE2-NEXT: movdqa 32(%rdi), %xmm5
|
|
; X64-SSE2-NEXT: pand %xmm4, %xmm5
|
|
; X64-SSE2-NEXT: pandn %xmm6, %xmm1
|
|
; X64-SSE2-NEXT: por %xmm5, %xmm1
|
|
; X64-SSE2-NEXT: movdqa 16(%rdi), %xmm5
|
|
; X64-SSE2-NEXT: pand %xmm4, %xmm5
|
|
; X64-SSE2-NEXT: pandn %xmm6, %xmm2
|
|
; X64-SSE2-NEXT: por %xmm5, %xmm2
|
|
; X64-SSE2-NEXT: pand (%rdi), %xmm4
|
|
; X64-SSE2-NEXT: pandn %xmm6, %xmm3
|
|
; X64-SSE2-NEXT: por %xmm4, %xmm3
|
|
; X64-SSE2-NEXT: movdqa %xmm3, (%rcx)
|
|
; X64-SSE2-NEXT: movdqa %xmm2, 16(%rcx)
|
|
; X64-SSE2-NEXT: movdqa %xmm1, 32(%rcx)
|
|
; X64-SSE2-NEXT: movdqa %xmm0, 48(%rcx)
|
|
; X64-SSE2-NEXT: retq
|
|
;
|
|
; X86-SSE4-LABEL: test_not_i512:
|
|
; X86-SSE4: # %bb.0:
|
|
; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %edx
|
|
; X86-SSE4-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
|
|
; X86-SSE4-NEXT: movdqa 48(%edx), %xmm2
|
|
; X86-SSE4-NEXT: pxor %xmm1, %xmm2
|
|
; X86-SSE4-NEXT: movdqa 32(%edx), %xmm3
|
|
; X86-SSE4-NEXT: pxor %xmm1, %xmm3
|
|
; X86-SSE4-NEXT: movdqa 16(%edx), %xmm4
|
|
; X86-SSE4-NEXT: pxor %xmm1, %xmm4
|
|
; X86-SSE4-NEXT: pxor (%edx), %xmm1
|
|
; X86-SSE4-NEXT: movzbl {{[0-9]+}}(%esp), %edx
|
|
; X86-SSE4-NEXT: negl %edx
|
|
; X86-SSE4-NEXT: movd %edx, %xmm0
|
|
; X86-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; X86-SSE4-NEXT: blendvps %xmm0, (%ecx), %xmm1
|
|
; X86-SSE4-NEXT: blendvps %xmm0, 16(%ecx), %xmm4
|
|
; X86-SSE4-NEXT: blendvps %xmm0, 32(%ecx), %xmm3
|
|
; X86-SSE4-NEXT: blendvps %xmm0, 48(%ecx), %xmm2
|
|
; X86-SSE4-NEXT: movaps %xmm2, 48(%eax)
|
|
; X86-SSE4-NEXT: movaps %xmm3, 32(%eax)
|
|
; X86-SSE4-NEXT: movaps %xmm4, 16(%eax)
|
|
; X86-SSE4-NEXT: movaps %xmm1, (%eax)
|
|
; X86-SSE4-NEXT: retl
|
|
;
|
|
; X64-SSE4-LABEL: test_not_i512:
|
|
; X64-SSE4: # %bb.0:
|
|
; X64-SSE4-NEXT: pcmpeqd %xmm1, %xmm1
|
|
; X64-SSE4-NEXT: movdqa (%rsi), %xmm2
|
|
; X64-SSE4-NEXT: pxor %xmm1, %xmm2
|
|
; X64-SSE4-NEXT: movdqa 16(%rsi), %xmm3
|
|
; X64-SSE4-NEXT: pxor %xmm1, %xmm3
|
|
; X64-SSE4-NEXT: movdqa 32(%rsi), %xmm4
|
|
; X64-SSE4-NEXT: pxor %xmm1, %xmm4
|
|
; X64-SSE4-NEXT: pxor 48(%rsi), %xmm1
|
|
; X64-SSE4-NEXT: negl %edx
|
|
; X64-SSE4-NEXT: movd %edx, %xmm0
|
|
; X64-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; X64-SSE4-NEXT: blendvps %xmm0, 48(%rdi), %xmm1
|
|
; X64-SSE4-NEXT: blendvps %xmm0, 32(%rdi), %xmm4
|
|
; X64-SSE4-NEXT: blendvps %xmm0, 16(%rdi), %xmm3
|
|
; X64-SSE4-NEXT: blendvps %xmm0, (%rdi), %xmm2
|
|
; X64-SSE4-NEXT: movaps %xmm2, (%rcx)
|
|
; X64-SSE4-NEXT: movaps %xmm3, 16(%rcx)
|
|
; X64-SSE4-NEXT: movaps %xmm4, 32(%rcx)
|
|
; X64-SSE4-NEXT: movaps %xmm1, 48(%rcx)
|
|
; X64-SSE4-NEXT: retq
|
|
;
|
|
; X86-AVX1-LABEL: test_not_i512:
|
|
; X86-AVX1: # %bb.0:
|
|
; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %edx
|
|
; X86-AVX1-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-AVX1-NEXT: vmovaps (%ecx), %xmm0
|
|
; X86-AVX1-NEXT: vmovaps 16(%ecx), %xmm1
|
|
; X86-AVX1-NEXT: vmovaps (%edx), %xmm2
|
|
; X86-AVX1-NEXT: vmovaps 32(%edx), %xmm3
|
|
; X86-AVX1-NEXT: vinsertf128 $1, 48(%edx), %ymm3, %ymm3
|
|
; X86-AVX1-NEXT: vinsertf128 $1, 16(%edx), %ymm2, %ymm2
|
|
; X86-AVX1-NEXT: vxorps %xmm4, %xmm4, %xmm4
|
|
; X86-AVX1-NEXT: vcmptrueps %ymm4, %ymm4, %ymm4
|
|
; X86-AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm2
|
|
; X86-AVX1-NEXT: vxorps %ymm4, %ymm3, %ymm3
|
|
; X86-AVX1-NEXT: movzbl {{[0-9]+}}(%esp), %edx
|
|
; X86-AVX1-NEXT: negl %edx
|
|
; X86-AVX1-NEXT: vmovd %edx, %xmm4
|
|
; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
|
|
; X86-AVX1-NEXT: vextractf128 $1, %ymm3, %xmm5
|
|
; X86-AVX1-NEXT: vblendvps %xmm4, 48(%ecx), %xmm5, %xmm5
|
|
; X86-AVX1-NEXT: vmovaps 32(%ecx), %xmm6
|
|
; X86-AVX1-NEXT: vmovaps %xmm5, 48(%eax)
|
|
; X86-AVX1-NEXT: vblendvps %xmm4, %xmm6, %xmm3, %xmm3
|
|
; X86-AVX1-NEXT: vmovaps %xmm3, 32(%eax)
|
|
; X86-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm3
|
|
; X86-AVX1-NEXT: vblendvps %xmm4, %xmm1, %xmm3, %xmm1
|
|
; X86-AVX1-NEXT: vmovaps %xmm1, 16(%eax)
|
|
; X86-AVX1-NEXT: vblendvps %xmm4, %xmm0, %xmm2, %xmm0
|
|
; X86-AVX1-NEXT: vmovaps %xmm0, (%eax)
|
|
; X86-AVX1-NEXT: vzeroupper
|
|
; X86-AVX1-NEXT: retl
|
|
;
|
|
; X64-AVX1-LABEL: test_not_i512:
|
|
; X64-AVX1: # %bb.0:
|
|
; X64-AVX1-NEXT: vmovaps (%rdi), %xmm0
|
|
; X64-AVX1-NEXT: vmovaps (%rsi), %xmm1
|
|
; X64-AVX1-NEXT: vmovaps 32(%rsi), %xmm2
|
|
; X64-AVX1-NEXT: vinsertf128 $1, 48(%rsi), %ymm2, %ymm2
|
|
; X64-AVX1-NEXT: vinsertf128 $1, 16(%rsi), %ymm1, %ymm1
|
|
; X64-AVX1-NEXT: vmovaps 16(%rdi), %xmm3
|
|
; X64-AVX1-NEXT: vxorps %xmm4, %xmm4, %xmm4
|
|
; X64-AVX1-NEXT: vcmptrueps %ymm4, %ymm4, %ymm4
|
|
; X64-AVX1-NEXT: vxorps %ymm4, %ymm1, %ymm1
|
|
; X64-AVX1-NEXT: vxorps %ymm4, %ymm2, %ymm2
|
|
; X64-AVX1-NEXT: negl %edx
|
|
; X64-AVX1-NEXT: vmovd %edx, %xmm4
|
|
; X64-AVX1-NEXT: vpshufd {{.*#+}} xmm4 = xmm4[0,0,0,0]
|
|
; X64-AVX1-NEXT: vextractf128 $1, %ymm2, %xmm5
|
|
; X64-AVX1-NEXT: vblendvps %xmm4, 48(%rdi), %xmm5, %xmm5
|
|
; X64-AVX1-NEXT: vmovaps 32(%rdi), %xmm6
|
|
; X64-AVX1-NEXT: vmovaps %xmm5, 48(%rcx)
|
|
; X64-AVX1-NEXT: vblendvps %xmm4, %xmm6, %xmm2, %xmm2
|
|
; X64-AVX1-NEXT: vmovaps %xmm2, 32(%rcx)
|
|
; X64-AVX1-NEXT: vextractf128 $1, %ymm1, %xmm2
|
|
; X64-AVX1-NEXT: vblendvps %xmm4, %xmm3, %xmm2, %xmm2
|
|
; X64-AVX1-NEXT: vmovaps %xmm2, 16(%rcx)
|
|
; X64-AVX1-NEXT: vblendvps %xmm4, %xmm0, %xmm1, %xmm0
|
|
; X64-AVX1-NEXT: vmovaps %xmm0, (%rcx)
|
|
; X64-AVX1-NEXT: vzeroupper
|
|
; X64-AVX1-NEXT: retq
|
|
;
|
|
; X86-AVX2-LABEL: test_not_i512:
|
|
; X86-AVX2: # %bb.0:
|
|
; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
|
|
; X86-AVX2-NEXT: vpxor 32(%eax), %ymm0, %ymm1
|
|
; X86-AVX2-NEXT: vpxor (%eax), %ymm0, %ymm0
|
|
; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; X86-AVX2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
|
|
; X86-AVX2-NEXT: negl %ecx
|
|
; X86-AVX2-NEXT: vmovd %ecx, %xmm2
|
|
; X86-AVX2-NEXT: vpbroadcastd %xmm2, %ymm2
|
|
; X86-AVX2-NEXT: vblendvps %ymm2, (%eax), %ymm0, %ymm0
|
|
; X86-AVX2-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; X86-AVX2-NEXT: vblendvps %ymm2, 32(%eax), %ymm1, %ymm1
|
|
; X86-AVX2-NEXT: vmovups %ymm1, 32(%ecx)
|
|
; X86-AVX2-NEXT: vmovups %ymm0, (%ecx)
|
|
; X86-AVX2-NEXT: vzeroupper
|
|
; X86-AVX2-NEXT: retl
|
|
;
|
|
; X64-AVX2-LABEL: test_not_i512:
|
|
; X64-AVX2: # %bb.0:
|
|
; X64-AVX2-NEXT: vpcmpeqd %ymm0, %ymm0, %ymm0
|
|
; X64-AVX2-NEXT: vpxor 32(%rsi), %ymm0, %ymm1
|
|
; X64-AVX2-NEXT: vpxor (%rsi), %ymm0, %ymm0
|
|
; X64-AVX2-NEXT: negl %edx
|
|
; X64-AVX2-NEXT: vmovd %edx, %xmm2
|
|
; X64-AVX2-NEXT: vpbroadcastd %xmm2, %ymm2
|
|
; X64-AVX2-NEXT: vblendvps %ymm2, (%rdi), %ymm0, %ymm0
|
|
; X64-AVX2-NEXT: vblendvps %ymm2, 32(%rdi), %ymm1, %ymm1
|
|
; X64-AVX2-NEXT: vmovups %ymm1, 32(%rcx)
|
|
; X64-AVX2-NEXT: vmovups %ymm0, (%rcx)
|
|
; X64-AVX2-NEXT: vzeroupper
|
|
; X64-AVX2-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: test_not_i512:
|
|
; AVX512F: # %bb.0:
|
|
; AVX512F-NEXT: vpternlogd {{.*#+}} zmm0 = -1
|
|
; AVX512F-NEXT: vpxord (%rsi), %zmm0, %zmm0
|
|
; AVX512F-NEXT: negl %edx
|
|
; AVX512F-NEXT: kmovw %edx, %k1
|
|
; AVX512F-NEXT: vmovdqu32 (%rdi), %zmm0 {%k1}
|
|
; AVX512F-NEXT: vmovdqu64 %zmm0, (%rcx)
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: test_not_i512:
|
|
; AVX512VL: # %bb.0:
|
|
; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm0 = -1
|
|
; AVX512VL-NEXT: vpxord (%rsi), %zmm0, %zmm0
|
|
; AVX512VL-NEXT: negl %edx
|
|
; AVX512VL-NEXT: kmovd %edx, %k1
|
|
; AVX512VL-NEXT: vmovdqu32 (%rdi), %zmm0 {%k1}
|
|
; AVX512VL-NEXT: vmovdqu64 %zmm0, (%rcx)
|
|
; AVX512VL-NEXT: vzeroupper
|
|
; AVX512VL-NEXT: retq
|
|
%ld0 = load i512, ptr %p0
|
|
%ld1 = load i512, ptr %p1
|
|
%neg1 = xor i512 %ld1, -1
|
|
%sel = select i1 %a2, i512 %ld0, i512 %neg1
|
|
store i512 %sel, ptr %p3
|
|
ret void
|
|
}
|
|
|
|
;
|
|
; ADD/SUB
|
|
;
|
|
|
|
define void @test_neg_i512(ptr %p0, ptr %p1, i1 zeroext %a2, ptr %p3) nounwind {
|
|
; X86-LABEL: test_neg_i512:
|
|
; X86: # %bb.0:
|
|
; X86-NEXT: pushl %ebp
|
|
; X86-NEXT: pushl %ebx
|
|
; X86-NEXT: pushl %edi
|
|
; X86-NEXT: pushl %esi
|
|
; X86-NEXT: subl $44, %esp
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
|
|
; X86-NEXT: xorl %edi, %edi
|
|
; X86-NEXT: xorl %eax, %eax
|
|
; X86-NEXT: subl (%edx), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl $0, %eax
|
|
; X86-NEXT: sbbl 4(%edx), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl $0, %eax
|
|
; X86-NEXT: sbbl 8(%edx), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl $0, %eax
|
|
; X86-NEXT: sbbl 12(%edx), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl $0, %eax
|
|
; X86-NEXT: sbbl 16(%edx), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl $0, %eax
|
|
; X86-NEXT: sbbl 20(%edx), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl $0, %eax
|
|
; X86-NEXT: sbbl 24(%edx), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl $0, %eax
|
|
; X86-NEXT: sbbl 28(%edx), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl $0, %eax
|
|
; X86-NEXT: sbbl 32(%edx), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl $0, %eax
|
|
; X86-NEXT: sbbl 36(%edx), %eax
|
|
; X86-NEXT: movl %eax, (%esp) # 4-byte Spill
|
|
; X86-NEXT: movl $0, %ebx
|
|
; X86-NEXT: sbbl 40(%edx), %ebx
|
|
; X86-NEXT: movl $0, %ebp
|
|
; X86-NEXT: sbbl 44(%edx), %ebp
|
|
; X86-NEXT: movl $0, %eax
|
|
; X86-NEXT: sbbl 48(%edx), %eax
|
|
; X86-NEXT: movl $0, %ecx
|
|
; X86-NEXT: sbbl 52(%edx), %ecx
|
|
; X86-NEXT: movl $0, %esi
|
|
; X86-NEXT: sbbl 56(%edx), %esi
|
|
; X86-NEXT: sbbl 60(%edx), %edi
|
|
; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: cmpb $0, {{[0-9]+}}(%esp)
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %edx
|
|
; X86-NEXT: je .LBB3_2
|
|
; X86-NEXT: # %bb.1:
|
|
; X86-NEXT: movl {{[0-9]+}}(%esp), %edi
|
|
; X86-NEXT: movl (%edi), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl 4(%edi), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl 8(%edi), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl 12(%edi), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl 16(%edi), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl 20(%edi), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl 24(%edi), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl 28(%edi), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl 32(%edi), %eax
|
|
; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: movl 36(%edi), %eax
|
|
; X86-NEXT: movl %eax, (%esp) # 4-byte Spill
|
|
; X86-NEXT: movl 40(%edi), %ebx
|
|
; X86-NEXT: movl 44(%edi), %ebp
|
|
; X86-NEXT: movl 48(%edi), %eax
|
|
; X86-NEXT: movl 52(%edi), %ecx
|
|
; X86-NEXT: movl 56(%edi), %esi
|
|
; X86-NEXT: movl 60(%edi), %edi
|
|
; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; X86-NEXT: .LBB3_2:
|
|
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
|
|
; X86-NEXT: movl %edi, 60(%edx)
|
|
; X86-NEXT: movl %esi, 56(%edx)
|
|
; X86-NEXT: movl %ecx, 52(%edx)
|
|
; X86-NEXT: movl %eax, 48(%edx)
|
|
; X86-NEXT: movl %ebp, 44(%edx)
|
|
; X86-NEXT: movl %ebx, 40(%edx)
|
|
; X86-NEXT: movl (%esp), %eax # 4-byte Reload
|
|
; X86-NEXT: movl %eax, 36(%edx)
|
|
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
|
|
; X86-NEXT: movl %eax, 32(%edx)
|
|
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
|
|
; X86-NEXT: movl %eax, 28(%edx)
|
|
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
|
|
; X86-NEXT: movl %eax, 24(%edx)
|
|
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
|
|
; X86-NEXT: movl %eax, 20(%edx)
|
|
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
|
|
; X86-NEXT: movl %eax, 16(%edx)
|
|
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
|
|
; X86-NEXT: movl %eax, 12(%edx)
|
|
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
|
|
; X86-NEXT: movl %eax, 8(%edx)
|
|
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
|
|
; X86-NEXT: movl %eax, 4(%edx)
|
|
; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
|
|
; X86-NEXT: movl %eax, (%edx)
|
|
; X86-NEXT: addl $44, %esp
|
|
; X86-NEXT: popl %esi
|
|
; X86-NEXT: popl %edi
|
|
; X86-NEXT: popl %ebx
|
|
; X86-NEXT: popl %ebp
|
|
; X86-NEXT: retl
|
|
;
|
|
; X64-LABEL: test_neg_i512:
|
|
; X64: # %bb.0:
|
|
; X64-NEXT: pushq %r15
|
|
; X64-NEXT: pushq %r14
|
|
; X64-NEXT: pushq %rbx
|
|
; X64-NEXT: xorl %r8d, %r8d
|
|
; X64-NEXT: xorl %r10d, %r10d
|
|
; X64-NEXT: subq (%rsi), %r10
|
|
; X64-NEXT: movl $0, %eax
|
|
; X64-NEXT: sbbq 8(%rsi), %rax
|
|
; X64-NEXT: movl $0, %ebx
|
|
; X64-NEXT: sbbq 16(%rsi), %rbx
|
|
; X64-NEXT: movl $0, %r9d
|
|
; X64-NEXT: sbbq 24(%rsi), %r9
|
|
; X64-NEXT: movl $0, %r14d
|
|
; X64-NEXT: sbbq 32(%rsi), %r14
|
|
; X64-NEXT: movl $0, %r11d
|
|
; X64-NEXT: sbbq 40(%rsi), %r11
|
|
; X64-NEXT: movl $0, %r15d
|
|
; X64-NEXT: sbbq 48(%rsi), %r15
|
|
; X64-NEXT: sbbq 56(%rsi), %r8
|
|
; X64-NEXT: testl %edx, %edx
|
|
; X64-NEXT: je .LBB3_2
|
|
; X64-NEXT: # %bb.1:
|
|
; X64-NEXT: movq 8(%rdi), %rax
|
|
; X64-NEXT: movq 24(%rdi), %r9
|
|
; X64-NEXT: movq 40(%rdi), %r11
|
|
; X64-NEXT: movq 56(%rdi), %r8
|
|
; X64-NEXT: movq (%rdi), %r10
|
|
; X64-NEXT: movq 16(%rdi), %rbx
|
|
; X64-NEXT: movq 32(%rdi), %r14
|
|
; X64-NEXT: movq 48(%rdi), %r15
|
|
; X64-NEXT: .LBB3_2:
|
|
; X64-NEXT: movq %r15, 48(%rcx)
|
|
; X64-NEXT: movq %r14, 32(%rcx)
|
|
; X64-NEXT: movq %rbx, 16(%rcx)
|
|
; X64-NEXT: movq %r10, (%rcx)
|
|
; X64-NEXT: movq %r8, 56(%rcx)
|
|
; X64-NEXT: movq %r11, 40(%rcx)
|
|
; X64-NEXT: movq %r9, 24(%rcx)
|
|
; X64-NEXT: movq %rax, 8(%rcx)
|
|
; X64-NEXT: popq %rbx
|
|
; X64-NEXT: popq %r14
|
|
; X64-NEXT: popq %r15
|
|
; X64-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: test_neg_i512:
|
|
; AVX512F: # %bb.0:
|
|
; AVX512F-NEXT: vmovdqu64 (%rsi), %zmm0
|
|
; AVX512F-NEXT: vptestmq %zmm0, %zmm0, %k0
|
|
; AVX512F-NEXT: kmovw %k0, %eax
|
|
; AVX512F-NEXT: vptestnmq %zmm0, %zmm0, %k0
|
|
; AVX512F-NEXT: kmovw %k0, %esi
|
|
; AVX512F-NEXT: movzbl %sil, %esi
|
|
; AVX512F-NEXT: leal (%rsi,%rax,2), %eax
|
|
; AVX512F-NEXT: xorl %esi, %eax
|
|
; AVX512F-NEXT: kmovw %eax, %k1
|
|
; AVX512F-NEXT: vpxor %xmm1, %xmm1, %xmm1
|
|
; AVX512F-NEXT: vpsubq %zmm0, %zmm1, %zmm1
|
|
; AVX512F-NEXT: vpternlogd {{.*#+}} zmm2 = -1
|
|
; AVX512F-NEXT: vpxorq %zmm2, %zmm0, %zmm1 {%k1}
|
|
; AVX512F-NEXT: negl %edx
|
|
; AVX512F-NEXT: kmovw %edx, %k1
|
|
; AVX512F-NEXT: vmovdqu32 (%rdi), %zmm1 {%k1}
|
|
; AVX512F-NEXT: vmovdqu64 %zmm1, (%rcx)
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: test_neg_i512:
|
|
; AVX512VL: # %bb.0:
|
|
; AVX512VL-NEXT: vmovdqu64 (%rsi), %zmm0
|
|
; AVX512VL-NEXT: vptestmq %zmm0, %zmm0, %k0
|
|
; AVX512VL-NEXT: kmovd %k0, %eax
|
|
; AVX512VL-NEXT: vptestnmq %zmm0, %zmm0, %k0
|
|
; AVX512VL-NEXT: kmovb %k0, %esi
|
|
; AVX512VL-NEXT: leal (%rsi,%rax,2), %eax
|
|
; AVX512VL-NEXT: xorl %esi, %eax
|
|
; AVX512VL-NEXT: kmovd %eax, %k1
|
|
; AVX512VL-NEXT: vpxor %xmm1, %xmm1, %xmm1
|
|
; AVX512VL-NEXT: vpsubq %zmm0, %zmm1, %zmm1
|
|
; AVX512VL-NEXT: vpternlogd {{.*#+}} zmm2 = -1
|
|
; AVX512VL-NEXT: vpxorq %zmm2, %zmm0, %zmm1 {%k1}
|
|
; AVX512VL-NEXT: negl %edx
|
|
; AVX512VL-NEXT: kmovd %edx, %k1
|
|
; AVX512VL-NEXT: vmovdqu32 (%rdi), %zmm1 {%k1}
|
|
; AVX512VL-NEXT: vmovdqu64 %zmm1, (%rcx)
|
|
; AVX512VL-NEXT: vzeroupper
|
|
; AVX512VL-NEXT: retq
|
|
%ld0 = load i512, ptr %p0
|
|
%ld1 = load i512, ptr %p1
|
|
%neg1 = sub i512 0, %ld1
|
|
%sel = select i1 %a2, i512 %ld0, i512 %neg1
|
|
store i512 %sel, ptr %p3
|
|
ret void
|
|
}
|
|
|
|
define i128 @PR196493(i1 %c, i128 %a, ptr %m) nounwind {
|
|
; X86-SSE2-LABEL: PR196493:
|
|
; X86-SSE2: # %bb.0:
|
|
; X86-SSE2-NEXT: pushl %ebp
|
|
; X86-SSE2-NEXT: movl %esp, %ebp
|
|
; X86-SSE2-NEXT: andl $-16, %esp
|
|
; X86-SSE2-NEXT: subl $16, %esp
|
|
; X86-SSE2-NEXT: movl 8(%ebp), %eax
|
|
; X86-SSE2-NEXT: movl 40(%ebp), %ecx
|
|
; X86-SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
|
|
; X86-SSE2-NEXT: movd {{.*#+}} xmm1 = mem[0],zero,zero,zero
|
|
; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
|
|
; X86-SSE2-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
|
|
; X86-SSE2-NEXT: movd {{.*#+}} xmm2 = mem[0],zero,zero,zero
|
|
; X86-SSE2-NEXT: punpckldq {{.*#+}} xmm2 = xmm2[0],xmm0[0],xmm2[1],xmm0[1]
|
|
; X86-SSE2-NEXT: punpcklqdq {{.*#+}} xmm2 = xmm2[0],xmm1[0]
|
|
; X86-SSE2-NEXT: movzbl 12(%ebp), %ecx
|
|
; X86-SSE2-NEXT: andl $1, %ecx
|
|
; X86-SSE2-NEXT: negl %ecx
|
|
; X86-SSE2-NEXT: movd %ecx, %xmm0
|
|
; X86-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; X86-SSE2-NEXT: pand %xmm2, %xmm0
|
|
; X86-SSE2-NEXT: movdqa %xmm0, (%eax)
|
|
; X86-SSE2-NEXT: movl %ebp, %esp
|
|
; X86-SSE2-NEXT: popl %ebp
|
|
; X86-SSE2-NEXT: retl $4
|
|
;
|
|
; X64-SSE2-LABEL: PR196493:
|
|
; X64-SSE2: # %bb.0:
|
|
; X64-SSE2-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
|
|
; X64-SSE2-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
|
|
; X64-SSE2-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
|
|
; X64-SSE2-NEXT: andl $1, %edi
|
|
; X64-SSE2-NEXT: negl %edi
|
|
; X64-SSE2-NEXT: movd %edi, %xmm0
|
|
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; X64-SSE2-NEXT: pand %xmm1, %xmm0
|
|
; X64-SSE2-NEXT: movq %xmm0, %rax
|
|
; X64-SSE2-NEXT: pshufd {{.*#+}} xmm0 = xmm0[2,3,2,3]
|
|
; X64-SSE2-NEXT: movq %xmm0, %rdx
|
|
; X64-SSE2-NEXT: retq
|
|
;
|
|
; X86-SSE4-LABEL: PR196493:
|
|
; X86-SSE4: # %bb.0:
|
|
; X86-SSE4-NEXT: pushl %ebp
|
|
; X86-SSE4-NEXT: movl %esp, %ebp
|
|
; X86-SSE4-NEXT: andl $-16, %esp
|
|
; X86-SSE4-NEXT: subl $16, %esp
|
|
; X86-SSE4-NEXT: movl 8(%ebp), %eax
|
|
; X86-SSE4-NEXT: movl 40(%ebp), %ecx
|
|
; X86-SSE4-NEXT: movd {{.*#+}} xmm0 = mem[0],zero,zero,zero
|
|
; X86-SSE4-NEXT: pinsrd $1, 4(%ecx), %xmm0
|
|
; X86-SSE4-NEXT: pinsrd $2, 8(%ecx), %xmm0
|
|
; X86-SSE4-NEXT: pinsrd $3, 12(%ecx), %xmm0
|
|
; X86-SSE4-NEXT: movzbl 12(%ebp), %ecx
|
|
; X86-SSE4-NEXT: andl $1, %ecx
|
|
; X86-SSE4-NEXT: negl %ecx
|
|
; X86-SSE4-NEXT: movd %ecx, %xmm1
|
|
; X86-SSE4-NEXT: pshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
|
|
; X86-SSE4-NEXT: pand %xmm0, %xmm1
|
|
; X86-SSE4-NEXT: movdqa %xmm1, (%eax)
|
|
; X86-SSE4-NEXT: movl %ebp, %esp
|
|
; X86-SSE4-NEXT: popl %ebp
|
|
; X86-SSE4-NEXT: retl $4
|
|
;
|
|
; X64-SSE4-LABEL: PR196493:
|
|
; X64-SSE4: # %bb.0:
|
|
; X64-SSE4-NEXT: movq {{.*#+}} xmm0 = mem[0],zero
|
|
; X64-SSE4-NEXT: movq {{.*#+}} xmm1 = mem[0],zero
|
|
; X64-SSE4-NEXT: punpcklqdq {{.*#+}} xmm1 = xmm1[0],xmm0[0]
|
|
; X64-SSE4-NEXT: andl $1, %edi
|
|
; X64-SSE4-NEXT: negl %edi
|
|
; X64-SSE4-NEXT: movd %edi, %xmm0
|
|
; X64-SSE4-NEXT: pshufd {{.*#+}} xmm0 = xmm0[0,0,0,0]
|
|
; X64-SSE4-NEXT: pand %xmm1, %xmm0
|
|
; X64-SSE4-NEXT: movq %xmm0, %rax
|
|
; X64-SSE4-NEXT: pextrq $1, %xmm0, %rdx
|
|
; X64-SSE4-NEXT: retq
|
|
;
|
|
; X86-AVX1-LABEL: PR196493:
|
|
; X86-AVX1: # %bb.0:
|
|
; X86-AVX1-NEXT: pushl %ebp
|
|
; X86-AVX1-NEXT: movl %esp, %ebp
|
|
; X86-AVX1-NEXT: andl $-16, %esp
|
|
; X86-AVX1-NEXT: subl $16, %esp
|
|
; X86-AVX1-NEXT: movl 8(%ebp), %eax
|
|
; X86-AVX1-NEXT: movl 40(%ebp), %ecx
|
|
; X86-AVX1-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
|
|
; X86-AVX1-NEXT: vpinsrd $1, 4(%ecx), %xmm0, %xmm0
|
|
; X86-AVX1-NEXT: vpinsrd $2, 8(%ecx), %xmm0, %xmm0
|
|
; X86-AVX1-NEXT: vpinsrd $3, 12(%ecx), %xmm0, %xmm0
|
|
; X86-AVX1-NEXT: movzbl 12(%ebp), %ecx
|
|
; X86-AVX1-NEXT: andl $1, %ecx
|
|
; X86-AVX1-NEXT: negl %ecx
|
|
; X86-AVX1-NEXT: vmovd %ecx, %xmm1
|
|
; X86-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
|
|
; X86-AVX1-NEXT: vpand %xmm0, %xmm1, %xmm0
|
|
; X86-AVX1-NEXT: vmovdqa %xmm0, (%eax)
|
|
; X86-AVX1-NEXT: movl %ebp, %esp
|
|
; X86-AVX1-NEXT: popl %ebp
|
|
; X86-AVX1-NEXT: retl $4
|
|
;
|
|
; X64-AVX1-LABEL: PR196493:
|
|
; X64-AVX1: # %bb.0:
|
|
; X64-AVX1-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
|
|
; X64-AVX1-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
|
|
; X64-AVX1-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
|
|
; X64-AVX1-NEXT: andl $1, %edi
|
|
; X64-AVX1-NEXT: negl %edi
|
|
; X64-AVX1-NEXT: vmovd %edi, %xmm1
|
|
; X64-AVX1-NEXT: vpshufd {{.*#+}} xmm1 = xmm1[0,0,0,0]
|
|
; X64-AVX1-NEXT: vpand %xmm1, %xmm0, %xmm0
|
|
; X64-AVX1-NEXT: vmovq %xmm0, %rax
|
|
; X64-AVX1-NEXT: vpextrq $1, %xmm0, %rdx
|
|
; X64-AVX1-NEXT: retq
|
|
;
|
|
; X86-AVX2-LABEL: PR196493:
|
|
; X86-AVX2: # %bb.0:
|
|
; X86-AVX2-NEXT: pushl %ebp
|
|
; X86-AVX2-NEXT: movl %esp, %ebp
|
|
; X86-AVX2-NEXT: andl $-16, %esp
|
|
; X86-AVX2-NEXT: subl $16, %esp
|
|
; X86-AVX2-NEXT: movl 8(%ebp), %eax
|
|
; X86-AVX2-NEXT: movl 40(%ebp), %ecx
|
|
; X86-AVX2-NEXT: vmovd {{.*#+}} xmm0 = mem[0],zero,zero,zero
|
|
; X86-AVX2-NEXT: vpinsrd $1, 4(%ecx), %xmm0, %xmm0
|
|
; X86-AVX2-NEXT: vpinsrd $2, 8(%ecx), %xmm0, %xmm0
|
|
; X86-AVX2-NEXT: vpinsrd $3, 12(%ecx), %xmm0, %xmm0
|
|
; X86-AVX2-NEXT: movzbl 12(%ebp), %ecx
|
|
; X86-AVX2-NEXT: andl $1, %ecx
|
|
; X86-AVX2-NEXT: negl %ecx
|
|
; X86-AVX2-NEXT: vmovd %ecx, %xmm1
|
|
; X86-AVX2-NEXT: vpbroadcastd %xmm1, %xmm1
|
|
; X86-AVX2-NEXT: vpand %xmm0, %xmm1, %xmm0
|
|
; X86-AVX2-NEXT: vmovdqa %xmm0, (%eax)
|
|
; X86-AVX2-NEXT: movl %ebp, %esp
|
|
; X86-AVX2-NEXT: popl %ebp
|
|
; X86-AVX2-NEXT: retl $4
|
|
;
|
|
; X64-AVX2-LABEL: PR196493:
|
|
; X64-AVX2: # %bb.0:
|
|
; X64-AVX2-NEXT: vmovq {{.*#+}} xmm0 = mem[0],zero
|
|
; X64-AVX2-NEXT: vmovq {{.*#+}} xmm1 = mem[0],zero
|
|
; X64-AVX2-NEXT: vpunpcklqdq {{.*#+}} xmm0 = xmm1[0],xmm0[0]
|
|
; X64-AVX2-NEXT: andl $1, %edi
|
|
; X64-AVX2-NEXT: negl %edi
|
|
; X64-AVX2-NEXT: vmovd %edi, %xmm1
|
|
; X64-AVX2-NEXT: vpbroadcastd %xmm1, %xmm1
|
|
; X64-AVX2-NEXT: vpand %xmm1, %xmm0, %xmm0
|
|
; X64-AVX2-NEXT: vmovq %xmm0, %rax
|
|
; X64-AVX2-NEXT: vpextrq $1, %xmm0, %rdx
|
|
; X64-AVX2-NEXT: retq
|
|
;
|
|
; AVX512F-LABEL: PR196493:
|
|
; AVX512F: # %bb.0:
|
|
; AVX512F-NEXT: vmovdqa (%rcx), %xmm0
|
|
; AVX512F-NEXT: andb $1, %dil
|
|
; AVX512F-NEXT: negb %dil
|
|
; AVX512F-NEXT: kmovw %edi, %k1
|
|
; AVX512F-NEXT: vmovdqa32 %zmm0, %zmm0 {%k1} {z}
|
|
; AVX512F-NEXT: vmovq %xmm0, %rax
|
|
; AVX512F-NEXT: vpextrq $1, %xmm0, %rdx
|
|
; AVX512F-NEXT: retq
|
|
;
|
|
; AVX512VL-LABEL: PR196493:
|
|
; AVX512VL: # %bb.0:
|
|
; AVX512VL-NEXT: andb $1, %dil
|
|
; AVX512VL-NEXT: negb %dil
|
|
; AVX512VL-NEXT: kmovd %edi, %k1
|
|
; AVX512VL-NEXT: vmovdqa32 (%rcx), %xmm0 {%k1} {z}
|
|
; AVX512VL-NEXT: vmovq %xmm0, %rax
|
|
; AVX512VL-NEXT: vpextrq $1, %xmm0, %rdx
|
|
; AVX512VL-NEXT: retq
|
|
%b = load i128, ptr %m
|
|
%sel = select i1 %c, i128 %b, i128 0
|
|
ret i128 %sel
|
|
}
|
|
;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:
|
|
; AVX: {{.*}}
|
|
; AVX1: {{.*}}
|
|
; AVX2: {{.*}}
|
|
; SSE: {{.*}}
|
|
; SSE2: {{.*}}
|
|
; SSE4: {{.*}}
|
|
; X64-AVX: {{.*}}
|
|
; X64-SSE: {{.*}}
|
|
; X86-AVX: {{.*}}
|
|
; X86-SSE: {{.*}}
|