[llvm-branch-commits] [llvm] release/23.x: [X86] Fix constant vector i64 signed div/rem on 32-bit targets (#229244) (PR #233358)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Mon Oct 19 00:29:12 PDT 2026


https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/233358

Backport e3e894a951586e653dd7910cad39804cb30ce9fd

Requested by: @nikic

>From 5ed26a03fb5510d51d703b83c3d97e970d0fca6f Mon Sep 17 00:00:00 2001
From: Rito Takeuchi <licht-t at outlook.jp>
Date: Wed, 7 Oct 2026 01:40:08 +0900
Subject: [PATCH] [X86] Fix constant vector i64 signed div/rem on 32-bit
 targets (#229244)

Only mark v4i64 and v8i64 [SU]MUL_LOHI as Custom in 64-bit mode. Their
custom lowering unrolls to scalar i64 operations, whose results cannot
be expanded by the type legalizer on 32-bit targets.

Add crash regression coverage for signed division and remainder by
positive and negative constants with AVX2, AVX512F, and AVX512DQ+VL.

Fixes #228656

(cherry picked from commit e3e894a951586e653dd7910cad39804cb30ce9fd)
---
 llvm/lib/Target/X86/X86ISelLowering.cpp       |   15 +-
 .../CodeGen/X86/vector-i64-div-rem-32bit.ll   | 1593 +++++++++++++++++
 2 files changed, 1603 insertions(+), 5 deletions(-)
 create mode 100644 llvm/test/CodeGen/X86/vector-i64-div-rem-32bit.ll

diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 6e367a94cd9bc..e4d4da09ce9b7 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -1754,9 +1754,12 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
     if (HasInt256) {
       setOperationAction(ISD::MULHU, MVT::v4i64, Custom);
       // Custom so the combiner keeps full products as [SU]MUL_LOHI, not
-      // MULH[SU].
-      setOperationAction(ISD::UMUL_LOHI, MVT::v4i64, Custom);
-      setOperationAction(ISD::SMUL_LOHI, MVT::v4i64, Custom);
+      // MULH[SU]. The custom lowering unrolls to scalar i64 [SU]MUL_LOHI,
+      // which is only legalizable when i64 is a legal type.
+      if (Subtarget.is64Bit()) {
+        setOperationAction(ISD::UMUL_LOHI, MVT::v4i64, Custom);
+        setOperationAction(ISD::SMUL_LOHI, MVT::v4i64, Custom);
+      }
       setOperationAction(ISD::VSELECT, MVT::v32i8, Legal);
 
       // Custom legalize 2x32 to get a little better code.
@@ -2029,8 +2032,10 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
     setOperationAction(ISD::MUL, MVT::v64i8,  Custom);
 
     setOperationAction(ISD::MULHU, MVT::v8i64, Custom);
-    setOperationAction(ISD::UMUL_LOHI, MVT::v8i64, Custom);
-    setOperationAction(ISD::SMUL_LOHI, MVT::v8i64, Custom);
+    if (Subtarget.is64Bit()) {
+      setOperationAction(ISD::UMUL_LOHI, MVT::v8i64, Custom);
+      setOperationAction(ISD::SMUL_LOHI, MVT::v8i64, Custom);
+    }
     setOperationAction(ISD::MULHU, MVT::v16i32, Custom);
     setOperationAction(ISD::MULHS, MVT::v16i32, Custom);
     setOperationAction(ISD::MULHS, MVT::v32i16, HasBWI ? Legal : Custom);
diff --git a/llvm/test/CodeGen/X86/vector-i64-div-rem-32bit.ll b/llvm/test/CodeGen/X86/vector-i64-div-rem-32bit.ll
new file mode 100644
index 0000000000000..b54d5809f7aba
--- /dev/null
+++ b/llvm/test/CodeGen/X86/vector-i64-div-rem-32bit.ll
@@ -0,0 +1,1593 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -mattr=+avx2 | FileCheck %s --check-prefix=AVX2
+; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -mattr=+avx512f,-avx512dq | FileCheck %s --check-prefix=AVX512F
+; RUN: llc < %s -mtriple=i686-unknown-linux-gnu -mattr=+avx512f,+avx512dq,+avx512vl | FileCheck %s --check-prefix=AVX512DQ
+
+; Constant signed division/remainder must not unroll vector MUL_LOHI into
+; scalar i64 MUL_LOHI on 32-bit targets, where i64 is an illegal type.
+
+define <4 x i64> @sdiv_v4i64(<4 x i64> %a) nounwind {
+; AVX2-LABEL: sdiv_v4i64:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    pushl %ebp
+; AVX2-NEXT:    pushl %ebx
+; AVX2-NEXT:    pushl %edi
+; AVX2-NEXT:    pushl %esi
+; AVX2-NEXT:    subl $76, %esp
+; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, %esi
+; AVX2-NEXT:    movl %edx, %edi
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, %ebx
+; AVX2-NEXT:    movl %edx, %ebp
+; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovd %eax, %xmm0
+; AVX2-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vmovd %esi, %xmm0
+; AVX2-NEXT:    vpinsrd $1, %edi, %xmm0, %xmm0
+; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
+; AVX2-NEXT:    addl $76, %esp
+; AVX2-NEXT:    popl %esi
+; AVX2-NEXT:    popl %edi
+; AVX2-NEXT:    popl %ebx
+; AVX2-NEXT:    popl %ebp
+; AVX2-NEXT:    retl
+;
+; AVX512F-LABEL: sdiv_v4i64:
+; AVX512F:       # %bb.0:
+; AVX512F-NEXT:    pushl %ebp
+; AVX512F-NEXT:    pushl %ebx
+; AVX512F-NEXT:    pushl %edi
+; AVX512F-NEXT:    pushl %esi
+; AVX512F-NEXT:    subl $76, %esp
+; AVX512F-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, %esi
+; AVX512F-NEXT:    movl %edx, %edi
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, %ebx
+; AVX512F-NEXT:    movl %edx, %ebp
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovd %eax, %xmm0
+; AVX512F-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX512F-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vmovd %esi, %xmm0
+; AVX512F-NEXT:    vpinsrd $1, %edi, %xmm0, %xmm0
+; AVX512F-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
+; AVX512F-NEXT:    addl $76, %esp
+; AVX512F-NEXT:    popl %esi
+; AVX512F-NEXT:    popl %edi
+; AVX512F-NEXT:    popl %ebx
+; AVX512F-NEXT:    popl %ebp
+; AVX512F-NEXT:    retl
+;
+; AVX512DQ-LABEL: sdiv_v4i64:
+; AVX512DQ:       # %bb.0:
+; AVX512DQ-NEXT:    vpsraq $32, %ymm0, %ymm1
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [277094665,0,277094665,0,277094665,0,277094665,0]
+; AVX512DQ-NEXT:    vpmuldq %ymm2, %ymm1, %ymm3
+; AVX512DQ-NEXT:    vpmuludq %ymm2, %ymm0, %ymm2
+; AVX512DQ-NEXT:    vpsrlq $32, %ymm2, %ymm2
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
+; AVX512DQ-NEXT:    vpsraq $32, %ymm2, %ymm3
+; AVX512DQ-NEXT:    vpxor %xmm4, %xmm4, %xmm4
+; AVX512DQ-NEXT:    vpblendd {{.*#+}} ymm2 = ymm2[0],ymm4[1],ymm2[2],ymm4[3],ymm2[4],ymm4[5],ymm2[6],ymm4[7]
+; AVX512DQ-NEXT:    vpblendd {{.*#+}} ymm4 = ymm0[0],ymm4[1],ymm0[2],ymm4[3],ymm0[4],ymm4[5],ymm0[6],ymm4[7]
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [2216757314,4294967295,2216757314,4294967295,2216757314,4294967295,2216757314,4294967295]
+; AVX512DQ-NEXT:    vpmullq %ymm5, %ymm4, %ymm4
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
+; AVX512DQ-NEXT:    vpsraq $32, %ymm2, %ymm2
+; AVX512DQ-NEXT:    vpmuldq %ymm5, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpaddq %ymm0, %ymm1, %ymm0
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm0, %ymm0
+; AVX512DQ-NEXT:    vpsrlq $63, %ymm0, %ymm1
+; AVX512DQ-NEXT:    vpsraq $5, %ymm0, %ymm0
+; AVX512DQ-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
+; AVX512DQ-NEXT:    retl
+  %r = sdiv <4 x i64> %a, splat (i64 62)
+  ret <4 x i64> %r
+}
+
+define <4 x i64> @srem_v4i64(<4 x i64> %a) nounwind {
+; AVX2-LABEL: srem_v4i64:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    pushl %ebp
+; AVX2-NEXT:    pushl %ebx
+; AVX2-NEXT:    pushl %edi
+; AVX2-NEXT:    pushl %esi
+; AVX2-NEXT:    subl $76, %esp
+; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, %esi
+; AVX2-NEXT:    movl %edx, %edi
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, %ebx
+; AVX2-NEXT:    movl %edx, %ebp
+; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovd %eax, %xmm0
+; AVX2-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vmovd %esi, %xmm0
+; AVX2-NEXT:    vpinsrd $1, %edi, %xmm0, %xmm0
+; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
+; AVX2-NEXT:    addl $76, %esp
+; AVX2-NEXT:    popl %esi
+; AVX2-NEXT:    popl %edi
+; AVX2-NEXT:    popl %ebx
+; AVX2-NEXT:    popl %ebp
+; AVX2-NEXT:    retl
+;
+; AVX512F-LABEL: srem_v4i64:
+; AVX512F:       # %bb.0:
+; AVX512F-NEXT:    pushl %ebp
+; AVX512F-NEXT:    pushl %ebx
+; AVX512F-NEXT:    pushl %edi
+; AVX512F-NEXT:    pushl %esi
+; AVX512F-NEXT:    subl $76, %esp
+; AVX512F-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, %esi
+; AVX512F-NEXT:    movl %edx, %edi
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, %ebx
+; AVX512F-NEXT:    movl %edx, %ebp
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovd %eax, %xmm0
+; AVX512F-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX512F-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vmovd %esi, %xmm0
+; AVX512F-NEXT:    vpinsrd $1, %edi, %xmm0, %xmm0
+; AVX512F-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
+; AVX512F-NEXT:    addl $76, %esp
+; AVX512F-NEXT:    popl %esi
+; AVX512F-NEXT:    popl %edi
+; AVX512F-NEXT:    popl %ebx
+; AVX512F-NEXT:    popl %ebp
+; AVX512F-NEXT:    retl
+;
+; AVX512DQ-LABEL: srem_v4i64:
+; AVX512DQ:       # %bb.0:
+; AVX512DQ-NEXT:    vpsraq $32, %ymm0, %ymm1
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [277094665,0,277094665,0,277094665,0,277094665,0]
+; AVX512DQ-NEXT:    vpmuldq %ymm2, %ymm1, %ymm3
+; AVX512DQ-NEXT:    vpmuludq %ymm2, %ymm0, %ymm2
+; AVX512DQ-NEXT:    vpsrlq $32, %ymm2, %ymm2
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
+; AVX512DQ-NEXT:    vpsraq $32, %ymm2, %ymm3
+; AVX512DQ-NEXT:    vpxor %xmm4, %xmm4, %xmm4
+; AVX512DQ-NEXT:    vpblendd {{.*#+}} ymm2 = ymm2[0],ymm4[1],ymm2[2],ymm4[3],ymm2[4],ymm4[5],ymm2[6],ymm4[7]
+; AVX512DQ-NEXT:    vpblendd {{.*#+}} ymm4 = ymm0[0],ymm4[1],ymm0[2],ymm4[3],ymm0[4],ymm4[5],ymm0[6],ymm4[7]
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm5 = [2216757314,4294967295,2216757314,4294967295,2216757314,4294967295,2216757314,4294967295]
+; AVX512DQ-NEXT:    vpmullq %ymm5, %ymm4, %ymm4
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm4, %ymm2
+; AVX512DQ-NEXT:    vpsraq $32, %ymm2, %ymm2
+; AVX512DQ-NEXT:    vpmuldq %ymm5, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpaddq %ymm0, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpsrlq $63, %ymm1, %ymm2
+; AVX512DQ-NEXT:    vpsraq $5, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpmullq {{\.?LCPI[0-9]+_[0-9]+}}{1to4}, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
+; AVX512DQ-NEXT:    retl
+  %r = srem <4 x i64> %a, splat (i64 62)
+  ret <4 x i64> %r
+}
+
+define <8 x i64> @sdiv_v8i64(<8 x i64> %a) nounwind {
+; AVX2-LABEL: sdiv_v8i64:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    pushl %ebp
+; AVX2-NEXT:    pushl %ebx
+; AVX2-NEXT:    pushl %edi
+; AVX2-NEXT:    pushl %esi
+; AVX2-NEXT:    subl $156, %esp
+; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vextractps $1, %xmm1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm1, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, %esi
+; AVX2-NEXT:    movl %edx, %edi
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, %ebx
+; AVX2-NEXT:    movl %edx, %ebp
+; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    vmovd %eax, %xmm0
+; AVX2-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX2-NEXT:    vmovd %esi, %xmm1
+; AVX2-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
+; AVX2-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX2-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX2-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    # xmm2 = mem[0],zero,zero,zero
+; AVX2-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    vmovdqa %xmm2, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm2 # 32-byte Reload
+; AVX2-NEXT:    vextractps $3, %xmm2, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm2, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
+; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Folded Reload
+; AVX2-NEXT:    # xmm0 = mem[0],zero,zero,zero
+; AVX2-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm0, %xmm0 # 4-byte Folded Reload
+; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm1 # 16-byte Folded Reload
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    addl $156, %esp
+; AVX2-NEXT:    popl %esi
+; AVX2-NEXT:    popl %edi
+; AVX2-NEXT:    popl %ebx
+; AVX2-NEXT:    popl %ebp
+; AVX2-NEXT:    retl
+;
+; AVX512F-LABEL: sdiv_v8i64:
+; AVX512F:       # %bb.0:
+; AVX512F-NEXT:    pushl %ebp
+; AVX512F-NEXT:    pushl %ebx
+; AVX512F-NEXT:    pushl %edi
+; AVX512F-NEXT:    pushl %esi
+; AVX512F-NEXT:    subl $188, %esp
+; AVX512F-NEXT:    vmovups %zmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 64-byte Spill
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload
+; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload
+; AVX512F-NEXT:    vextractf32x4 $2, %zmm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, %esi
+; AVX512F-NEXT:    movl %edx, %edi
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload
+; AVX512F-NEXT:    vextractf32x4 $3, %zmm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, %ebx
+; AVX512F-NEXT:    movl %edx, %ebp
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    vmovd %eax, %xmm0
+; AVX512F-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX512F-NEXT:    vmovd %esi, %xmm1
+; AVX512F-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
+; AVX512F-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX512F-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX512F-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    # xmm2 = mem[0],zero,zero,zero
+; AVX512F-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    vmovdqa %xmm2, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm2 # 64-byte Reload
+; AVX512F-NEXT:    vextractps $3, %xmm2, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm2, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
+; AVX512F-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX512F-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Folded Reload
+; AVX512F-NEXT:    # xmm0 = mem[0],zero,zero,zero
+; AVX512F-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm0, %xmm0 # 4-byte Folded Reload
+; AVX512F-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
+; AVX512F-NEXT:    vinserti64x4 $1, {{[-0-9]+}}(%e{{[sb]}}p), %zmm0, %zmm0 # 32-byte Folded Reload
+; AVX512F-NEXT:    addl $188, %esp
+; AVX512F-NEXT:    popl %esi
+; AVX512F-NEXT:    popl %edi
+; AVX512F-NEXT:    popl %ebx
+; AVX512F-NEXT:    popl %ebp
+; AVX512F-NEXT:    retl
+;
+; AVX512DQ-LABEL: sdiv_v8i64:
+; AVX512DQ:       # %bb.0:
+; AVX512DQ-NEXT:    vpsraq $32, %zmm0, %zmm1
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [277094665,0,277094665,0,277094665,0,277094665,0,277094665,0,277094665,0,277094665,0,277094665,0]
+; AVX512DQ-NEXT:    vpmuldq %zmm2, %zmm1, %zmm3
+; AVX512DQ-NEXT:    vpmuludq %zmm2, %zmm0, %zmm2
+; AVX512DQ-NEXT:    vpsrlq $32, %zmm2, %zmm2
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
+; AVX512DQ-NEXT:    vpsraq $32, %zmm2, %zmm3
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} zmm4 = [4294967295,0,4294967295,0,4294967295,0,4294967295,0,4294967295,0,4294967295,0,4294967295,0,4294967295,0]
+; AVX512DQ-NEXT:    vpandq %zmm4, %zmm2, %zmm2
+; AVX512DQ-NEXT:    vpandq %zmm4, %zmm0, %zmm4
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} zmm5 = [2216757314,4294967295,2216757314,4294967295,2216757314,4294967295,2216757314,4294967295,2216757314,4294967295,2216757314,4294967295,2216757314,4294967295,2216757314,4294967295]
+; AVX512DQ-NEXT:    vpmullq %zmm5, %zmm4, %zmm4
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm4, %zmm2
+; AVX512DQ-NEXT:    vpsraq $32, %zmm2, %zmm2
+; AVX512DQ-NEXT:    vpmuldq %zmm5, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpaddq %zmm3, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpaddq %zmm0, %zmm1, %zmm0
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm0, %zmm0
+; AVX512DQ-NEXT:    vpsrlq $63, %zmm0, %zmm1
+; AVX512DQ-NEXT:    vpsraq $5, %zmm0, %zmm0
+; AVX512DQ-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
+; AVX512DQ-NEXT:    retl
+  %r = sdiv <8 x i64> %a, splat (i64 62)
+  ret <8 x i64> %r
+}
+
+define <8 x i64> @srem_v8i64(<8 x i64> %a) nounwind {
+; AVX2-LABEL: srem_v8i64:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    pushl %ebp
+; AVX2-NEXT:    pushl %ebx
+; AVX2-NEXT:    pushl %edi
+; AVX2-NEXT:    pushl %esi
+; AVX2-NEXT:    subl $156, %esp
+; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vextractps $1, %xmm1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm1, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, %esi
+; AVX2-NEXT:    movl %edx, %edi
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, %ebx
+; AVX2-NEXT:    movl %edx, %ebp
+; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    vmovd %eax, %xmm0
+; AVX2-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX2-NEXT:    vmovd %esi, %xmm1
+; AVX2-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
+; AVX2-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX2-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX2-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    # xmm2 = mem[0],zero,zero,zero
+; AVX2-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    vmovdqa %xmm2, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm2 # 32-byte Reload
+; AVX2-NEXT:    vextractps $3, %xmm2, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm2, (%esp)
+; AVX2-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
+; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Folded Reload
+; AVX2-NEXT:    # xmm0 = mem[0],zero,zero,zero
+; AVX2-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm0, %xmm0 # 4-byte Folded Reload
+; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm1 # 16-byte Folded Reload
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    addl $156, %esp
+; AVX2-NEXT:    popl %esi
+; AVX2-NEXT:    popl %edi
+; AVX2-NEXT:    popl %ebx
+; AVX2-NEXT:    popl %ebp
+; AVX2-NEXT:    retl
+;
+; AVX512F-LABEL: srem_v8i64:
+; AVX512F:       # %bb.0:
+; AVX512F-NEXT:    pushl %ebp
+; AVX512F-NEXT:    pushl %ebx
+; AVX512F-NEXT:    pushl %edi
+; AVX512F-NEXT:    pushl %esi
+; AVX512F-NEXT:    subl $188, %esp
+; AVX512F-NEXT:    vmovups %zmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 64-byte Spill
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload
+; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload
+; AVX512F-NEXT:    vextractf32x4 $2, %zmm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, %esi
+; AVX512F-NEXT:    movl %edx, %edi
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload
+; AVX512F-NEXT:    vextractf32x4 $3, %zmm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, %ebx
+; AVX512F-NEXT:    movl %edx, %ebp
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    vmovd %eax, %xmm0
+; AVX512F-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX512F-NEXT:    vmovd %esi, %xmm1
+; AVX512F-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
+; AVX512F-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX512F-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX512F-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    # xmm2 = mem[0],zero,zero,zero
+; AVX512F-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    vmovdqa %xmm2, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm2 # 64-byte Reload
+; AVX512F-NEXT:    vextractps $3, %xmm2, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm2, (%esp)
+; AVX512F-NEXT:    movl $0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
+; AVX512F-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX512F-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Folded Reload
+; AVX512F-NEXT:    # xmm0 = mem[0],zero,zero,zero
+; AVX512F-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm0, %xmm0 # 4-byte Folded Reload
+; AVX512F-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
+; AVX512F-NEXT:    vinserti64x4 $1, {{[-0-9]+}}(%e{{[sb]}}p), %zmm0, %zmm0 # 32-byte Folded Reload
+; AVX512F-NEXT:    addl $188, %esp
+; AVX512F-NEXT:    popl %esi
+; AVX512F-NEXT:    popl %edi
+; AVX512F-NEXT:    popl %ebx
+; AVX512F-NEXT:    popl %ebp
+; AVX512F-NEXT:    retl
+;
+; AVX512DQ-LABEL: srem_v8i64:
+; AVX512DQ:       # %bb.0:
+; AVX512DQ-NEXT:    vpsraq $32, %zmm0, %zmm1
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [277094665,0,277094665,0,277094665,0,277094665,0,277094665,0,277094665,0,277094665,0,277094665,0]
+; AVX512DQ-NEXT:    vpmuldq %zmm2, %zmm1, %zmm3
+; AVX512DQ-NEXT:    vpmuludq %zmm2, %zmm0, %zmm2
+; AVX512DQ-NEXT:    vpsrlq $32, %zmm2, %zmm2
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
+; AVX512DQ-NEXT:    vpsraq $32, %zmm2, %zmm3
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} zmm4 = [4294967295,0,4294967295,0,4294967295,0,4294967295,0,4294967295,0,4294967295,0,4294967295,0,4294967295,0]
+; AVX512DQ-NEXT:    vpandq %zmm4, %zmm2, %zmm2
+; AVX512DQ-NEXT:    vpandq %zmm4, %zmm0, %zmm4
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} zmm5 = [2216757314,4294967295,2216757314,4294967295,2216757314,4294967295,2216757314,4294967295,2216757314,4294967295,2216757314,4294967295,2216757314,4294967295,2216757314,4294967295]
+; AVX512DQ-NEXT:    vpmullq %zmm5, %zmm4, %zmm4
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm4, %zmm2
+; AVX512DQ-NEXT:    vpsraq $32, %zmm2, %zmm2
+; AVX512DQ-NEXT:    vpmuldq %zmm5, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpaddq %zmm3, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpaddq %zmm0, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpsrlq $63, %zmm1, %zmm2
+; AVX512DQ-NEXT:    vpsraq $5, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpmullq {{\.?LCPI[0-9]+_[0-9]+}}{1to8}, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpsubq %zmm1, %zmm0, %zmm0
+; AVX512DQ-NEXT:    retl
+  %r = srem <8 x i64> %a, splat (i64 62)
+  ret <8 x i64> %r
+}
+
+define <4 x i64> @sdiv_v4i64_negative(<4 x i64> %a) nounwind {
+; AVX2-LABEL: sdiv_v4i64_negative:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    pushl %ebp
+; AVX2-NEXT:    pushl %ebx
+; AVX2-NEXT:    pushl %edi
+; AVX2-NEXT:    pushl %esi
+; AVX2-NEXT:    subl $76, %esp
+; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, %esi
+; AVX2-NEXT:    movl %edx, %edi
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, %ebx
+; AVX2-NEXT:    movl %edx, %ebp
+; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovd %eax, %xmm0
+; AVX2-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vmovd %esi, %xmm0
+; AVX2-NEXT:    vpinsrd $1, %edi, %xmm0, %xmm0
+; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
+; AVX2-NEXT:    addl $76, %esp
+; AVX2-NEXT:    popl %esi
+; AVX2-NEXT:    popl %edi
+; AVX2-NEXT:    popl %ebx
+; AVX2-NEXT:    popl %ebp
+; AVX2-NEXT:    retl
+;
+; AVX512F-LABEL: sdiv_v4i64_negative:
+; AVX512F:       # %bb.0:
+; AVX512F-NEXT:    pushl %ebp
+; AVX512F-NEXT:    pushl %ebx
+; AVX512F-NEXT:    pushl %edi
+; AVX512F-NEXT:    pushl %esi
+; AVX512F-NEXT:    subl $76, %esp
+; AVX512F-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, %esi
+; AVX512F-NEXT:    movl %edx, %edi
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, %ebx
+; AVX512F-NEXT:    movl %edx, %ebp
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovd %eax, %xmm0
+; AVX512F-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX512F-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vmovd %esi, %xmm0
+; AVX512F-NEXT:    vpinsrd $1, %edi, %xmm0, %xmm0
+; AVX512F-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
+; AVX512F-NEXT:    addl $76, %esp
+; AVX512F-NEXT:    popl %esi
+; AVX512F-NEXT:    popl %edi
+; AVX512F-NEXT:    popl %ebx
+; AVX512F-NEXT:    popl %ebp
+; AVX512F-NEXT:    retl
+;
+; AVX512DQ-LABEL: sdiv_v4i64_negative:
+; AVX512DQ:       # %bb.0:
+; AVX512DQ-NEXT:    vpsraq $32, %ymm0, %ymm1
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4017872631,0,4017872631,0,4017872631,0,4017872631,0]
+; AVX512DQ-NEXT:    vpmullq %ymm2, %ymm1, %ymm3
+; AVX512DQ-NEXT:    vpmuludq %ymm2, %ymm0, %ymm2
+; AVX512DQ-NEXT:    vpsrlq $32, %ymm2, %ymm2
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
+; AVX512DQ-NEXT:    vpsraq $32, %ymm2, %ymm3
+; AVX512DQ-NEXT:    vpxor %xmm4, %xmm4, %xmm4
+; AVX512DQ-NEXT:    vpblendd {{.*#+}} ymm2 = ymm2[0],ymm4[1],ymm2[2],ymm4[3],ymm2[4],ymm4[5],ymm2[6],ymm4[7]
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [2078209981,0,2078209981,0,2078209981,0,2078209981,0]
+; AVX512DQ-NEXT:    vpmuludq %ymm4, %ymm0, %ymm5
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm5, %ymm2
+; AVX512DQ-NEXT:    vpsraq $32, %ymm2, %ymm2
+; AVX512DQ-NEXT:    vpmuldq %ymm4, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpsubq %ymm0, %ymm1, %ymm0
+; AVX512DQ-NEXT:    vpsrlq $63, %ymm0, %ymm1
+; AVX512DQ-NEXT:    vpsraq $5, %ymm0, %ymm0
+; AVX512DQ-NEXT:    vpaddq %ymm1, %ymm0, %ymm0
+; AVX512DQ-NEXT:    retl
+  %r = sdiv <4 x i64> %a, splat (i64 -62)
+  ret <4 x i64> %r
+}
+
+define <4 x i64> @srem_v4i64_negative(<4 x i64> %a) nounwind {
+; AVX2-LABEL: srem_v4i64_negative:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    pushl %ebp
+; AVX2-NEXT:    pushl %ebx
+; AVX2-NEXT:    pushl %edi
+; AVX2-NEXT:    pushl %esi
+; AVX2-NEXT:    subl $76, %esp
+; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, %esi
+; AVX2-NEXT:    movl %edx, %edi
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, %ebx
+; AVX2-NEXT:    movl %edx, %ebp
+; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovd %eax, %xmm0
+; AVX2-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vmovd %esi, %xmm0
+; AVX2-NEXT:    vpinsrd $1, %edi, %xmm0, %xmm0
+; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
+; AVX2-NEXT:    addl $76, %esp
+; AVX2-NEXT:    popl %esi
+; AVX2-NEXT:    popl %edi
+; AVX2-NEXT:    popl %ebx
+; AVX2-NEXT:    popl %ebp
+; AVX2-NEXT:    retl
+;
+; AVX512F-LABEL: srem_v4i64_negative:
+; AVX512F:       # %bb.0:
+; AVX512F-NEXT:    pushl %ebp
+; AVX512F-NEXT:    pushl %ebx
+; AVX512F-NEXT:    pushl %edi
+; AVX512F-NEXT:    pushl %esi
+; AVX512F-NEXT:    subl $76, %esp
+; AVX512F-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, %esi
+; AVX512F-NEXT:    movl %edx, %edi
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, %ebx
+; AVX512F-NEXT:    movl %edx, %ebp
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovd %eax, %xmm0
+; AVX512F-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX512F-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vmovd %esi, %xmm0
+; AVX512F-NEXT:    vpinsrd $1, %edi, %xmm0, %xmm0
+; AVX512F-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
+; AVX512F-NEXT:    addl $76, %esp
+; AVX512F-NEXT:    popl %esi
+; AVX512F-NEXT:    popl %edi
+; AVX512F-NEXT:    popl %ebx
+; AVX512F-NEXT:    popl %ebp
+; AVX512F-NEXT:    retl
+;
+; AVX512DQ-LABEL: srem_v4i64_negative:
+; AVX512DQ:       # %bb.0:
+; AVX512DQ-NEXT:    vpsraq $32, %ymm0, %ymm1
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm2 = [4017872631,0,4017872631,0,4017872631,0,4017872631,0]
+; AVX512DQ-NEXT:    vpmullq %ymm2, %ymm1, %ymm3
+; AVX512DQ-NEXT:    vpmuludq %ymm2, %ymm0, %ymm2
+; AVX512DQ-NEXT:    vpsrlq $32, %ymm2, %ymm2
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm3, %ymm2
+; AVX512DQ-NEXT:    vpsraq $32, %ymm2, %ymm3
+; AVX512DQ-NEXT:    vpxor %xmm4, %xmm4, %xmm4
+; AVX512DQ-NEXT:    vpblendd {{.*#+}} ymm2 = ymm2[0],ymm4[1],ymm2[2],ymm4[3],ymm2[4],ymm4[5],ymm2[6],ymm4[7]
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} ymm4 = [2078209981,0,2078209981,0,2078209981,0,2078209981,0]
+; AVX512DQ-NEXT:    vpmuludq %ymm4, %ymm0, %ymm5
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm5, %ymm2
+; AVX512DQ-NEXT:    vpsraq $32, %ymm2, %ymm2
+; AVX512DQ-NEXT:    vpmuldq %ymm4, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpaddq %ymm3, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpsubq %ymm0, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpsrlq $63, %ymm1, %ymm2
+; AVX512DQ-NEXT:    vpsraq $5, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpaddq %ymm2, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpmullq {{\.?LCPI[0-9]+_[0-9]+}}{1to4}, %ymm1, %ymm1
+; AVX512DQ-NEXT:    vpsubq %ymm1, %ymm0, %ymm0
+; AVX512DQ-NEXT:    retl
+  %r = srem <4 x i64> %a, splat (i64 -62)
+  ret <4 x i64> %r
+}
+
+define <8 x i64> @sdiv_v8i64_negative(<8 x i64> %a) nounwind {
+; AVX2-LABEL: sdiv_v8i64_negative:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    pushl %ebp
+; AVX2-NEXT:    pushl %ebx
+; AVX2-NEXT:    pushl %edi
+; AVX2-NEXT:    pushl %esi
+; AVX2-NEXT:    subl $156, %esp
+; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vextractps $1, %xmm1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm1, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, %esi
+; AVX2-NEXT:    movl %edx, %edi
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    movl %eax, %ebx
+; AVX2-NEXT:    movl %edx, %ebp
+; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    vmovd %eax, %xmm0
+; AVX2-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX2-NEXT:    vmovd %esi, %xmm1
+; AVX2-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
+; AVX2-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX2-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX2-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    # xmm2 = mem[0],zero,zero,zero
+; AVX2-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    vmovdqa %xmm2, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm2 # 32-byte Reload
+; AVX2-NEXT:    vextractps $3, %xmm2, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm2, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
+; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Folded Reload
+; AVX2-NEXT:    # xmm0 = mem[0],zero,zero,zero
+; AVX2-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm0, %xmm0 # 4-byte Folded Reload
+; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __divdi3
+; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm1 # 16-byte Folded Reload
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    addl $156, %esp
+; AVX2-NEXT:    popl %esi
+; AVX2-NEXT:    popl %edi
+; AVX2-NEXT:    popl %ebx
+; AVX2-NEXT:    popl %ebp
+; AVX2-NEXT:    retl
+;
+; AVX512F-LABEL: sdiv_v8i64_negative:
+; AVX512F:       # %bb.0:
+; AVX512F-NEXT:    pushl %ebp
+; AVX512F-NEXT:    pushl %ebx
+; AVX512F-NEXT:    pushl %edi
+; AVX512F-NEXT:    pushl %esi
+; AVX512F-NEXT:    subl $188, %esp
+; AVX512F-NEXT:    vmovups %zmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 64-byte Spill
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload
+; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload
+; AVX512F-NEXT:    vextractf32x4 $2, %zmm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, %esi
+; AVX512F-NEXT:    movl %edx, %edi
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload
+; AVX512F-NEXT:    vextractf32x4 $3, %zmm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    movl %eax, %ebx
+; AVX512F-NEXT:    movl %edx, %ebp
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    vmovd %eax, %xmm0
+; AVX512F-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX512F-NEXT:    vmovd %esi, %xmm1
+; AVX512F-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
+; AVX512F-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX512F-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX512F-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    # xmm2 = mem[0],zero,zero,zero
+; AVX512F-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    vmovdqa %xmm2, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm2 # 64-byte Reload
+; AVX512F-NEXT:    vextractps $3, %xmm2, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm2, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
+; AVX512F-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX512F-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Folded Reload
+; AVX512F-NEXT:    # xmm0 = mem[0],zero,zero,zero
+; AVX512F-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm0, %xmm0 # 4-byte Folded Reload
+; AVX512F-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __divdi3
+; AVX512F-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
+; AVX512F-NEXT:    vinserti64x4 $1, {{[-0-9]+}}(%e{{[sb]}}p), %zmm0, %zmm0 # 32-byte Folded Reload
+; AVX512F-NEXT:    addl $188, %esp
+; AVX512F-NEXT:    popl %esi
+; AVX512F-NEXT:    popl %edi
+; AVX512F-NEXT:    popl %ebx
+; AVX512F-NEXT:    popl %ebp
+; AVX512F-NEXT:    retl
+;
+; AVX512DQ-LABEL: sdiv_v8i64_negative:
+; AVX512DQ:       # %bb.0:
+; AVX512DQ-NEXT:    vpsraq $32, %zmm0, %zmm1
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [4017872631,0,4017872631,0,4017872631,0,4017872631,0,4017872631,0,4017872631,0,4017872631,0,4017872631,0]
+; AVX512DQ-NEXT:    vpmullq %zmm2, %zmm1, %zmm3
+; AVX512DQ-NEXT:    vpmuludq %zmm2, %zmm0, %zmm2
+; AVX512DQ-NEXT:    vpsrlq $32, %zmm2, %zmm2
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
+; AVX512DQ-NEXT:    vpsraq $32, %zmm2, %zmm3
+; AVX512DQ-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}{1to8}, %zmm2, %zmm2
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} zmm4 = [2078209981,0,2078209981,0,2078209981,0,2078209981,0,2078209981,0,2078209981,0,2078209981,0,2078209981,0]
+; AVX512DQ-NEXT:    vpmuludq %zmm4, %zmm0, %zmm5
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm5, %zmm2
+; AVX512DQ-NEXT:    vpsraq $32, %zmm2, %zmm2
+; AVX512DQ-NEXT:    vpmuldq %zmm4, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpaddq %zmm3, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpsubq %zmm0, %zmm1, %zmm0
+; AVX512DQ-NEXT:    vpsrlq $63, %zmm0, %zmm1
+; AVX512DQ-NEXT:    vpsraq $5, %zmm0, %zmm0
+; AVX512DQ-NEXT:    vpaddq %zmm1, %zmm0, %zmm0
+; AVX512DQ-NEXT:    retl
+  %r = sdiv <8 x i64> %a, splat (i64 -62)
+  ret <8 x i64> %r
+}
+
+define <8 x i64> @srem_v8i64_negative(<8 x i64> %a) nounwind {
+; AVX2-LABEL: srem_v8i64_negative:
+; AVX2:       # %bb.0:
+; AVX2-NEXT:    pushl %ebp
+; AVX2-NEXT:    pushl %ebx
+; AVX2-NEXT:    pushl %edi
+; AVX2-NEXT:    pushl %esi
+; AVX2-NEXT:    subl $156, %esp
+; AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vmovups %ymm1, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vextractps $1, %xmm1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm1, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, %esi
+; AVX2-NEXT:    movl %edx, %edi
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    movl %eax, %ebx
+; AVX2-NEXT:    movl %edx, %ebp
+; AVX2-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vmovss %xmm0, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    vmovd %eax, %xmm0
+; AVX2-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX2-NEXT:    vmovd %esi, %xmm1
+; AVX2-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
+; AVX2-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX2-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX2-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    # xmm2 = mem[0],zero,zero,zero
+; AVX2-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX2-NEXT:    vmovdqa %xmm2, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm2 # 32-byte Reload
+; AVX2-NEXT:    vextractps $3, %xmm2, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vextractps $2, %xmm2, (%esp)
+; AVX2-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX2-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
+; AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX2-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Folded Reload
+; AVX2-NEXT:    # xmm0 = mem[0],zero,zero,zero
+; AVX2-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm0, %xmm0 # 4-byte Folded Reload
+; AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX2-NEXT:    vzeroupper
+; AVX2-NEXT:    calll __moddi3
+; AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX2-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX2-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX2-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm1 # 16-byte Folded Reload
+; AVX2-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %ymm0 # 32-byte Reload
+; AVX2-NEXT:    addl $156, %esp
+; AVX2-NEXT:    popl %esi
+; AVX2-NEXT:    popl %edi
+; AVX2-NEXT:    popl %ebx
+; AVX2-NEXT:    popl %ebp
+; AVX2-NEXT:    retl
+;
+; AVX512F-LABEL: srem_v8i64_negative:
+; AVX512F:       # %bb.0:
+; AVX512F-NEXT:    pushl %ebp
+; AVX512F-NEXT:    pushl %ebx
+; AVX512F-NEXT:    pushl %edi
+; AVX512F-NEXT:    pushl %esi
+; AVX512F-NEXT:    subl $188, %esp
+; AVX512F-NEXT:    vmovups %zmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 64-byte Spill
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload
+; AVX512F-NEXT:    vextractf128 $1, %ymm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload
+; AVX512F-NEXT:    vextractf32x4 $2, %zmm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, %esi
+; AVX512F-NEXT:    movl %edx, %edi
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm0 # 64-byte Reload
+; AVX512F-NEXT:    vextractf32x4 $3, %zmm0, %xmm0
+; AVX512F-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vextractps $3, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    movl %eax, %ebx
+; AVX512F-NEXT:    movl %edx, %ebp
+; AVX512F-NEXT:    vmovaps {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vextractps $1, %xmm0, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vmovss %xmm0, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    vmovd %eax, %xmm0
+; AVX512F-NEXT:    vpinsrd $1, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $2, %ebx, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %ebp, %xmm0, %xmm0
+; AVX512F-NEXT:    vmovd %esi, %xmm1
+; AVX512F-NEXT:    vpinsrd $1, %edi, %xmm1, %xmm1
+; AVX512F-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX512F-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm1, %xmm1 # 4-byte Folded Reload
+; AVX512F-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    # xmm2 = mem[0],zero,zero,zero
+; AVX512F-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    vpinsrd $2, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    vpinsrd $3, {{[-0-9]+}}(%e{{[sb]}}p), %xmm2, %xmm2 # 4-byte Folded Reload
+; AVX512F-NEXT:    vmovdqa %xmm2, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vmovups {{[-0-9]+}}(%e{{[sb]}}p), %zmm2 # 64-byte Reload
+; AVX512F-NEXT:    vextractps $3, %xmm2, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vextractps $2, %xmm2, (%esp)
+; AVX512F-NEXT:    movl $-1, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    movl $-62, {{[0-9]+}}(%esp)
+; AVX512F-NEXT:    vinserti128 $1, %xmm0, %ymm1, %ymm0
+; AVX512F-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%e{{[sb]}}p) # 32-byte Spill
+; AVX512F-NEXT:    vmovd {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Folded Reload
+; AVX512F-NEXT:    # xmm0 = mem[0],zero,zero,zero
+; AVX512F-NEXT:    vpinsrd $1, {{[-0-9]+}}(%e{{[sb]}}p), %xmm0, %xmm0 # 4-byte Folded Reload
+; AVX512F-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 16-byte Spill
+; AVX512F-NEXT:    vzeroupper
+; AVX512F-NEXT:    calll __moddi3
+; AVX512F-NEXT:    vmovdqa {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 16-byte Reload
+; AVX512F-NEXT:    vpinsrd $2, %eax, %xmm0, %xmm0
+; AVX512F-NEXT:    vpinsrd $3, %edx, %xmm0, %xmm0
+; AVX512F-NEXT:    vinserti128 $1, {{[-0-9]+}}(%e{{[sb]}}p), %ymm0, %ymm0 # 16-byte Folded Reload
+; AVX512F-NEXT:    vinserti64x4 $1, {{[-0-9]+}}(%e{{[sb]}}p), %zmm0, %zmm0 # 32-byte Folded Reload
+; AVX512F-NEXT:    addl $188, %esp
+; AVX512F-NEXT:    popl %esi
+; AVX512F-NEXT:    popl %edi
+; AVX512F-NEXT:    popl %ebx
+; AVX512F-NEXT:    popl %ebp
+; AVX512F-NEXT:    retl
+;
+; AVX512DQ-LABEL: srem_v8i64_negative:
+; AVX512DQ:       # %bb.0:
+; AVX512DQ-NEXT:    vpsraq $32, %zmm0, %zmm1
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} zmm2 = [4017872631,0,4017872631,0,4017872631,0,4017872631,0,4017872631,0,4017872631,0,4017872631,0,4017872631,0]
+; AVX512DQ-NEXT:    vpmullq %zmm2, %zmm1, %zmm3
+; AVX512DQ-NEXT:    vpmuludq %zmm2, %zmm0, %zmm2
+; AVX512DQ-NEXT:    vpsrlq $32, %zmm2, %zmm2
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm3, %zmm2
+; AVX512DQ-NEXT:    vpsraq $32, %zmm2, %zmm3
+; AVX512DQ-NEXT:    vpandq {{\.?LCPI[0-9]+_[0-9]+}}{1to8}, %zmm2, %zmm2
+; AVX512DQ-NEXT:    vpbroadcastq {{.*#+}} zmm4 = [2078209981,0,2078209981,0,2078209981,0,2078209981,0,2078209981,0,2078209981,0,2078209981,0,2078209981,0]
+; AVX512DQ-NEXT:    vpmuludq %zmm4, %zmm0, %zmm5
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm5, %zmm2
+; AVX512DQ-NEXT:    vpsraq $32, %zmm2, %zmm2
+; AVX512DQ-NEXT:    vpmuldq %zmm4, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpaddq %zmm3, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpsubq %zmm0, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpsrlq $63, %zmm1, %zmm2
+; AVX512DQ-NEXT:    vpsraq $5, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpaddq %zmm2, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpmullq {{\.?LCPI[0-9]+_[0-9]+}}{1to8}, %zmm1, %zmm1
+; AVX512DQ-NEXT:    vpsubq %zmm1, %zmm0, %zmm0
+; AVX512DQ-NEXT:    retl
+  %r = srem <8 x i64> %a, splat (i64 -62)
+  ret <8 x i64> %r
+}



More information about the llvm-branch-commits mailing list