[llvm] [DAGCombiner][LegalizeTypes] Fuse i128 sdiv+srem / udiv+urem into single __divmodti4 / __udivmodti4 call (PR #187908)
Takashi Idobe via llvm-commits
llvm-commits at lists.llvm.org
Fri May 1 06:04:51 PDT 2026
https://github.com/Takashiidobe updated https://github.com/llvm/llvm-project/pull/187908
>From 5d4d2bfa78d64afa6d20b439442788850713d807 Mon Sep 17 00:00:00 2001
From: Takashiidobe <idobetakashi at gmail.com>
Date: Fri, 1 May 2026 07:55:53 -0400
Subject: [PATCH 1/2] add i128 divrem libcall tests
---
.../CodeGen/AArch64/i128-divrem-libcall.ll | 286 +
llvm/test/CodeGen/ARM/i128-divrem-libcall.ll | 2418 ++++++++
.../CodeGen/LoongArch/i128-divrem-libcall.ll | 132 +
.../CodeGen/PowerPC/i128-divrem-libcall.ll | 136 +
.../CodeGen/RISCV/i128-divrem-libcall-rv32.ll | 4935 +++++++++++++++++
.../CodeGen/RISCV/i128-divrem-libcall-rv64.ll | 149 +
.../test/CodeGen/SPARC/i128-divrem-libcall.ll | 68 +
.../CodeGen/SystemZ/i128-divrem-libcall.ll | 114 +
.../WebAssembly/i128-divrem-libcall.ll | 197 +
.../CodeGen/X86/i128-divrem-libcall-x86-32.ll | 3079 ++++++++++
.../CodeGen/X86/i128-divrem-libcall-x86-64.ll | 598 ++
11 files changed, 12112 insertions(+)
create mode 100644 llvm/test/CodeGen/AArch64/i128-divrem-libcall.ll
create mode 100644 llvm/test/CodeGen/ARM/i128-divrem-libcall.ll
create mode 100644 llvm/test/CodeGen/LoongArch/i128-divrem-libcall.ll
create mode 100644 llvm/test/CodeGen/PowerPC/i128-divrem-libcall.ll
create mode 100644 llvm/test/CodeGen/RISCV/i128-divrem-libcall-rv32.ll
create mode 100644 llvm/test/CodeGen/RISCV/i128-divrem-libcall-rv64.ll
create mode 100644 llvm/test/CodeGen/SPARC/i128-divrem-libcall.ll
create mode 100644 llvm/test/CodeGen/SystemZ/i128-divrem-libcall.ll
create mode 100644 llvm/test/CodeGen/WebAssembly/i128-divrem-libcall.ll
create mode 100644 llvm/test/CodeGen/X86/i128-divrem-libcall-x86-32.ll
create mode 100644 llvm/test/CodeGen/X86/i128-divrem-libcall-x86-64.ll
diff --git a/llvm/test/CodeGen/AArch64/i128-divrem-libcall.ll b/llvm/test/CodeGen/AArch64/i128-divrem-libcall.ll
new file mode 100644
index 0000000000000..21ca0e76a37dc
--- /dev/null
+++ b/llvm/test/CodeGen/AArch64/i128-divrem-libcall.ll
@@ -0,0 +1,286 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=aarch64-linux-gnu | FileCheck %s --check-prefix=LINUX-A64
+; RUN: llc < %s -mtriple=arm64-apple-macosx | FileCheck %s --check-prefix=DARWIN-A64
+; RUN: llc < %s -mtriple=arm64_32-apple-watchos | FileCheck %s --check-prefix=WATCHOS
+
+define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; LINUX-A64-LABEL: sdivrem_i128:
+; LINUX-A64: // %bb.0:
+; LINUX-A64-NEXT: str x30, [sp, #-80]! // 8-byte Folded Spill
+; LINUX-A64-NEXT: stp x26, x25, [sp, #16] // 16-byte Folded Spill
+; LINUX-A64-NEXT: stp x24, x23, [sp, #32] // 16-byte Folded Spill
+; LINUX-A64-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill
+; LINUX-A64-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill
+; LINUX-A64-NEXT: .cfi_def_cfa_offset 80
+; LINUX-A64-NEXT: .cfi_offset w19, -8
+; LINUX-A64-NEXT: .cfi_offset w20, -16
+; LINUX-A64-NEXT: .cfi_offset w21, -24
+; LINUX-A64-NEXT: .cfi_offset w22, -32
+; LINUX-A64-NEXT: .cfi_offset w23, -40
+; LINUX-A64-NEXT: .cfi_offset w24, -48
+; LINUX-A64-NEXT: .cfi_offset w25, -56
+; LINUX-A64-NEXT: .cfi_offset w26, -64
+; LINUX-A64-NEXT: .cfi_offset w30, -80
+; LINUX-A64-NEXT: mov x21, x3
+; LINUX-A64-NEXT: mov x22, x2
+; LINUX-A64-NEXT: mov x23, x1
+; LINUX-A64-NEXT: mov x24, x0
+; LINUX-A64-NEXT: mov x0, x2
+; LINUX-A64-NEXT: mov x1, x3
+; LINUX-A64-NEXT: mov x2, x4
+; LINUX-A64-NEXT: mov x3, x5
+; LINUX-A64-NEXT: mov x19, x5
+; LINUX-A64-NEXT: mov x20, x4
+; LINUX-A64-NEXT: bl __divti3
+; LINUX-A64-NEXT: mov x25, x0
+; LINUX-A64-NEXT: mov x26, x1
+; LINUX-A64-NEXT: mov x0, x22
+; LINUX-A64-NEXT: mov x1, x21
+; LINUX-A64-NEXT: mov x2, x20
+; LINUX-A64-NEXT: mov x3, x19
+; LINUX-A64-NEXT: bl __modti3
+; LINUX-A64-NEXT: stp x25, x26, [x24]
+; LINUX-A64-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload
+; LINUX-A64-NEXT: stp x0, x1, [x23]
+; LINUX-A64-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload
+; LINUX-A64-NEXT: ldp x24, x23, [sp, #32] // 16-byte Folded Reload
+; LINUX-A64-NEXT: ldp x26, x25, [sp, #16] // 16-byte Folded Reload
+; LINUX-A64-NEXT: ldr x30, [sp], #80 // 8-byte Folded Reload
+; LINUX-A64-NEXT: ret
+;
+; DARWIN-A64-LABEL: sdivrem_i128:
+; DARWIN-A64: ; %bb.0:
+; DARWIN-A64-NEXT: stp x26, x25, [sp, #-80]! ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: stp x24, x23, [sp, #16] ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: stp x22, x21, [sp, #32] ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: stp x20, x19, [sp, #48] ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: stp x29, x30, [sp, #64] ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: .cfi_def_cfa_offset 80
+; DARWIN-A64-NEXT: .cfi_offset w30, -8
+; DARWIN-A64-NEXT: .cfi_offset w29, -16
+; DARWIN-A64-NEXT: .cfi_offset w19, -24
+; DARWIN-A64-NEXT: .cfi_offset w20, -32
+; DARWIN-A64-NEXT: .cfi_offset w21, -40
+; DARWIN-A64-NEXT: .cfi_offset w22, -48
+; DARWIN-A64-NEXT: .cfi_offset w23, -56
+; DARWIN-A64-NEXT: .cfi_offset w24, -64
+; DARWIN-A64-NEXT: .cfi_offset w25, -72
+; DARWIN-A64-NEXT: .cfi_offset w26, -80
+; DARWIN-A64-NEXT: mov x21, x3
+; DARWIN-A64-NEXT: mov x22, x2
+; DARWIN-A64-NEXT: mov x23, x1
+; DARWIN-A64-NEXT: mov x24, x0
+; DARWIN-A64-NEXT: mov x0, x2
+; DARWIN-A64-NEXT: mov x1, x3
+; DARWIN-A64-NEXT: mov x2, x4
+; DARWIN-A64-NEXT: mov x3, x5
+; DARWIN-A64-NEXT: mov x19, x5
+; DARWIN-A64-NEXT: mov x20, x4
+; DARWIN-A64-NEXT: bl ___divti3
+; DARWIN-A64-NEXT: mov x25, x0
+; DARWIN-A64-NEXT: mov x26, x1
+; DARWIN-A64-NEXT: mov x0, x22
+; DARWIN-A64-NEXT: mov x1, x21
+; DARWIN-A64-NEXT: mov x2, x20
+; DARWIN-A64-NEXT: mov x3, x19
+; DARWIN-A64-NEXT: bl ___modti3
+; DARWIN-A64-NEXT: stp x25, x26, [x24]
+; DARWIN-A64-NEXT: ldp x29, x30, [sp, #64] ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: stp x0, x1, [x23]
+; DARWIN-A64-NEXT: ldp x20, x19, [sp, #48] ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: ldp x22, x21, [sp, #32] ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: ldp x24, x23, [sp, #16] ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: ldp x26, x25, [sp], #80 ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: ret
+;
+; WATCHOS-LABEL: sdivrem_i128:
+; WATCHOS: ; %bb.0:
+; WATCHOS-NEXT: stp x26, x25, [sp, #-80]! ; 16-byte Folded Spill
+; WATCHOS-NEXT: stp x24, x23, [sp, #16] ; 16-byte Folded Spill
+; WATCHOS-NEXT: stp x22, x21, [sp, #32] ; 16-byte Folded Spill
+; WATCHOS-NEXT: stp x20, x19, [sp, #48] ; 16-byte Folded Spill
+; WATCHOS-NEXT: stp x29, x30, [sp, #64] ; 16-byte Folded Spill
+; WATCHOS-NEXT: .cfi_def_cfa_offset 80
+; WATCHOS-NEXT: .cfi_offset w30, -8
+; WATCHOS-NEXT: .cfi_offset w29, -16
+; WATCHOS-NEXT: .cfi_offset w19, -24
+; WATCHOS-NEXT: .cfi_offset w20, -32
+; WATCHOS-NEXT: .cfi_offset w21, -40
+; WATCHOS-NEXT: .cfi_offset w22, -48
+; WATCHOS-NEXT: .cfi_offset w23, -56
+; WATCHOS-NEXT: .cfi_offset w24, -64
+; WATCHOS-NEXT: .cfi_offset w25, -72
+; WATCHOS-NEXT: .cfi_offset w26, -80
+; WATCHOS-NEXT: mov x21, x3
+; WATCHOS-NEXT: mov x22, x2
+; WATCHOS-NEXT: mov x23, x1
+; WATCHOS-NEXT: mov x24, x0
+; WATCHOS-NEXT: mov x0, x2
+; WATCHOS-NEXT: mov x1, x3
+; WATCHOS-NEXT: mov x2, x4
+; WATCHOS-NEXT: mov x3, x5
+; WATCHOS-NEXT: mov x19, x5
+; WATCHOS-NEXT: mov x20, x4
+; WATCHOS-NEXT: bl ___divti3
+; WATCHOS-NEXT: mov x25, x0
+; WATCHOS-NEXT: mov x26, x1
+; WATCHOS-NEXT: mov x0, x22
+; WATCHOS-NEXT: mov x1, x21
+; WATCHOS-NEXT: mov x2, x20
+; WATCHOS-NEXT: mov x3, x19
+; WATCHOS-NEXT: bl ___modti3
+; WATCHOS-NEXT: stp x25, x26, [x24]
+; WATCHOS-NEXT: ldp x29, x30, [sp, #64] ; 16-byte Folded Reload
+; WATCHOS-NEXT: stp x0, x1, [x23]
+; WATCHOS-NEXT: ldp x20, x19, [sp, #48] ; 16-byte Folded Reload
+; WATCHOS-NEXT: ldp x22, x21, [sp, #32] ; 16-byte Folded Reload
+; WATCHOS-NEXT: ldp x24, x23, [sp, #16] ; 16-byte Folded Reload
+; WATCHOS-NEXT: ldp x26, x25, [sp], #80 ; 16-byte Folded Reload
+; WATCHOS-NEXT: ret
+ %q = sdiv i128 %n, %d
+ %r = srem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
+
+define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; LINUX-A64-LABEL: udivrem_i128:
+; LINUX-A64: // %bb.0:
+; LINUX-A64-NEXT: str x30, [sp, #-80]! // 8-byte Folded Spill
+; LINUX-A64-NEXT: stp x26, x25, [sp, #16] // 16-byte Folded Spill
+; LINUX-A64-NEXT: stp x24, x23, [sp, #32] // 16-byte Folded Spill
+; LINUX-A64-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill
+; LINUX-A64-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill
+; LINUX-A64-NEXT: .cfi_def_cfa_offset 80
+; LINUX-A64-NEXT: .cfi_offset w19, -8
+; LINUX-A64-NEXT: .cfi_offset w20, -16
+; LINUX-A64-NEXT: .cfi_offset w21, -24
+; LINUX-A64-NEXT: .cfi_offset w22, -32
+; LINUX-A64-NEXT: .cfi_offset w23, -40
+; LINUX-A64-NEXT: .cfi_offset w24, -48
+; LINUX-A64-NEXT: .cfi_offset w25, -56
+; LINUX-A64-NEXT: .cfi_offset w26, -64
+; LINUX-A64-NEXT: .cfi_offset w30, -80
+; LINUX-A64-NEXT: mov x21, x3
+; LINUX-A64-NEXT: mov x22, x2
+; LINUX-A64-NEXT: mov x23, x1
+; LINUX-A64-NEXT: mov x24, x0
+; LINUX-A64-NEXT: mov x0, x2
+; LINUX-A64-NEXT: mov x1, x3
+; LINUX-A64-NEXT: mov x2, x4
+; LINUX-A64-NEXT: mov x3, x5
+; LINUX-A64-NEXT: mov x19, x5
+; LINUX-A64-NEXT: mov x20, x4
+; LINUX-A64-NEXT: bl __udivti3
+; LINUX-A64-NEXT: mov x25, x0
+; LINUX-A64-NEXT: mov x26, x1
+; LINUX-A64-NEXT: mov x0, x22
+; LINUX-A64-NEXT: mov x1, x21
+; LINUX-A64-NEXT: mov x2, x20
+; LINUX-A64-NEXT: mov x3, x19
+; LINUX-A64-NEXT: bl __umodti3
+; LINUX-A64-NEXT: stp x25, x26, [x24]
+; LINUX-A64-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload
+; LINUX-A64-NEXT: stp x0, x1, [x23]
+; LINUX-A64-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload
+; LINUX-A64-NEXT: ldp x24, x23, [sp, #32] // 16-byte Folded Reload
+; LINUX-A64-NEXT: ldp x26, x25, [sp, #16] // 16-byte Folded Reload
+; LINUX-A64-NEXT: ldr x30, [sp], #80 // 8-byte Folded Reload
+; LINUX-A64-NEXT: ret
+;
+; DARWIN-A64-LABEL: udivrem_i128:
+; DARWIN-A64: ; %bb.0:
+; DARWIN-A64-NEXT: stp x26, x25, [sp, #-80]! ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: stp x24, x23, [sp, #16] ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: stp x22, x21, [sp, #32] ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: stp x20, x19, [sp, #48] ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: stp x29, x30, [sp, #64] ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: .cfi_def_cfa_offset 80
+; DARWIN-A64-NEXT: .cfi_offset w30, -8
+; DARWIN-A64-NEXT: .cfi_offset w29, -16
+; DARWIN-A64-NEXT: .cfi_offset w19, -24
+; DARWIN-A64-NEXT: .cfi_offset w20, -32
+; DARWIN-A64-NEXT: .cfi_offset w21, -40
+; DARWIN-A64-NEXT: .cfi_offset w22, -48
+; DARWIN-A64-NEXT: .cfi_offset w23, -56
+; DARWIN-A64-NEXT: .cfi_offset w24, -64
+; DARWIN-A64-NEXT: .cfi_offset w25, -72
+; DARWIN-A64-NEXT: .cfi_offset w26, -80
+; DARWIN-A64-NEXT: mov x21, x3
+; DARWIN-A64-NEXT: mov x22, x2
+; DARWIN-A64-NEXT: mov x23, x1
+; DARWIN-A64-NEXT: mov x24, x0
+; DARWIN-A64-NEXT: mov x0, x2
+; DARWIN-A64-NEXT: mov x1, x3
+; DARWIN-A64-NEXT: mov x2, x4
+; DARWIN-A64-NEXT: mov x3, x5
+; DARWIN-A64-NEXT: mov x19, x5
+; DARWIN-A64-NEXT: mov x20, x4
+; DARWIN-A64-NEXT: bl ___udivti3
+; DARWIN-A64-NEXT: mov x25, x0
+; DARWIN-A64-NEXT: mov x26, x1
+; DARWIN-A64-NEXT: mov x0, x22
+; DARWIN-A64-NEXT: mov x1, x21
+; DARWIN-A64-NEXT: mov x2, x20
+; DARWIN-A64-NEXT: mov x3, x19
+; DARWIN-A64-NEXT: bl ___umodti3
+; DARWIN-A64-NEXT: stp x25, x26, [x24]
+; DARWIN-A64-NEXT: ldp x29, x30, [sp, #64] ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: stp x0, x1, [x23]
+; DARWIN-A64-NEXT: ldp x20, x19, [sp, #48] ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: ldp x22, x21, [sp, #32] ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: ldp x24, x23, [sp, #16] ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: ldp x26, x25, [sp], #80 ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: ret
+;
+; WATCHOS-LABEL: udivrem_i128:
+; WATCHOS: ; %bb.0:
+; WATCHOS-NEXT: stp x26, x25, [sp, #-80]! ; 16-byte Folded Spill
+; WATCHOS-NEXT: stp x24, x23, [sp, #16] ; 16-byte Folded Spill
+; WATCHOS-NEXT: stp x22, x21, [sp, #32] ; 16-byte Folded Spill
+; WATCHOS-NEXT: stp x20, x19, [sp, #48] ; 16-byte Folded Spill
+; WATCHOS-NEXT: stp x29, x30, [sp, #64] ; 16-byte Folded Spill
+; WATCHOS-NEXT: .cfi_def_cfa_offset 80
+; WATCHOS-NEXT: .cfi_offset w30, -8
+; WATCHOS-NEXT: .cfi_offset w29, -16
+; WATCHOS-NEXT: .cfi_offset w19, -24
+; WATCHOS-NEXT: .cfi_offset w20, -32
+; WATCHOS-NEXT: .cfi_offset w21, -40
+; WATCHOS-NEXT: .cfi_offset w22, -48
+; WATCHOS-NEXT: .cfi_offset w23, -56
+; WATCHOS-NEXT: .cfi_offset w24, -64
+; WATCHOS-NEXT: .cfi_offset w25, -72
+; WATCHOS-NEXT: .cfi_offset w26, -80
+; WATCHOS-NEXT: mov x21, x3
+; WATCHOS-NEXT: mov x22, x2
+; WATCHOS-NEXT: mov x23, x1
+; WATCHOS-NEXT: mov x24, x0
+; WATCHOS-NEXT: mov x0, x2
+; WATCHOS-NEXT: mov x1, x3
+; WATCHOS-NEXT: mov x2, x4
+; WATCHOS-NEXT: mov x3, x5
+; WATCHOS-NEXT: mov x19, x5
+; WATCHOS-NEXT: mov x20, x4
+; WATCHOS-NEXT: bl ___udivti3
+; WATCHOS-NEXT: mov x25, x0
+; WATCHOS-NEXT: mov x26, x1
+; WATCHOS-NEXT: mov x0, x22
+; WATCHOS-NEXT: mov x1, x21
+; WATCHOS-NEXT: mov x2, x20
+; WATCHOS-NEXT: mov x3, x19
+; WATCHOS-NEXT: bl ___umodti3
+; WATCHOS-NEXT: stp x25, x26, [x24]
+; WATCHOS-NEXT: ldp x29, x30, [sp, #64] ; 16-byte Folded Reload
+; WATCHOS-NEXT: stp x0, x1, [x23]
+; WATCHOS-NEXT: ldp x20, x19, [sp, #48] ; 16-byte Folded Reload
+; WATCHOS-NEXT: ldp x22, x21, [sp, #32] ; 16-byte Folded Reload
+; WATCHOS-NEXT: ldp x24, x23, [sp, #16] ; 16-byte Folded Reload
+; WATCHOS-NEXT: ldp x26, x25, [sp], #80 ; 16-byte Folded Reload
+; WATCHOS-NEXT: ret
+ %q = udiv i128 %n, %d
+ %r = urem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
diff --git a/llvm/test/CodeGen/ARM/i128-divrem-libcall.ll b/llvm/test/CodeGen/ARM/i128-divrem-libcall.ll
new file mode 100644
index 0000000000000..106b37e78b2c6
--- /dev/null
+++ b/llvm/test/CodeGen/ARM/i128-divrem-libcall.ll
@@ -0,0 +1,2418 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=armv6-linux-gnueabihf | FileCheck %s --check-prefix=ARMV6
+; RUN: llc < %s -mtriple=armv7-linux-gnueabi | FileCheck %s --check-prefix=ARMV7
+; RUN: llc < %s -mtriple=armv7-none-eabi | FileCheck %s --check-prefix=ARMV7
+
+; These 32-bit ARM triples inline-expand i128 div/rem. Keep the checks minimal:
+; verify that no libcalls are emitted and that the function reaches its
+; epilogue.
+
+define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; ARMV6-LABEL: sdivrem_i128:
+; ARMV6: @ %bb.0: @ %_udiv-special-cases_udiv-special-cases
+; ARMV6-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; ARMV6-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; ARMV6-NEXT: .pad #252
+; ARMV6-NEXT: sub sp, sp, #252
+; ARMV6-NEXT: ldr r10, [sp, #292]
+; ARMV6-NEXT: str r1, [sp, #44] @ 4-byte Spill
+; ARMV6-NEXT: str r0, [sp, #40] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #288]
+; ARMV6-NEXT: eor r1, r3, r10, asr #31
+; ARMV6-NEXT: eor r3, r2, r10, asr #31
+; ARMV6-NEXT: eor r2, r10, r10, asr #31
+; ARMV6-NEXT: subs r8, r3, r10, asr #31
+; ARMV6-NEXT: eor r0, r0, r10, asr #31
+; ARMV6-NEXT: sbcs r9, r1, r10, asr #31
+; ARMV6-NEXT: str r0, [sp, #36] @ 4-byte Spill
+; ARMV6-NEXT: sbcs lr, r0, r10, asr #31
+; ARMV6-NEXT: str r1, [sp, #32] @ 4-byte Spill
+; ARMV6-NEXT: sbc r11, r2, r10, asr #31
+; ARMV6-NEXT: clz r0, lr
+; ARMV6-NEXT: clz r1, r8
+; ARMV6-NEXT: add r0, r0, #32
+; ARMV6-NEXT: cmp r11, #0
+; ARMV6-NEXT: add r1, r1, #32
+; ARMV6-NEXT: clzne r0, r11
+; ARMV6-NEXT: cmp r9, #0
+; ARMV6-NEXT: str r2, [sp, #28] @ 4-byte Spill
+; ARMV6-NEXT: clzne r1, r9
+; ARMV6-NEXT: orrs r2, lr, r11
+; ARMV6-NEXT: ldr r6, [sp, #308]
+; ARMV6-NEXT: addeq r0, r1, #64
+; ARMV6-NEXT: ldr r1, [sp, #304]
+; ARMV6-NEXT: str r3, [sp, #24] @ 4-byte Spill
+; ARMV6-NEXT: eor r2, r1, r6, asr #31
+; ARMV6-NEXT: ldr r1, [sp, #300]
+; ARMV6-NEXT: str r2, [sp, #20] @ 4-byte Spill
+; ARMV6-NEXT: eor r3, r1, r6, asr #31
+; ARMV6-NEXT: ldr r1, [sp, #296]
+; ARMV6-NEXT: str r3, [sp, #52] @ 4-byte Spill
+; ARMV6-NEXT: eor r7, r1, r6, asr #31
+; ARMV6-NEXT: str r7, [sp, #48] @ 4-byte Spill
+; ARMV6-NEXT: subs r7, r7, r6, asr #31
+; ARMV6-NEXT: eor r1, r6, r6, asr #31
+; ARMV6-NEXT: sbcs r5, r3, r6, asr #31
+; ARMV6-NEXT: str r1, [sp, #16] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r4, r2, r6, asr #31
+; ARMV6-NEXT: clz r2, r7
+; ARMV6-NEXT: sbc r12, r1, r6, asr #31
+; ARMV6-NEXT: clz r1, r4
+; ARMV6-NEXT: add r1, r1, #32
+; ARMV6-NEXT: cmp r12, #0
+; ARMV6-NEXT: clzne r1, r12
+; ARMV6-NEXT: add r2, r2, #32
+; ARMV6-NEXT: cmp r5, #0
+; ARMV6-NEXT: str r5, [sp, #80] @ 4-byte Spill
+; ARMV6-NEXT: clzne r2, r5
+; ARMV6-NEXT: orrs r3, r4, r12
+; ARMV6-NEXT: addeq r1, r2, #64
+; ARMV6-NEXT: mov r2, #0
+; ARMV6-NEXT: subs r0, r1, r0
+; ARMV6-NEXT: str r0, [sp, #104] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r1, r2, #0
+; ARMV6-NEXT: str r1, [sp, #100] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r3, r2, #0
+; ARMV6-NEXT: str r3, [sp, #112] @ 4-byte Spill
+; ARMV6-NEXT: sbc r2, r2, #0
+; ARMV6-NEXT: rsbs r0, r0, #127
+; ARMV6-NEXT: rscs r0, r1, #0
+; ARMV6-NEXT: str r2, [sp, #108] @ 4-byte Spill
+; ARMV6-NEXT: rscs r0, r3, #0
+; ARMV6-NEXT: orr r1, r9, r11
+; ARMV6-NEXT: rscs r0, r2, #0
+; ARMV6-NEXT: orr r2, r8, lr
+; ARMV6-NEXT: orr r1, r2, r1
+; ARMV6-NEXT: orr r2, r5, r12
+; ARMV6-NEXT: orr r3, r7, r4
+; ARMV6-NEXT: clz r1, r1
+; ARMV6-NEXT: orr r2, r3, r2
+; ARMV6-NEXT: mov r0, #0
+; ARMV6-NEXT: clz r2, r2
+; ARMV6-NEXT: lsr r1, r1, #5
+; ARMV6-NEXT: movlo r0, #1
+; ARMV6-NEXT: str r4, [sp, #76] @ 4-byte Spill
+; ARMV6-NEXT: lsr r2, r2, #5
+; ARMV6-NEXT: orr r1, r2, r1
+; ARMV6-NEXT: orrs r0, r1, r0
+; ARMV6-NEXT: mov r3, r11
+; ARMV6-NEXT: mov r4, lr
+; ARMV6-NEXT: mov r5, r9
+; ARMV6-NEXT: mov r1, r8
+; ARMV6-NEXT: movne r3, #0
+; ARMV6-NEXT: movne r4, #0
+; ARMV6-NEXT: movne r5, #0
+; ARMV6-NEXT: movne r8, #0
+; ARMV6-NEXT: str r7, [sp, #84] @ 4-byte Spill
+; ARMV6-NEXT: asr r7, r6, #31
+; ARMV6-NEXT: eor r0, r7, r10, asr #31
+; ARMV6-NEXT: str r12, [sp, #72] @ 4-byte Spill
+; ARMV6-NEXT: str r0, [sp, #12] @ 4-byte Spill
+; ARMV6-NEXT: bne .LBB0_6
+; ARMV6-NEXT: @ %bb.1: @ %_udiv-special-cases_udiv-special-cases
+; ARMV6-NEXT: ldr r0, [sp, #104] @ 4-byte Reload
+; ARMV6-NEXT: ldr r10, [sp, #100] @ 4-byte Reload
+; ARMV6-NEXT: eor r7, r0, #127
+; ARMV6-NEXT: ldr r0, [sp, #112] @ 4-byte Reload
+; ARMV6-NEXT: orr r7, r7, r0
+; ARMV6-NEXT: ldr r0, [sp, #108] @ 4-byte Reload
+; ARMV6-NEXT: orr r6, r10, r0
+; ARMV6-NEXT: ldr r0, [sp, #52] @ 4-byte Reload
+; ARMV6-NEXT: orrs r7, r7, r6
+; ARMV6-NEXT: ldr r6, [sp, #48] @ 4-byte Reload
+; ARMV6-NEXT: beq .LBB0_7
+; ARMV6-NEXT: @ %bb.2: @ %udiv-bb15
+; ARMV6-NEXT: mov r5, #0
+; ARMV6-NEXT: mov r2, r9
+; ARMV6-NEXT: str r1, [sp, #232]
+; ARMV6-NEXT: add r3, sp, #216
+; ARMV6-NEXT: str r5, [sp, #228]
+; ARMV6-NEXT: mov r9, r1
+; ARMV6-NEXT: str r5, [sp, #224]
+; ARMV6-NEXT: mov r1, #12
+; ARMV6-NEXT: str r5, [sp, #220]
+; ARMV6-NEXT: mov r8, r2
+; ARMV6-NEXT: str r5, [sp, #216]
+; ARMV6-NEXT: add r3, r3, #16
+; ARMV6-NEXT: str r2, [sp, #236]
+; ARMV6-NEXT: str lr, [sp, #240]
+; ARMV6-NEXT: str r11, [sp, #244]
+; ARMV6-NEXT: ldr r4, [sp, #104] @ 4-byte Reload
+; ARMV6-NEXT: rsb r0, r4, #127
+; ARMV6-NEXT: and r2, r1, r0, lsr #3
+; ARMV6-NEXT: and r0, r0, #31
+; ARMV6-NEXT: eor r12, r0, #31
+; ARMV6-NEXT: ldr r2, [r3, -r2]!
+; ARMV6-NEXT: ldr r6, [r3, #8]
+; ARMV6-NEXT: ldr r7, [r3, #4]
+; ARMV6-NEXT: ldr r3, [r3, #12]
+; ARMV6-NEXT: lsr r1, r6, #1
+; ARMV6-NEXT: lsl r3, r3, r0
+; ARMV6-NEXT: orr r1, r3, r1, lsr r12
+; ARMV6-NEXT: str r1, [sp, #116] @ 4-byte Spill
+; ARMV6-NEXT: lsl r1, r6, r0
+; ARMV6-NEXT: lsrs r3, r7, #1
+; ARMV6-NEXT: lsr r6, r2, #1
+; ARMV6-NEXT: orr r1, r1, r3, lsr r12
+; ARMV6-NEXT: str r1, [sp, #92] @ 4-byte Spill
+; ARMV6-NEXT: lsl r1, r7, r0
+; ARMV6-NEXT: lsl r0, r2, r0
+; ARMV6-NEXT: adds r7, r4, #1
+; ARMV6-NEXT: str r0, [sp, #96] @ 4-byte Spill
+; ARMV6-NEXT: adcs r0, r10, #0
+; ARMV6-NEXT: str r0, [sp, #100] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #112] @ 4-byte Reload
+; ARMV6-NEXT: orr r1, r1, r6, lsr r12
+; ARMV6-NEXT: str r1, [sp, #88] @ 4-byte Spill
+; ARMV6-NEXT: adcs r12, r0, #0
+; ARMV6-NEXT: ldr r0, [sp, #108] @ 4-byte Reload
+; ARMV6-NEXT: adcs r0, r0, #0
+; ARMV6-NEXT: str r0, [sp, #104] @ 4-byte Spill
+; ARMV6-NEXT: adcs r0, r5, #0
+; ARMV6-NEXT: bne .LBB0_14
+; ARMV6-NEXT: @ %bb.3: @ %udiv-preheader4
+; ARMV6-NEXT: str r9, [sp, #184]
+; ARMV6-NEXT: mov r0, #12
+; ARMV6-NEXT: and r1, r0, r7, lsr #3
+; ARMV6-NEXT: add r9, sp, #184
+; ARMV6-NEXT: add r0, r9, r1
+; ARMV6-NEXT: str r5, [sp, #212]
+; ARMV6-NEXT: str r5, [sp, #208]
+; ARMV6-NEXT: and r4, r7, #31
+; ARMV6-NEXT: str r11, [sp, #196]
+; ARMV6-NEXT: eor r11, r4, #31
+; ARMV6-NEXT: str r5, [sp, #204]
+; ARMV6-NEXT: mov r6, #0
+; ARMV6-NEXT: str r5, [sp, #200]
+; ARMV6-NEXT: str r8, [sp, #188]
+; ARMV6-NEXT: str lr, [sp, #192]
+; ARMV6-NEXT: ldr r5, [r0, #4]
+; ARMV6-NEXT: ldr r2, [r0, #8]
+; ARMV6-NEXT: ldr r3, [r0, #12]
+; ARMV6-NEXT: str r7, [sp, #112] @ 4-byte Spill
+; ARMV6-NEXT: ldr r1, [r9, r1]
+; ARMV6-NEXT: lsr r0, r2, r4
+; ARMV6-NEXT: lsl r7, r3, #1
+; ARMV6-NEXT: orr r0, r0, r7, lsl r11
+; ARMV6-NEXT: lsr r7, r5, r4
+; ARMV6-NEXT: lsl r5, r5, #1
+; ARMV6-NEXT: lsl r2, r2, #1
+; ARMV6-NEXT: lsr r1, r1, r4
+; ARMV6-NEXT: orr r8, r1, r5, lsl r11
+; ARMV6-NEXT: ldr r1, [sp, #84] @ 4-byte Reload
+; ARMV6-NEXT: orr r2, r7, r2, lsl r11
+; ARMV6-NEXT: ldr r11, [sp, #116] @ 4-byte Reload
+; ARMV6-NEXT: subs r1, r1, #1
+; ARMV6-NEXT: str r1, [sp, #68] @ 4-byte Spill
+; ARMV6-NEXT: ldr r1, [sp, #80] @ 4-byte Reload
+; ARMV6-NEXT: ldr lr, [sp, #100] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r1, r1, #0
+; ARMV6-NEXT: str r1, [sp, #64] @ 4-byte Spill
+; ARMV6-NEXT: ldr r1, [sp, #76] @ 4-byte Reload
+; ARMV6-NEXT: ldr r7, [sp, #96] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r1, r1, #0
+; ARMV6-NEXT: str r1, [sp, #60] @ 4-byte Spill
+; ARMV6-NEXT: ldr r1, [sp, #72] @ 4-byte Reload
+; ARMV6-NEXT: ldr r10, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: sbc r1, r1, #0
+; ARMV6-NEXT: str r1, [sp, #56] @ 4-byte Spill
+; ARMV6-NEXT: lsr r1, r3, r4
+; ARMV6-NEXT: ldr r4, [sp, #104] @ 4-byte Reload
+; ARMV6-NEXT: ldr r9, [sp, #88] @ 4-byte Reload
+; ARMV6-NEXT: str r1, [sp, #108] @ 4-byte Spill
+; ARMV6-NEXT: mov r1, #0
+; ARMV6-NEXT: .LBB0_4: @ %udiv-do-while3
+; ARMV6-NEXT: @ =>This Inner Loop Header: Depth=1
+; ARMV6-NEXT: mov r5, r1
+; ARMV6-NEXT: ldr r1, [sp, #108] @ 4-byte Reload
+; ARMV6-NEXT: add r3, sp, #92
+; ARMV6-NEXT: str r11, [sp, #116] @ 4-byte Spill
+; ARMV6-NEXT: stm r3, {r6, r7, r9, r10} @ 16-byte Folded Spill
+; ARMV6-NEXT: lsl r7, r8, #1
+; ARMV6-NEXT: lsl r1, r1, #1
+; ARMV6-NEXT: ldr r3, [sp, #68] @ 4-byte Reload
+; ARMV6-NEXT: orr r7, r7, r11, lsr #31
+; ARMV6-NEXT: orr r1, r1, r0, lsr #31
+; ARMV6-NEXT: lsl r0, r0, #1
+; ARMV6-NEXT: subs r3, r3, r7
+; ARMV6-NEXT: orr r0, r0, r2, lsr #31
+; ARMV6-NEXT: lsl r2, r2, #1
+; ARMV6-NEXT: ldr r3, [sp, #64] @ 4-byte Reload
+; ARMV6-NEXT: orr r2, r2, r8, lsr #31
+; ARMV6-NEXT: ldr r6, [sp, #72] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r3, r3, r2
+; ARMV6-NEXT: ldr r3, [sp, #60] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r3, r3, r0
+; ARMV6-NEXT: ldr r3, [sp, #56] @ 4-byte Reload
+; ARMV6-NEXT: sbc r3, r3, r1
+; ARMV6-NEXT: and r10, r6, r3, asr #31
+; ARMV6-NEXT: ldr r6, [sp, #76] @ 4-byte Reload
+; ARMV6-NEXT: and r8, r6, r3, asr #31
+; ARMV6-NEXT: ldr r6, [sp, #80] @ 4-byte Reload
+; ARMV6-NEXT: and r9, r6, r3, asr #31
+; ARMV6-NEXT: ldr r6, [sp, #84] @ 4-byte Reload
+; ARMV6-NEXT: and r11, r6, r3, asr #31
+; ARMV6-NEXT: subs r6, r7, r11
+; ARMV6-NEXT: str r6, [sp, #88] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r2, r2, r9
+; ARMV6-NEXT: sbcs r11, r0, r8
+; ARMV6-NEXT: ldr r8, [sp, #88] @ 4-byte Reload
+; ARMV6-NEXT: sbc r0, r1, r10
+; ARMV6-NEXT: mov r1, #1
+; ARMV6-NEXT: and r6, r1, r3, asr #31
+; ARMV6-NEXT: ldr r1, [sp, #112] @ 4-byte Reload
+; ARMV6-NEXT: str r0, [sp, #108] @ 4-byte Spill
+; ARMV6-NEXT: subs r1, r1, #1
+; ARMV6-NEXT: str r1, [sp, #112] @ 4-byte Spill
+; ARMV6-NEXT: sbcs lr, lr, #0
+; ARMV6-NEXT: ldr r0, [sp, #96] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r12, r12, #0
+; ARMV6-NEXT: sbc r4, r4, #0
+; ARMV6-NEXT: orr r1, r1, r12
+; ARMV6-NEXT: orr r3, lr, r4
+; ARMV6-NEXT: orrs r1, r1, r3
+; ARMV6-NEXT: ldr r3, [sp, #100] @ 4-byte Reload
+; ARMV6-NEXT: ldr r1, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: orr r7, r1, r0, lsl #1
+; ARMV6-NEXT: lsl r1, r3, #1
+; ARMV6-NEXT: orr r1, r1, r0, lsr #31
+; ARMV6-NEXT: ldr r0, [sp, #104] @ 4-byte Reload
+; ARMV6-NEXT: orr r9, r5, r1
+; ARMV6-NEXT: lsl r1, r0, #1
+; ARMV6-NEXT: orr r1, r1, r3, lsr #31
+; ARMV6-NEXT: orr r10, r5, r1
+; ARMV6-NEXT: ldr r1, [sp, #116] @ 4-byte Reload
+; ARMV6-NEXT: lsl r1, r1, #1
+; ARMV6-NEXT: orr r1, r1, r0, lsr #31
+; ARMV6-NEXT: mov r0, r11
+; ARMV6-NEXT: orr r11, r5, r1
+; ARMV6-NEXT: mov r1, #0
+; ARMV6-NEXT: bne .LBB0_4
+; ARMV6-NEXT: .LBB0_5: @ %udiv-loop-exit2
+; ARMV6-NEXT: lsl r1, r9, #1
+; ARMV6-NEXT: orr r5, r1, r7, lsr #31
+; ARMV6-NEXT: lsl r1, r10, #1
+; ARMV6-NEXT: orr r4, r1, r9, lsr #31
+; ARMV6-NEXT: lsl r1, r11, #1
+; ARMV6-NEXT: orr r8, r6, r7, lsl #1
+; ARMV6-NEXT: orr r3, r1, r10, lsr #31
+; ARMV6-NEXT: .LBB0_6:
+; ARMV6-NEXT: ldr r0, [sp, #52] @ 4-byte Reload
+; ARMV6-NEXT: ldr r6, [sp, #48] @ 4-byte Reload
+; ARMV6-NEXT: .LBB0_7: @ %udiv-end1
+; ARMV6-NEXT: ldr r2, [sp, #292]
+; ARMV6-NEXT: ldr r1, [sp, #24] @ 4-byte Reload
+; ARMV6-NEXT: str r5, [sp, #76] @ 4-byte Spill
+; ARMV6-NEXT: subs r10, r1, r2, asr #31
+; ARMV6-NEXT: ldr r1, [sp, #32] @ 4-byte Reload
+; ARMV6-NEXT: str r3, [sp, #96] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r11, r1, r2, asr #31
+; ARMV6-NEXT: ldr r1, [sp, #36] @ 4-byte Reload
+; ARMV6-NEXT: str r8, [sp, #116] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r5, r1, r2, asr #31
+; ARMV6-NEXT: ldr r1, [sp, #28] @ 4-byte Reload
+; ARMV6-NEXT: str r4, [sp, #100] @ 4-byte Spill
+; ARMV6-NEXT: sbc r1, r1, r2, asr #31
+; ARMV6-NEXT: clz r2, r5
+; ARMV6-NEXT: add r7, r2, #32
+; ARMV6-NEXT: clz r2, r10
+; ARMV6-NEXT: cmp r1, #0
+; ARMV6-NEXT: add r2, r2, #32
+; ARMV6-NEXT: clzne r7, r1
+; ARMV6-NEXT: cmp r11, #0
+; ARMV6-NEXT: clzne r2, r11
+; ARMV6-NEXT: orrs r3, r5, r1
+; ARMV6-NEXT: addeq r7, r2, #64
+; ARMV6-NEXT: ldr r2, [sp, #308]
+; ARMV6-NEXT: ldr r3, [sp, #20] @ 4-byte Reload
+; ARMV6-NEXT: str r11, [sp, #60] @ 4-byte Spill
+; ARMV6-NEXT: subs lr, r6, r2, asr #31
+; ARMV6-NEXT: str r5, [sp, #52] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r9, r0, r2, asr #31
+; ARMV6-NEXT: ldr r0, [sp, #16] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r8, r3, r2, asr #31
+; ARMV6-NEXT: clz r3, lr
+; ARMV6-NEXT: sbc r0, r0, r2, asr #31
+; ARMV6-NEXT: clz r2, r8
+; ARMV6-NEXT: add r2, r2, #32
+; ARMV6-NEXT: cmp r0, #0
+; ARMV6-NEXT: clzne r2, r0
+; ARMV6-NEXT: add r3, r3, #32
+; ARMV6-NEXT: cmp r9, #0
+; ARMV6-NEXT: str r0, [sp, #80] @ 4-byte Spill
+; ARMV6-NEXT: clzne r3, r9
+; ARMV6-NEXT: orrs r6, r8, r0
+; ARMV6-NEXT: addeq r2, r3, #64
+; ARMV6-NEXT: mov r6, #0
+; ARMV6-NEXT: subs r2, r2, r7
+; ARMV6-NEXT: str r9, [sp, #88] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r4, r6, #0
+; ARMV6-NEXT: str r4, [sp, #108] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r7, r6, #0
+; ARMV6-NEXT: mov r12, r2
+; ARMV6-NEXT: sbc r3, r6, #0
+; ARMV6-NEXT: rsbs r2, r2, #127
+; ARMV6-NEXT: rscs r2, r4, #0
+; ARMV6-NEXT: str r3, [sp, #112] @ 4-byte Spill
+; ARMV6-NEXT: rscs r2, r7, #0
+; ARMV6-NEXT: orr r4, lr, r8
+; ARMV6-NEXT: rscs r2, r3, #0
+; ARMV6-NEXT: orr r3, r10, r5
+; ARMV6-NEXT: orr r2, r11, r1
+; ARMV6-NEXT: str r7, [sp, #104] @ 4-byte Spill
+; ARMV6-NEXT: orr r2, r3, r2
+; ARMV6-NEXT: orr r3, r9, r0
+; ARMV6-NEXT: orr r3, r4, r3
+; ARMV6-NEXT: clz r2, r2
+; ARMV6-NEXT: clz r3, r3
+; ARMV6-NEXT: ldr r7, [sp, #12] @ 4-byte Reload
+; ARMV6-NEXT: ldr r4, [sp, #116] @ 4-byte Reload
+; ARMV6-NEXT: lsr r2, r2, #5
+; ARMV6-NEXT: lsr r3, r3, #5
+; ARMV6-NEXT: ldr r0, [sp, #96] @ 4-byte Reload
+; ARMV6-NEXT: orr r2, r3, r2
+; ARMV6-NEXT: ldr r3, [sp, #76] @ 4-byte Reload
+; ARMV6-NEXT: movlo r6, #1
+; ARMV6-NEXT: eor r4, r4, r7
+; ARMV6-NEXT: orr r2, r2, r6
+; ARMV6-NEXT: eor r6, r0, r7
+; ARMV6-NEXT: ldr r0, [sp, #100] @ 4-byte Reload
+; ARMV6-NEXT: subs r4, r4, r7
+; ARMV6-NEXT: eor r3, r3, r7
+; ARMV6-NEXT: mov r9, r10
+; ARMV6-NEXT: sbcs r3, r3, r7
+; ARMV6-NEXT: eor r0, r0, r7
+; ARMV6-NEXT: sbcs r0, r0, r7
+; ARMV6-NEXT: str r0, [sp, #28] @ 4-byte Spill
+; ARMV6-NEXT: sbc r0, r6, r7
+; ARMV6-NEXT: str r0, [sp, #24] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #292]
+; ARMV6-NEXT: cmp r2, #0
+; ARMV6-NEXT: str r4, [sp, #36] @ 4-byte Spill
+; ARMV6-NEXT: mov r4, r11
+; ARMV6-NEXT: mov r10, r1
+; ARMV6-NEXT: mov r11, r5
+; ARMV6-NEXT: mov r6, r9
+; ARMV6-NEXT: str r3, [sp, #32] @ 4-byte Spill
+; ARMV6-NEXT: mov r3, r4
+; ARMV6-NEXT: asr r0, r0, #31
+; ARMV6-NEXT: movne r10, #0
+; ARMV6-NEXT: movne r11, #0
+; ARMV6-NEXT: movne r3, #0
+; ARMV6-NEXT: movne r6, #0
+; ARMV6-NEXT: str r1, [sp, #56] @ 4-byte Spill
+; ARMV6-NEXT: str r8, [sp, #84] @ 4-byte Spill
+; ARMV6-NEXT: str r0, [sp, #48] @ 4-byte Spill
+; ARMV6-NEXT: str lr, [sp, #92] @ 4-byte Spill
+; ARMV6-NEXT: bne .LBB0_13
+; ARMV6-NEXT: @ %bb.8: @ %udiv-end1
+; ARMV6-NEXT: ldr r0, [sp, #104] @ 4-byte Reload
+; ARMV6-NEXT: eor r1, r12, #127
+; ARMV6-NEXT: ldr r2, [sp, #108] @ 4-byte Reload
+; ARMV6-NEXT: orr r1, r1, r0
+; ARMV6-NEXT: ldr r0, [sp, #112] @ 4-byte Reload
+; ARMV6-NEXT: orr r5, r2, r0
+; ARMV6-NEXT: orrs r1, r1, r5
+; ARMV6-NEXT: beq .LBB0_13
+; ARMV6-NEXT: @ %bb.9: @ %udiv-bb1
+; ARMV6-NEXT: mov r10, #0
+; ARMV6-NEXT: str r9, [sp, #168]
+; ARMV6-NEXT: str r10, [sp, #164]
+; ARMV6-NEXT: add r3, sp, #152
+; ARMV6-NEXT: str r10, [sp, #160]
+; ARMV6-NEXT: mov r1, #12
+; ARMV6-NEXT: str r10, [sp, #156]
+; ARMV6-NEXT: add r3, r3, #16
+; ARMV6-NEXT: str r10, [sp, #152]
+; ARMV6-NEXT: ldr r0, [sp, #60] @ 4-byte Reload
+; ARMV6-NEXT: str r0, [sp, #172]
+; ARMV6-NEXT: ldr r8, [sp, #52] @ 4-byte Reload
+; ARMV6-NEXT: str r8, [sp, #176]
+; ARMV6-NEXT: ldr r0, [sp, #56] @ 4-byte Reload
+; ARMV6-NEXT: str r0, [sp, #180]
+; ARMV6-NEXT: rsb r0, r12, #127
+; ARMV6-NEXT: and r1, r1, r0, lsr #3
+; ARMV6-NEXT: and r0, r0, #31
+; ARMV6-NEXT: eor r2, r0, #31
+; ARMV6-NEXT: ldr r6, [r3, -r1]!
+; ARMV6-NEXT: ldmib r3, {r1, r5}
+; ARMV6-NEXT: lsr r4, r5, #1
+; ARMV6-NEXT: lsl r7, r6, r0
+; ARMV6-NEXT: ldr r3, [r3, #12]
+; ARMV6-NEXT: str r9, [sp, #8] @ 4-byte Spill
+; ARMV6-NEXT: lsl r3, r3, r0
+; ARMV6-NEXT: orr r3, r3, r4, lsr r2
+; ARMV6-NEXT: str r3, [sp, #116] @ 4-byte Spill
+; ARMV6-NEXT: lsl r3, r5, r0
+; ARMV6-NEXT: lsrs r5, r1, #1
+; ARMV6-NEXT: orr r4, r3, r5, lsr r2
+; ARMV6-NEXT: lsl r1, r1, r0
+; ARMV6-NEXT: lsr r3, r6, #1
+; ARMV6-NEXT: adds r0, r12, #1
+; ARMV6-NEXT: orr r11, r1, r3, lsr r2
+; ARMV6-NEXT: ldr r1, [sp, #108] @ 4-byte Reload
+; ARMV6-NEXT: adcs r1, r1, #0
+; ARMV6-NEXT: str r1, [sp, #100] @ 4-byte Spill
+; ARMV6-NEXT: ldr r1, [sp, #104] @ 4-byte Reload
+; ARMV6-NEXT: adcs lr, r1, #0
+; ARMV6-NEXT: ldr r1, [sp, #112] @ 4-byte Reload
+; ARMV6-NEXT: adcs r1, r1, #0
+; ARMV6-NEXT: str r1, [sp, #108] @ 4-byte Spill
+; ARMV6-NEXT: adcs r2, r10, #0
+; ARMV6-NEXT: bne .LBB0_15
+; ARMV6-NEXT: @ %bb.10: @ %udiv-preheader
+; ARMV6-NEXT: str r9, [sp, #120]
+; ARMV6-NEXT: add r9, sp, #120
+; ARMV6-NEXT: str r10, [sp, #148]
+; ARMV6-NEXT: str r10, [sp, #144]
+; ARMV6-NEXT: str r10, [sp, #140]
+; ARMV6-NEXT: str r10, [sp, #136]
+; ARMV6-NEXT: ldr r1, [sp, #60] @ 4-byte Reload
+; ARMV6-NEXT: str r8, [sp, #128]
+; ARMV6-NEXT: and r8, r0, #31
+; ARMV6-NEXT: str r1, [sp, #124]
+; ARMV6-NEXT: ldr r1, [sp, #56] @ 4-byte Reload
+; ARMV6-NEXT: str r1, [sp, #132]
+; ARMV6-NEXT: mov r1, #12
+; ARMV6-NEXT: and r2, r1, r0, lsr #3
+; ARMV6-NEXT: add r5, r9, r2
+; ARMV6-NEXT: ldmib r5, {r1, r3, r10}
+; ARMV6-NEXT: lsr r5, r3, r8
+; ARMV6-NEXT: lsl r6, r10, #1
+; ARMV6-NEXT: str r0, [sp, #112] @ 4-byte Spill
+; ARMV6-NEXT: eor r0, r8, #31
+; ARMV6-NEXT: ldr r2, [r9, r2]
+; ARMV6-NEXT: lsl r3, r3, #1
+; ARMV6-NEXT: orr r6, r5, r6, lsl r0
+; ARMV6-NEXT: lsr r5, r1, r8
+; ARMV6-NEXT: orr r12, r5, r3, lsl r0
+; ARMV6-NEXT: lsl r3, r1, #1
+; ARMV6-NEXT: lsr r10, r10, r8
+; ARMV6-NEXT: lsr r2, r2, r8
+; ARMV6-NEXT: orr r5, r2, r3, lsl r0
+; ARMV6-NEXT: ldr r0, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: mov r9, #0
+; ARMV6-NEXT: ldr r2, [sp, #80] @ 4-byte Reload
+; ARMV6-NEXT: subs r0, r0, #1
+; ARMV6-NEXT: str r0, [sp, #76] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #88] @ 4-byte Reload
+; ARMV6-NEXT: ldr r1, [sp, #116] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r0, r0, #0
+; ARMV6-NEXT: str r0, [sp, #72] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #84] @ 4-byte Reload
+; ARMV6-NEXT: ldr r8, [sp, #100] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r0, r0, #0
+; ARMV6-NEXT: str r0, [sp, #68] @ 4-byte Spill
+; ARMV6-NEXT: sbc r0, r2, #0
+; ARMV6-NEXT: str r0, [sp, #64] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #108] @ 4-byte Reload
+; ARMV6-NEXT: mov r2, #0
+; ARMV6-NEXT: .LBB0_11: @ %udiv-do-while
+; ARMV6-NEXT: @ =>This Inner Loop Header: Depth=1
+; ARMV6-NEXT: add r3, sp, #96
+; ARMV6-NEXT: str r4, [sp, #108] @ 4-byte Spill
+; ARMV6-NEXT: stm r3, {r2, r7, r11} @ 12-byte Folded Spill
+; ARMV6-NEXT: lsl r2, r10, #1
+; ARMV6-NEXT: lsl r3, r6, #1
+; ARMV6-NEXT: orr r2, r2, r6, lsr #31
+; ARMV6-NEXT: lsl r6, r12, #1
+; ARMV6-NEXT: orr r6, r6, r5, lsr #31
+; ARMV6-NEXT: lsl r5, r5, #1
+; ARMV6-NEXT: ldr r4, [sp, #76] @ 4-byte Reload
+; ARMV6-NEXT: orr r5, r5, r1, lsr #31
+; ARMV6-NEXT: orr r3, r3, r12, lsr #31
+; ARMV6-NEXT: ldr r7, [sp, #64] @ 4-byte Reload
+; ARMV6-NEXT: subs r4, r4, r5
+; ARMV6-NEXT: str r1, [sp, #116] @ 4-byte Spill
+; ARMV6-NEXT: ldr r4, [sp, #72] @ 4-byte Reload
+; ARMV6-NEXT: ldr r1, [sp, #84] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r4, r4, r6
+; ARMV6-NEXT: ldr r4, [sp, #68] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r4, r4, r3
+; ARMV6-NEXT: sbc r4, r7, r2
+; ARMV6-NEXT: ldr r7, [sp, #80] @ 4-byte Reload
+; ARMV6-NEXT: and r10, r7, r4, asr #31
+; ARMV6-NEXT: and r7, r1, r4, asr #31
+; ARMV6-NEXT: ldr r1, [sp, #88] @ 4-byte Reload
+; ARMV6-NEXT: and r11, r1, r4, asr #31
+; ARMV6-NEXT: ldr r1, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: and r12, r1, r4, asr #31
+; ARMV6-NEXT: mov r1, #1
+; ARMV6-NEXT: subs r5, r5, r12
+; ARMV6-NEXT: sbcs r12, r6, r11
+; ARMV6-NEXT: sbcs r6, r3, r7
+; ARMV6-NEXT: sbc r10, r2, r10
+; ARMV6-NEXT: and r2, r1, r4, asr #31
+; ARMV6-NEXT: ldr r1, [sp, #112] @ 4-byte Reload
+; ARMV6-NEXT: subs r1, r1, #1
+; ARMV6-NEXT: str r1, [sp, #112] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r8, r8, #0
+; ARMV6-NEXT: sbcs lr, lr, #0
+; ARMV6-NEXT: sbc r0, r0, #0
+; ARMV6-NEXT: orr r4, r1, lr
+; ARMV6-NEXT: orr r3, r8, r0
+; ARMV6-NEXT: ldr r1, [sp, #100] @ 4-byte Reload
+; ARMV6-NEXT: orrs r3, r4, r3
+; ARMV6-NEXT: ldr r3, [sp, #96] @ 4-byte Reload
+; ARMV6-NEXT: orr r7, r3, r1, lsl #1
+; ARMV6-NEXT: ldr r3, [sp, #104] @ 4-byte Reload
+; ARMV6-NEXT: lsl r4, r3, #1
+; ARMV6-NEXT: orr r1, r4, r1, lsr #31
+; ARMV6-NEXT: orr r11, r9, r1
+; ARMV6-NEXT: ldr r1, [sp, #108] @ 4-byte Reload
+; ARMV6-NEXT: lsl r4, r1, #1
+; ARMV6-NEXT: orr r4, r4, r3, lsr #31
+; ARMV6-NEXT: ldr r3, [sp, #116] @ 4-byte Reload
+; ARMV6-NEXT: orr r4, r9, r4
+; ARMV6-NEXT: lsl r3, r3, #1
+; ARMV6-NEXT: orr r3, r3, r1, lsr #31
+; ARMV6-NEXT: orr r1, r9, r3
+; ARMV6-NEXT: mov r9, #0
+; ARMV6-NEXT: bne .LBB0_11
+; ARMV6-NEXT: .LBB0_12: @ %udiv-loop-exit
+; ARMV6-NEXT: lsl r0, r11, #1
+; ARMV6-NEXT: orr r3, r0, r7, lsr #31
+; ARMV6-NEXT: lsl r0, r4, #1
+; ARMV6-NEXT: ldr r9, [sp, #8] @ 4-byte Reload
+; ARMV6-NEXT: orr r11, r0, r11, lsr #31
+; ARMV6-NEXT: lsl r0, r1, #1
+; ARMV6-NEXT: orr r6, r2, r7, lsl #1
+; ARMV6-NEXT: orr r10, r0, r4, lsr #31
+; ARMV6-NEXT: .LBB0_13: @ %udiv-end
+; ARMV6-NEXT: ldr r1, [sp, #40] @ 4-byte Reload
+; ARMV6-NEXT: mov r4, #0
+; ARMV6-NEXT: ldr r0, [sp, #36] @ 4-byte Reload
+; ARMV6-NEXT: mov r12, #0
+; ARMV6-NEXT: ldr r2, [sp, #88] @ 4-byte Reload
+; ARMV6-NEXT: str r0, [r1]
+; ARMV6-NEXT: ldr r0, [sp, #32] @ 4-byte Reload
+; ARMV6-NEXT: str r0, [r1, #4]
+; ARMV6-NEXT: ldr r0, [sp, #28] @ 4-byte Reload
+; ARMV6-NEXT: str r0, [r1, #8]
+; ARMV6-NEXT: ldr r0, [sp, #24] @ 4-byte Reload
+; ARMV6-NEXT: str r0, [r1, #12]
+; ARMV6-NEXT: ldr r0, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: ldr lr, [sp, #80] @ 4-byte Reload
+; ARMV6-NEXT: umull r1, r7, r0, r6
+; ARMV6-NEXT: umlal r7, r4, r2, r6
+; ARMV6-NEXT: str r1, [sp, #116] @ 4-byte Spill
+; ARMV6-NEXT: umull r5, r1, r0, r3
+; ARMV6-NEXT: adds r8, r5, r7
+; ARMV6-NEXT: adcs r1, r4, r1
+; ARMV6-NEXT: ldr r4, [sp, #84] @ 4-byte Reload
+; ARMV6-NEXT: adc r7, r12, #0
+; ARMV6-NEXT: umlal r1, r7, r2, r3
+; ARMV6-NEXT: umull r12, r5, r6, r4
+; ARMV6-NEXT: mla r6, r6, lr, r5
+; ARMV6-NEXT: mla r3, r3, r4, r6
+; ARMV6-NEXT: umull r6, r5, r11, r0
+; ARMV6-NEXT: mla r2, r11, r2, r5
+; ARMV6-NEXT: mla r0, r10, r0, r2
+; ARMV6-NEXT: adds r2, r6, r12
+; ARMV6-NEXT: adc r0, r0, r3
+; ARMV6-NEXT: adds r1, r1, r2
+; ARMV6-NEXT: ldr r2, [sp, #116] @ 4-byte Reload
+; ARMV6-NEXT: adc r0, r7, r0
+; ARMV6-NEXT: ldr r3, [sp, #60] @ 4-byte Reload
+; ARMV6-NEXT: subs r2, r9, r2
+; ARMV6-NEXT: ldr r7, [sp, #52] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r3, r3, r8
+; ARMV6-NEXT: sbcs r1, r7, r1
+; ARMV6-NEXT: ldr r7, [sp, #56] @ 4-byte Reload
+; ARMV6-NEXT: sbc r0, r7, r0
+; ARMV6-NEXT: ldr r7, [sp, #48] @ 4-byte Reload
+; ARMV6-NEXT: eor r2, r2, r7
+; ARMV6-NEXT: eor r3, r3, r7
+; ARMV6-NEXT: subs r2, r2, r7
+; ARMV6-NEXT: eor r1, r1, r7
+; ARMV6-NEXT: sbcs r3, r3, r7
+; ARMV6-NEXT: eor r0, r0, r7
+; ARMV6-NEXT: sbcs r1, r1, r7
+; ARMV6-NEXT: sbc r0, r0, r7
+; ARMV6-NEXT: ldr r7, [sp, #44] @ 4-byte Reload
+; ARMV6-NEXT: stm r7, {r2, r3}
+; ARMV6-NEXT: str r1, [r7, #8]
+; ARMV6-NEXT: str r0, [r7, #12]
+; ARMV6-NEXT: add sp, sp, #252
+; ARMV6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+; ARMV6-NEXT: .LBB0_14:
+; ARMV6-NEXT: ldr r11, [sp, #116] @ 4-byte Reload
+; ARMV6-NEXT: mov r6, #0
+; ARMV6-NEXT: ldr r7, [sp, #96] @ 4-byte Reload
+; ARMV6-NEXT: ldr r10, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: ldr r9, [sp, #88] @ 4-byte Reload
+; ARMV6-NEXT: b .LBB0_5
+; ARMV6-NEXT: .LBB0_15:
+; ARMV6-NEXT: ldr r1, [sp, #116] @ 4-byte Reload
+; ARMV6-NEXT: mov r2, #0
+; ARMV6-NEXT: b .LBB0_12
+;
+; ARMV7-LABEL: sdivrem_i128:
+; ARMV7: @ %bb.0: @ %_udiv-special-cases_udiv-special-cases
+; ARMV7-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; ARMV7-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; ARMV7-NEXT: .pad #244
+; ARMV7-NEXT: sub sp, sp, #244
+; ARMV7-NEXT: ldr r10, [sp, #284]
+; ARMV7-NEXT: str r0, [sp, #28] @ 4-byte Spill
+; ARMV7-NEXT: ldr r0, [sp, #280]
+; ARMV7-NEXT: eor r2, r2, r10, asr #31
+; ARMV7-NEXT: str r1, [sp, #32] @ 4-byte Spill
+; ARMV7-NEXT: eor r1, r3, r10, asr #31
+; ARMV7-NEXT: str r2, [sp, #44] @ 4-byte Spill
+; ARMV7-NEXT: subs r2, r2, r10, asr #31
+; ARMV7-NEXT: eor r0, r0, r10, asr #31
+; ARMV7-NEXT: sbcs r11, r1, r10, asr #31
+; ARMV7-NEXT: str r1, [sp, #36] @ 4-byte Spill
+; ARMV7-NEXT: eor r1, r10, r10, asr #31
+; ARMV7-NEXT: sbcs r9, r0, r10, asr #31
+; ARMV7-NEXT: sbc r12, r1, r10, asr #31
+; ARMV7-NEXT: str r0, [sp, #40] @ 4-byte Spill
+; ARMV7-NEXT: clz r0, r9
+; ARMV7-NEXT: str r1, [sp, #24] @ 4-byte Spill
+; ARMV7-NEXT: clz r1, r2
+; ARMV7-NEXT: add r0, r0, #32
+; ARMV7-NEXT: cmp r12, #0
+; ARMV7-NEXT: add r1, r1, #32
+; ARMV7-NEXT: clzne r0, r12
+; ARMV7-NEXT: cmp r11, #0
+; ARMV7-NEXT: ldr r6, [sp, #300]
+; ARMV7-NEXT: clzne r1, r11
+; ARMV7-NEXT: ldr r3, [sp, #288]
+; ARMV7-NEXT: str r2, [sp, #88] @ 4-byte Spill
+; ARMV7-NEXT: orrs r2, r9, r12
+; ARMV7-NEXT: ldr r2, [sp, #292]
+; ARMV7-NEXT: addeq r0, r1, #64
+; ARMV7-NEXT: ldr r1, [sp, #296]
+; ARMV7-NEXT: eor r3, r3, r6, asr #31
+; ARMV7-NEXT: eor r2, r2, r6, asr #31
+; ARMV7-NEXT: subs lr, r3, r6, asr #31
+; ARMV7-NEXT: eor r1, r1, r6, asr #31
+; ARMV7-NEXT: sbcs r4, r2, r6, asr #31
+; ARMV7-NEXT: str r2, [sp, #12] @ 4-byte Spill
+; ARMV7-NEXT: eor r2, r6, r6, asr #31
+; ARMV7-NEXT: sbcs r5, r1, r6, asr #31
+; ARMV7-NEXT: str r1, [sp, #48] @ 4-byte Spill
+; ARMV7-NEXT: sbc r7, r2, r6, asr #31
+; ARMV7-NEXT: clz r1, r5
+; ARMV7-NEXT: str r2, [sp, #8] @ 4-byte Spill
+; ARMV7-NEXT: clz r2, lr
+; ARMV7-NEXT: add r1, r1, #32
+; ARMV7-NEXT: cmp r7, #0
+; ARMV7-NEXT: clzne r1, r7
+; ARMV7-NEXT: add r2, r2, #32
+; ARMV7-NEXT: cmp r4, #0
+; ARMV7-NEXT: str r3, [sp, #16] @ 4-byte Spill
+; ARMV7-NEXT: clzne r2, r4
+; ARMV7-NEXT: orrs r3, r5, r7
+; ARMV7-NEXT: addeq r1, r2, #64
+; ARMV7-NEXT: str r7, [sp, #68] @ 4-byte Spill
+; ARMV7-NEXT: subs r8, r1, r0
+; ARMV7-NEXT: mov r0, #0
+; ARMV7-NEXT: sbcs r1, r0, #0
+; ARMV7-NEXT: str r1, [sp, #100] @ 4-byte Spill
+; ARMV7-NEXT: sbcs r2, r0, #0
+; ARMV7-NEXT: str r2, [sp, #96] @ 4-byte Spill
+; ARMV7-NEXT: sbc r3, r0, #0
+; ARMV7-NEXT: rsbs r0, r8, #127
+; ARMV7-NEXT: rscs r0, r1, #0
+; ARMV7-NEXT: orr r1, r4, r7
+; ARMV7-NEXT: ldr r7, [sp, #88] @ 4-byte Reload
+; ARMV7-NEXT: rscs r0, r2, #0
+; ARMV7-NEXT: orr r2, lr, r5
+; ARMV7-NEXT: rscs r0, r3, #0
+; ARMV7-NEXT: orr r1, r2, r1
+; ARMV7-NEXT: str r3, [sp, #92] @ 4-byte Spill
+; ARMV7-NEXT: orr r2, r11, r12
+; ARMV7-NEXT: orr r3, r7, r9
+; ARMV7-NEXT: orr r2, r3, r2
+; ARMV7-NEXT: clz r1, r1
+; ARMV7-NEXT: clz r2, r2
+; ARMV7-NEXT: mov r0, #0
+; ARMV7-NEXT: lsr r1, r1, #5
+; ARMV7-NEXT: movwlo r0, #1
+; ARMV7-NEXT: lsr r2, r2, #5
+; ARMV7-NEXT: orr r1, r1, r2
+; ARMV7-NEXT: orrs r0, r1, r0
+; ARMV7-NEXT: mov r3, r9
+; ARMV7-NEXT: asr r0, r6, #31
+; ARMV7-NEXT: mov r6, r7
+; ARMV7-NEXT: eor r0, r0, r10, asr #31
+; ARMV7-NEXT: mov r1, r12
+; ARMV7-NEXT: str r0, [sp, #20] @ 4-byte Spill
+; ARMV7-NEXT: mov r0, r11
+; ARMV7-NEXT: movwne r0, #0
+; ARMV7-NEXT: movwne r6, #0
+; ARMV7-NEXT: movwne r3, #0
+; ARMV7-NEXT: movwne r1, #0
+; ARMV7-NEXT: str r0, [sp, #108] @ 4-byte Spill
+; ARMV7-NEXT: bne .LBB0_15
+; ARMV7-NEXT: @ %bb.1: @ %_udiv-special-cases_udiv-special-cases
+; ARMV7-NEXT: mov r10, r7
+; ARMV7-NEXT: ldr r7, [sp, #96] @ 4-byte Reload
+; ARMV7-NEXT: eor r0, r8, #127
+; ARMV7-NEXT: mov r2, r11
+; ARMV7-NEXT: str r5, [sp, #72] @ 4-byte Spill
+; ARMV7-NEXT: orr r0, r0, r7
+; ARMV7-NEXT: ldr r7, [sp, #100] @ 4-byte Reload
+; ARMV7-NEXT: ldr r5, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: ldr r11, [sp, #48] @ 4-byte Reload
+; ARMV7-NEXT: orr r7, r7, r5
+; ARMV7-NEXT: str r4, [sp, #76] @ 4-byte Spill
+; ARMV7-NEXT: orrs r0, r0, r7
+; ARMV7-NEXT: str lr, [sp, #80] @ 4-byte Spill
+; ARMV7-NEXT: beq .LBB0_6
+; ARMV7-NEXT: @ %bb.2: @ %udiv-bb15
+; ARMV7-NEXT: mov r0, #0
+; ARMV7-NEXT: mov r1, #12
+; ARMV7-NEXT: str r0, [sp, #220]
+; ARMV7-NEXT: mov r11, r2
+; ARMV7-NEXT: str r0, [sp, #216]
+; ARMV7-NEXT: str r0, [sp, #212]
+; ARMV7-NEXT: str r0, [sp, #208]
+; ARMV7-NEXT: add r0, sp, #228
+; ARMV7-NEXT: stm r0, {r2, r9, r12}
+; ARMV7-NEXT: rsb r0, r8, #127
+; ARMV7-NEXT: add r2, sp, #208
+; ARMV7-NEXT: and r1, r1, r0, lsr #3
+; ARMV7-NEXT: add r2, r2, #16
+; ARMV7-NEXT: str r10, [sp, #224]
+; ARMV7-NEXT: and r6, r0, #31
+; ARMV7-NEXT: ldr r1, [r2, -r1]!
+; ARMV7-NEXT: eor r4, r6, #31
+; ARMV7-NEXT: str r9, [sp, #64] @ 4-byte Spill
+; ARMV7-NEXT: ldmib r2, {r3, r7}
+; ARMV7-NEXT: lsr r5, r1, #1
+; ARMV7-NEXT: ldr r2, [r2, #12]
+; ARMV7-NEXT: lsl r0, r3, r6
+; ARMV7-NEXT: orr r9, r0, r5, lsr r4
+; ARMV7-NEXT: lsr r5, r7, #1
+; ARMV7-NEXT: lsrs r3, r3, #1
+; ARMV7-NEXT: lsl r2, r2, r6
+; ARMV7-NEXT: orr r0, r2, r5, lsr r4
+; ARMV7-NEXT: str r0, [sp, #108] @ 4-byte Spill
+; ARMV7-NEXT: lsl r2, r7, r6
+; ARMV7-NEXT: ldr r0, [sp, #100] @ 4-byte Reload
+; ARMV7-NEXT: orr lr, r2, r3, lsr r4
+; ARMV7-NEXT: adds r4, r8, #1
+; ARMV7-NEXT: lsl r2, r1, r6
+; ARMV7-NEXT: adcs r8, r0, #0
+; ARMV7-NEXT: ldr r0, [sp, #96] @ 4-byte Reload
+; ARMV7-NEXT: mov r3, #0
+; ARMV7-NEXT: adcs r0, r0, #0
+; ARMV7-NEXT: str r0, [sp, #84] @ 4-byte Spill
+; ARMV7-NEXT: ldr r0, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: adcs r0, r0, #0
+; ARMV7-NEXT: str r0, [sp, #96] @ 4-byte Spill
+; ARMV7-NEXT: mov r0, #0
+; ARMV7-NEXT: adcs r1, r3, #0
+; ARMV7-NEXT: str r0, [sp, #104] @ 4-byte Spill
+; ARMV7-NEXT: bne .LBB0_13
+; ARMV7-NEXT: @ %bb.3: @ %udiv-preheader4
+; ARMV7-NEXT: mov r1, #0
+; ARMV7-NEXT: str r10, [sp, #176]
+; ARMV7-NEXT: str r1, [sp, #204]
+; ARMV7-NEXT: add r10, sp, #176
+; ARMV7-NEXT: str r1, [sp, #200]
+; ARMV7-NEXT: str r1, [sp, #196]
+; ARMV7-NEXT: str r1, [sp, #192]
+; ARMV7-NEXT: ubfx r1, r4, #5, #2
+; ARMV7-NEXT: str r11, [sp, #180]
+; ARMV7-NEXT: ldr r0, [sp, #64] @ 4-byte Reload
+; ARMV7-NEXT: add r3, r10, r1, lsl #2
+; ARMV7-NEXT: str r0, [sp, #184]
+; ARMV7-NEXT: and r0, r4, #31
+; ARMV7-NEXT: str r12, [sp, #188]
+; ARMV7-NEXT: ldmib r3, {r5, r6, r12}
+; ARMV7-NEXT: lsr r3, r6, r0
+; ARMV7-NEXT: lsl r7, r12, #1
+; ARMV7-NEXT: str r4, [sp, #100] @ 4-byte Spill
+; ARMV7-NEXT: eor r4, r0, #31
+; ARMV7-NEXT: ldr r1, [r10, r1, lsl #2]
+; ARMV7-NEXT: lsl r6, r6, #1
+; ARMV7-NEXT: orr r3, r3, r7, lsl r4
+; ARMV7-NEXT: lsr r7, r5, r0
+; ARMV7-NEXT: lsl r5, r5, #1
+; ARMV7-NEXT: orr r6, r7, r6, lsl r4
+; ARMV7-NEXT: lsr r12, r12, r0
+; ARMV7-NEXT: lsr r1, r1, r0
+; ARMV7-NEXT: orr r7, r1, r5, lsl r4
+; ARMV7-NEXT: ldr r1, [sp, #80] @ 4-byte Reload
+; ARMV7-NEXT: mov r10, #0
+; ARMV7-NEXT: ldr r0, [sp, #108] @ 4-byte Reload
+; ARMV7-NEXT: subs r1, r1, #1
+; ARMV7-NEXT: str r1, [sp, #64] @ 4-byte Spill
+; ARMV7-NEXT: ldr r1, [sp, #76] @ 4-byte Reload
+; ARMV7-NEXT: ldr r11, [sp, #84] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r1, r1, #0
+; ARMV7-NEXT: str r1, [sp, #60] @ 4-byte Spill
+; ARMV7-NEXT: ldr r1, [sp, #72] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r1, r1, #0
+; ARMV7-NEXT: str r1, [sp, #56] @ 4-byte Spill
+; ARMV7-NEXT: ldr r1, [sp, #68] @ 4-byte Reload
+; ARMV7-NEXT: sbc r1, r1, #0
+; ARMV7-NEXT: str r1, [sp, #52] @ 4-byte Spill
+; ARMV7-NEXT: ldr r1, [sp, #96] @ 4-byte Reload
+; ARMV7-NEXT: .LBB0_4: @ %udiv-do-while3
+; ARMV7-NEXT: @ =>This Inner Loop Header: Depth=1
+; ARMV7-NEXT: lsl r5, r12, #1
+; ARMV7-NEXT: add r4, sp, #88
+; ARMV7-NEXT: orr r5, r5, r3, lsr #31
+; ARMV7-NEXT: lsl r3, r3, #1
+; ARMV7-NEXT: stm r4, {r2, r9, lr} @ 12-byte Folded Spill
+; ARMV7-NEXT: orr r3, r3, r6, lsr #31
+; ARMV7-NEXT: lsl r6, r6, #1
+; ARMV7-NEXT: ldr r2, [sp, #104] @ 4-byte Reload
+; ARMV7-NEXT: orr r6, r6, r7, lsr #31
+; ARMV7-NEXT: lsl r7, r7, #1
+; ARMV7-NEXT: str r2, [sp, #84] @ 4-byte Spill
+; ARMV7-NEXT: ldr r2, [sp, #64] @ 4-byte Reload
+; ARMV7-NEXT: orr r7, r7, r0, lsr #31
+; ARMV7-NEXT: str r0, [sp, #108] @ 4-byte Spill
+; ARMV7-NEXT: subs r2, r2, r7
+; ARMV7-NEXT: ldr r0, [sp, #72] @ 4-byte Reload
+; ARMV7-NEXT: ldr r2, [sp, #60] @ 4-byte Reload
+; ARMV7-NEXT: ldr r4, [sp, #68] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r2, r2, r6
+; ARMV7-NEXT: ldr r2, [sp, #56] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r2, r2, r3
+; ARMV7-NEXT: ldr r2, [sp, #52] @ 4-byte Reload
+; ARMV7-NEXT: sbc r2, r2, r5
+; ARMV7-NEXT: and r9, r0, r2, asr #31
+; ARMV7-NEXT: ldr r0, [sp, #76] @ 4-byte Reload
+; ARMV7-NEXT: and r4, r4, r2, asr #31
+; ARMV7-NEXT: and lr, r0, r2, asr #31
+; ARMV7-NEXT: ldr r0, [sp, #80] @ 4-byte Reload
+; ARMV7-NEXT: and r12, r0, r2, asr #31
+; ARMV7-NEXT: mov r0, #1
+; ARMV7-NEXT: subs r7, r7, r12
+; ARMV7-NEXT: and r0, r0, r2, asr #31
+; ARMV7-NEXT: sbcs r6, r6, lr
+; ARMV7-NEXT: str r0, [sp, #104] @ 4-byte Spill
+; ARMV7-NEXT: ldr r0, [sp, #100] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r3, r3, r9
+; ARMV7-NEXT: sbc r12, r5, r4
+; ARMV7-NEXT: ldr r4, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: subs r0, r0, #1
+; ARMV7-NEXT: str r0, [sp, #100] @ 4-byte Spill
+; ARMV7-NEXT: sbcs r8, r8, #0
+; ARMV7-NEXT: sbcs r11, r11, #0
+; ARMV7-NEXT: sbc r1, r1, #0
+; ARMV7-NEXT: orr r5, r0, r11
+; ARMV7-NEXT: orr r2, r8, r1
+; ARMV7-NEXT: ldr r0, [sp, #88] @ 4-byte Reload
+; ARMV7-NEXT: orrs r2, r5, r2
+; ARMV7-NEXT: lsl r5, r4, #1
+; ARMV7-NEXT: ldr r2, [sp, #84] @ 4-byte Reload
+; ARMV7-NEXT: orr r2, r2, r0, lsl #1
+; ARMV7-NEXT: orr r0, r5, r0, lsr #31
+; ARMV7-NEXT: orr r9, r10, r0
+; ARMV7-NEXT: ldr r0, [sp, #96] @ 4-byte Reload
+; ARMV7-NEXT: lsl r5, r0, #1
+; ARMV7-NEXT: orr r5, r5, r4, lsr #31
+; ARMV7-NEXT: ldr r4, [sp, #108] @ 4-byte Reload
+; ARMV7-NEXT: orr lr, r10, r5
+; ARMV7-NEXT: lsl r5, r4, #1
+; ARMV7-NEXT: orr r5, r5, r0, lsr #31
+; ARMV7-NEXT: orr r0, r10, r5
+; ARMV7-NEXT: mov r10, #0
+; ARMV7-NEXT: bne .LBB0_4
+; ARMV7-NEXT: .LBB0_5: @ %udiv-loop-exit2
+; ARMV7-NEXT: ldr r1, [sp, #104] @ 4-byte Reload
+; ARMV7-NEXT: lsl r0, r0, #1
+; ARMV7-NEXT: ldr r11, [sp, #48] @ 4-byte Reload
+; ARMV7-NEXT: orr r6, r1, r2, lsl #1
+; ARMV7-NEXT: lsl r1, r9, #1
+; ARMV7-NEXT: orr r1, r1, r2, lsr #31
+; ARMV7-NEXT: str r1, [sp, #108] @ 4-byte Spill
+; ARMV7-NEXT: lsl r2, lr, #1
+; ARMV7-NEXT: orr r3, r2, r9, lsr #31
+; ARMV7-NEXT: orr r1, r0, lr, lsr #31
+; ARMV7-NEXT: .LBB0_6: @ %udiv-end1
+; ARMV7-NEXT: ldr r2, [sp, #284]
+; ARMV7-NEXT: ldr r0, [sp, #44] @ 4-byte Reload
+; ARMV7-NEXT: ldr r7, [sp, #24] @ 4-byte Reload
+; ARMV7-NEXT: subs r8, r0, r2, asr #31
+; ARMV7-NEXT: ldr r0, [sp, #36] @ 4-byte Reload
+; ARMV7-NEXT: ldr r4, [sp, #300]
+; ARMV7-NEXT: sbcs r10, r0, r2, asr #31
+; ARMV7-NEXT: ldr r0, [sp, #40] @ 4-byte Reload
+; ARMV7-NEXT: str r3, [sp, #96] @ 4-byte Spill
+; ARMV7-NEXT: sbcs lr, r0, r2, asr #31
+; ARMV7-NEXT: ldr r3, [sp, #16] @ 4-byte Reload
+; ARMV7-NEXT: sbc r9, r7, r2, asr #31
+; ARMV7-NEXT: clz r0, lr
+; ARMV7-NEXT: clz r7, r8
+; ARMV7-NEXT: add r0, r0, #32
+; ARMV7-NEXT: cmp r9, #0
+; ARMV7-NEXT: add r7, r7, #32
+; ARMV7-NEXT: clzne r0, r9
+; ARMV7-NEXT: cmp r10, #0
+; ARMV7-NEXT: clzne r7, r10
+; ARMV7-NEXT: orrs r5, lr, r9
+; ARMV7-NEXT: addeq r0, r7, #64
+; ARMV7-NEXT: subs r12, r3, r4, asr #31
+; ARMV7-NEXT: ldr r3, [sp, #12] @ 4-byte Reload
+; ARMV7-NEXT: clz r5, r12
+; ARMV7-NEXT: str r6, [sp, #92] @ 4-byte Spill
+; ARMV7-NEXT: add r5, r5, #32
+; ARMV7-NEXT: sbcs r6, r3, r4, asr #31
+; ARMV7-NEXT: ldr r3, [sp, #8] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r2, r11, r4, asr #31
+; ARMV7-NEXT: str r1, [sp, #88] @ 4-byte Spill
+; ARMV7-NEXT: sbc r3, r3, r4, asr #31
+; ARMV7-NEXT: clz r7, r2
+; ARMV7-NEXT: add r7, r7, #32
+; ARMV7-NEXT: cmp r3, #0
+; ARMV7-NEXT: clzne r7, r3
+; ARMV7-NEXT: cmp r6, #0
+; ARMV7-NEXT: clzne r5, r6
+; ARMV7-NEXT: orrs r4, r2, r3
+; ARMV7-NEXT: addeq r7, r5, #64
+; ARMV7-NEXT: str r6, [sp, #72] @ 4-byte Spill
+; ARMV7-NEXT: subs r11, r7, r0
+; ARMV7-NEXT: mov r7, #0
+; ARMV7-NEXT: sbcs r4, r7, #0
+; ARMV7-NEXT: str r4, [sp, #84] @ 4-byte Spill
+; ARMV7-NEXT: sbcs r5, r7, #0
+; ARMV7-NEXT: str r5, [sp, #104] @ 4-byte Spill
+; ARMV7-NEXT: sbc r1, r7, #0
+; ARMV7-NEXT: rsbs r0, r11, #127
+; ARMV7-NEXT: rscs r0, r4, #0
+; ARMV7-NEXT: orr r4, r8, lr
+; ARMV7-NEXT: rscs r0, r5, #0
+; ARMV7-NEXT: orr r5, r12, r2
+; ARMV7-NEXT: rscs r0, r1, #0
+; ARMV7-NEXT: str r1, [sp, #100] @ 4-byte Spill
+; ARMV7-NEXT: orr r0, r6, r3
+; ARMV7-NEXT: ldr r6, [sp, #20] @ 4-byte Reload
+; ARMV7-NEXT: orr r0, r5, r0
+; ARMV7-NEXT: orr r5, r10, r9
+; ARMV7-NEXT: clz r0, r0
+; ARMV7-NEXT: orr r4, r4, r5
+; ARMV7-NEXT: clz r4, r4
+; ARMV7-NEXT: ldr r1, [sp, #88] @ 4-byte Reload
+; ARMV7-NEXT: lsr r0, r0, #5
+; ARMV7-NEXT: movwlo r7, #1
+; ARMV7-NEXT: lsr r4, r4, #5
+; ARMV7-NEXT: orr r0, r0, r4
+; ARMV7-NEXT: orr r0, r0, r7
+; ARMV7-NEXT: eor r7, r1, r6
+; ARMV7-NEXT: ldr r1, [sp, #96] @ 4-byte Reload
+; ARMV7-NEXT: str r3, [sp, #64] @ 4-byte Spill
+; ARMV7-NEXT: ldr r3, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: str r2, [sp, #68] @ 4-byte Spill
+; ARMV7-NEXT: eor r2, r1, r6
+; ARMV7-NEXT: ldr r1, [sp, #108] @ 4-byte Reload
+; ARMV7-NEXT: eor r4, r3, r6
+; ARMV7-NEXT: subs r3, r4, r6
+; ARMV7-NEXT: str r9, [sp, #36] @ 4-byte Spill
+; ARMV7-NEXT: eor r1, r1, r6
+; ARMV7-NEXT: str lr, [sp, #40] @ 4-byte Spill
+; ARMV7-NEXT: sbcs r1, r1, r6
+; ARMV7-NEXT: str r1, [sp, #12] @ 4-byte Spill
+; ARMV7-NEXT: sbcs r1, r2, r6
+; ARMV7-NEXT: str r1, [sp, #8] @ 4-byte Spill
+; ARMV7-NEXT: sbc r1, r7, r6
+; ARMV7-NEXT: str r1, [sp, #20] @ 4-byte Spill
+; ARMV7-NEXT: ldr r1, [sp, #284]
+; ARMV7-NEXT: cmp r0, #0
+; ARMV7-NEXT: mov r6, r8
+; ARMV7-NEXT: mov r2, r10
+; ARMV7-NEXT: movwne r6, #0
+; ARMV7-NEXT: movwne r2, #0
+; ARMV7-NEXT: asr r1, r1, #31
+; ARMV7-NEXT: movwne lr, #0
+; ARMV7-NEXT: movwne r9, #0
+; ARMV7-NEXT: str r3, [sp, #16] @ 4-byte Spill
+; ARMV7-NEXT: str r1, [sp, #24] @ 4-byte Spill
+; ARMV7-NEXT: str r8, [sp, #44] @ 4-byte Spill
+; ARMV7-NEXT: bne .LBB0_12
+; ARMV7-NEXT: @ %bb.7: @ %udiv-end1
+; ARMV7-NEXT: ldr r3, [sp, #104] @ 4-byte Reload
+; ARMV7-NEXT: eor r0, r11, #127
+; ARMV7-NEXT: mov r1, r8
+; ARMV7-NEXT: ldr r8, [sp, #84] @ 4-byte Reload
+; ARMV7-NEXT: orr r0, r0, r3
+; ARMV7-NEXT: ldr r3, [sp, #100] @ 4-byte Reload
+; ARMV7-NEXT: orr r4, r8, r3
+; ARMV7-NEXT: orrs r0, r0, r4
+; ARMV7-NEXT: beq .LBB0_12
+; ARMV7-NEXT: @ %bb.8: @ %udiv-bb1
+; ARMV7-NEXT: mov r7, #0
+; ARMV7-NEXT: str r12, [sp, #76] @ 4-byte Spill
+; ARMV7-NEXT: str r1, [sp, #160]
+; ARMV7-NEXT: rsb r0, r11, #127
+; ARMV7-NEXT: str r7, [sp, #156]
+; ARMV7-NEXT: mov r1, #12
+; ARMV7-NEXT: str r7, [sp, #152]
+; ARMV7-NEXT: add r2, sp, #144
+; ARMV7-NEXT: str r7, [sp, #148]
+; ARMV7-NEXT: and r1, r1, r0, lsr #3
+; ARMV7-NEXT: str r7, [sp, #144]
+; ARMV7-NEXT: add r2, r2, #16
+; ARMV7-NEXT: str r10, [sp, #164]
+; ARMV7-NEXT: and r0, r0, #31
+; ARMV7-NEXT: ldr r9, [sp, #40] @ 4-byte Reload
+; ARMV7-NEXT: eor lr, r0, #31
+; ARMV7-NEXT: str r9, [sp, #168]
+; ARMV7-NEXT: ldr r12, [sp, #36] @ 4-byte Reload
+; ARMV7-NEXT: str r12, [sp, #172]
+; ARMV7-NEXT: ldr r1, [r2, -r1]!
+; ARMV7-NEXT: ldmib r2, {r3, r6}
+; ARMV7-NEXT: lsr r4, r1, #1
+; ARMV7-NEXT: ldr r2, [r2, #12]
+; ARMV7-NEXT: lsl r5, r3, r0
+; ARMV7-NEXT: orr r4, r5, r4, lsr lr
+; ARMV7-NEXT: str r4, [sp, #96] @ 4-byte Spill
+; ARMV7-NEXT: lsr r4, r6, #1
+; ARMV7-NEXT: lsl r2, r2, r0
+; ARMV7-NEXT: lsrs r3, r3, #1
+; ARMV7-NEXT: orr r2, r2, r4, lsr lr
+; ARMV7-NEXT: str r2, [sp, #108] @ 4-byte Spill
+; ARMV7-NEXT: lsl r2, r6, r0
+; ARMV7-NEXT: orr r2, r2, r3, lsr lr
+; ARMV7-NEXT: adds r3, r11, #1
+; ARMV7-NEXT: str r2, [sp, #92] @ 4-byte Spill
+; ARMV7-NEXT: mov r2, r10
+; ARMV7-NEXT: lsl r10, r1, r0
+; ARMV7-NEXT: ldr r0, [sp, #104] @ 4-byte Reload
+; ARMV7-NEXT: adcs r8, r8, #0
+; ARMV7-NEXT: str r2, [sp, #4] @ 4-byte Spill
+; ARMV7-NEXT: adcs lr, r0, #0
+; ARMV7-NEXT: ldr r0, [sp, #100] @ 4-byte Reload
+; ARMV7-NEXT: adcs r0, r0, #0
+; ARMV7-NEXT: str r0, [sp, #88] @ 4-byte Spill
+; ARMV7-NEXT: adcs r0, r7, #0
+; ARMV7-NEXT: ldr r0, [sp, #44] @ 4-byte Reload
+; ARMV7-NEXT: bne .LBB0_14
+; ARMV7-NEXT: @ %bb.9: @ %udiv-preheader
+; ARMV7-NEXT: add r1, sp, #112
+; ARMV7-NEXT: str r7, [sp, #140]
+; ARMV7-NEXT: stm r1, {r0, r2, r9, r12}
+; ARMV7-NEXT: ubfx r0, r3, #5, #2
+; ARMV7-NEXT: add r12, sp, #112
+; ARMV7-NEXT: add r2, r12, r0, lsl #2
+; ARMV7-NEXT: str r7, [sp, #136]
+; ARMV7-NEXT: str r7, [sp, #132]
+; ARMV7-NEXT: str r7, [sp, #128]
+; ARMV7-NEXT: ldr r9, [r2, #12]
+; ARMV7-NEXT: ldr r1, [r2, #8]
+; ARMV7-NEXT: ldr r7, [r2, #4]
+; ARMV7-NEXT: and r2, r3, #31
+; ARMV7-NEXT: eor r4, r2, #31
+; ARMV7-NEXT: str r3, [sp, #104] @ 4-byte Spill
+; ARMV7-NEXT: lsr r3, r1, r2
+; ARMV7-NEXT: lsl r6, r9, #1
+; ARMV7-NEXT: lsl r1, r1, #1
+; ARMV7-NEXT: orr r6, r3, r6, lsl r4
+; ARMV7-NEXT: lsr r3, r7, r2
+; ARMV7-NEXT: orr r1, r3, r1, lsl r4
+; ARMV7-NEXT: str r1, [sp, #100] @ 4-byte Spill
+; ARMV7-NEXT: lsl r1, r7, #1
+; ARMV7-NEXT: ldr r0, [r12, r0, lsl #2]
+; ARMV7-NEXT: lsr r11, r9, r2
+; ARMV7-NEXT: ldr r3, [sp, #64] @ 4-byte Reload
+; ARMV7-NEXT: ldr r7, [sp, #88] @ 4-byte Reload
+; ARMV7-NEXT: ldr r5, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: lsr r0, r0, r2
+; ARMV7-NEXT: mov r2, #0
+; ARMV7-NEXT: orr r0, r0, r1, lsl r4
+; ARMV7-NEXT: ldr r1, [sp, #76] @ 4-byte Reload
+; ARMV7-NEXT: ldr r4, [sp, #96] @ 4-byte Reload
+; ARMV7-NEXT: subs r1, r1, #1
+; ARMV7-NEXT: str r1, [sp, #60] @ 4-byte Spill
+; ARMV7-NEXT: ldr r1, [sp, #72] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r1, r1, #0
+; ARMV7-NEXT: str r1, [sp, #56] @ 4-byte Spill
+; ARMV7-NEXT: ldr r1, [sp, #68] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r1, r1, #0
+; ARMV7-NEXT: str r1, [sp, #52] @ 4-byte Spill
+; ARMV7-NEXT: sbc r1, r3, #0
+; ARMV7-NEXT: ldr r3, [sp, #108] @ 4-byte Reload
+; ARMV7-NEXT: str r1, [sp, #48] @ 4-byte Spill
+; ARMV7-NEXT: mov r1, #0
+; ARMV7-NEXT: .LBB0_10: @ %udiv-do-while
+; ARMV7-NEXT: @ =>This Inner Loop Header: Depth=1
+; ARMV7-NEXT: str r2, [sp, #80] @ 4-byte Spill
+; ARMV7-NEXT: lsl r2, r11, #1
+; ARMV7-NEXT: ldr r11, [sp, #100] @ 4-byte Reload
+; ARMV7-NEXT: orr r2, r2, r6, lsr #31
+; ARMV7-NEXT: str r4, [sp, #88] @ 4-byte Spill
+; ARMV7-NEXT: lsl r4, r6, #1
+; ARMV7-NEXT: str r5, [sp, #96] @ 4-byte Spill
+; ARMV7-NEXT: lsl r6, r11, #1
+; ARMV7-NEXT: ldr r5, [sp, #60] @ 4-byte Reload
+; ARMV7-NEXT: orr r6, r6, r0, lsr #31
+; ARMV7-NEXT: lsl r0, r0, #1
+; ARMV7-NEXT: orr r0, r0, r3, lsr #31
+; ARMV7-NEXT: orr r4, r4, r11, lsr #31
+; ARMV7-NEXT: subs r5, r5, r0
+; ARMV7-NEXT: str r3, [sp, #108] @ 4-byte Spill
+; ARMV7-NEXT: ldr r5, [sp, #56] @ 4-byte Reload
+; ARMV7-NEXT: ldr r3, [sp, #68] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r5, r5, r6
+; ARMV7-NEXT: str r1, [sp, #92] @ 4-byte Spill
+; ARMV7-NEXT: ldr r5, [sp, #52] @ 4-byte Reload
+; ARMV7-NEXT: ldr r1, [sp, #64] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r5, r5, r4
+; ARMV7-NEXT: str r10, [sp, #84] @ 4-byte Spill
+; ARMV7-NEXT: ldr r5, [sp, #48] @ 4-byte Reload
+; ARMV7-NEXT: sbc r5, r5, r2
+; ARMV7-NEXT: and r9, r3, r5, asr #31
+; ARMV7-NEXT: ldr r3, [sp, #72] @ 4-byte Reload
+; ARMV7-NEXT: and r10, r1, r5, asr #31
+; ARMV7-NEXT: and r11, r3, r5, asr #31
+; ARMV7-NEXT: ldr r3, [sp, #76] @ 4-byte Reload
+; ARMV7-NEXT: and r12, r3, r5, asr #31
+; ARMV7-NEXT: ldr r3, [sp, #104] @ 4-byte Reload
+; ARMV7-NEXT: subs r0, r0, r12
+; ARMV7-NEXT: sbcs r1, r6, r11
+; ARMV7-NEXT: str r1, [sp, #100] @ 4-byte Spill
+; ARMV7-NEXT: sbcs r6, r4, r9
+; ARMV7-NEXT: ldr r1, [sp, #84] @ 4-byte Reload
+; ARMV7-NEXT: sbc r11, r2, r10
+; ARMV7-NEXT: subs r3, r3, #1
+; ARMV7-NEXT: sbcs r8, r8, #0
+; ARMV7-NEXT: str r3, [sp, #104] @ 4-byte Spill
+; ARMV7-NEXT: sbcs lr, lr, #0
+; ARMV7-NEXT: mov r2, #1
+; ARMV7-NEXT: orr r4, r3, lr
+; ARMV7-NEXT: ldr r3, [sp, #80] @ 4-byte Reload
+; ARMV7-NEXT: sbc r7, r7, #0
+; ARMV7-NEXT: ldr r9, [sp, #88] @ 4-byte Reload
+; ARMV7-NEXT: and r2, r2, r5, asr #31
+; ARMV7-NEXT: orr r5, r8, r7
+; ARMV7-NEXT: orr r12, r3, r1, lsl #1
+; ARMV7-NEXT: ldr r3, [sp, #96] @ 4-byte Reload
+; ARMV7-NEXT: orrs r5, r4, r5
+; ARMV7-NEXT: ldr r10, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: lsl r5, r9, #1
+; ARMV7-NEXT: orr r1, r5, r1, lsr #31
+; ARMV7-NEXT: orr r4, r10, r1
+; ARMV7-NEXT: lsl r1, r3, #1
+; ARMV7-NEXT: orr r1, r1, r9, lsr #31
+; ARMV7-NEXT: orr r5, r10, r1
+; ARMV7-NEXT: ldr r1, [sp, #108] @ 4-byte Reload
+; ARMV7-NEXT: lsl r1, r1, #1
+; ARMV7-NEXT: orr r1, r1, r3, lsr #31
+; ARMV7-NEXT: orr r3, r10, r1
+; ARMV7-NEXT: mov r10, r12
+; ARMV7-NEXT: mov r1, #0
+; ARMV7-NEXT: bne .LBB0_10
+; ARMV7-NEXT: .LBB0_11: @ %udiv-loop-exit
+; ARMV7-NEXT: lsl r1, r4, #1
+; ARMV7-NEXT: orr r6, r2, r10, lsl #1
+; ARMV7-NEXT: orr r2, r1, r10, lsr #31
+; ARMV7-NEXT: lsl r1, r5, #1
+; ARMV7-NEXT: ldr r10, [sp, #4] @ 4-byte Reload
+; ARMV7-NEXT: orr lr, r1, r4, lsr #31
+; ARMV7-NEXT: ldr r12, [sp, #76] @ 4-byte Reload
+; ARMV7-NEXT: lsl r1, r3, #1
+; ARMV7-NEXT: orr r9, r1, r5, lsr #31
+; ARMV7-NEXT: .LBB0_12: @ %udiv-end
+; ARMV7-NEXT: umull r0, r7, r12, r6
+; ARMV7-NEXT: ldr r5, [sp, #16] @ 4-byte Reload
+; ARMV7-NEXT: ldr r11, [sp, #72] @ 4-byte Reload
+; ARMV7-NEXT: mov r4, #0
+; ARMV7-NEXT: mov r1, r12
+; ARMV7-NEXT: ldr r3, [sp, #68] @ 4-byte Reload
+; ARMV7-NEXT: str r0, [sp, #108] @ 4-byte Spill
+; ARMV7-NEXT: umlal r7, r4, r11, r6
+; ARMV7-NEXT: ldr r0, [sp, #28] @ 4-byte Reload
+; ARMV7-NEXT: mov r12, #0
+; ARMV7-NEXT: str r5, [r0]
+; ARMV7-NEXT: ldr r5, [sp, #12] @ 4-byte Reload
+; ARMV7-NEXT: str r5, [r0, #4]
+; ARMV7-NEXT: ldr r5, [sp, #8] @ 4-byte Reload
+; ARMV7-NEXT: str r5, [r0, #8]
+; ARMV7-NEXT: ldr r5, [sp, #20] @ 4-byte Reload
+; ARMV7-NEXT: str r5, [r0, #12]
+; ARMV7-NEXT: umull r5, r0, r1, r2
+; ARMV7-NEXT: adds r8, r5, r7
+; ARMV7-NEXT: adcs r0, r4, r0
+; ARMV7-NEXT: ldr r4, [sp, #64] @ 4-byte Reload
+; ARMV7-NEXT: adc r7, r12, #0
+; ARMV7-NEXT: umull r12, r5, r6, r3
+; ARMV7-NEXT: mla r6, r6, r4, r5
+; ARMV7-NEXT: umlal r0, r7, r11, r2
+; ARMV7-NEXT: mla r2, r2, r3, r6
+; ARMV7-NEXT: umull r6, r5, lr, r1
+; ARMV7-NEXT: mla r3, lr, r11, r5
+; ARMV7-NEXT: mla r1, r9, r1, r3
+; ARMV7-NEXT: adds r3, r6, r12
+; ARMV7-NEXT: adc r1, r1, r2
+; ARMV7-NEXT: adds r0, r0, r3
+; ARMV7-NEXT: ldr r2, [sp, #108] @ 4-byte Reload
+; ARMV7-NEXT: adc r1, r7, r1
+; ARMV7-NEXT: ldr r3, [sp, #44] @ 4-byte Reload
+; ARMV7-NEXT: ldr r7, [sp, #40] @ 4-byte Reload
+; ARMV7-NEXT: subs r2, r3, r2
+; ARMV7-NEXT: sbcs r3, r10, r8
+; ARMV7-NEXT: sbcs r0, r7, r0
+; ARMV7-NEXT: ldr r7, [sp, #36] @ 4-byte Reload
+; ARMV7-NEXT: sbc r1, r7, r1
+; ARMV7-NEXT: ldr r7, [sp, #24] @ 4-byte Reload
+; ARMV7-NEXT: eor r2, r2, r7
+; ARMV7-NEXT: eor r3, r3, r7
+; ARMV7-NEXT: subs r2, r2, r7
+; ARMV7-NEXT: eor r0, r0, r7
+; ARMV7-NEXT: sbcs r3, r3, r7
+; ARMV7-NEXT: eor r1, r1, r7
+; ARMV7-NEXT: sbcs r0, r0, r7
+; ARMV7-NEXT: sbc r1, r1, r7
+; ARMV7-NEXT: ldr r7, [sp, #32] @ 4-byte Reload
+; ARMV7-NEXT: stm r7, {r2, r3}
+; ARMV7-NEXT: str r0, [r7, #8]
+; ARMV7-NEXT: str r1, [r7, #12]
+; ARMV7-NEXT: add sp, sp, #244
+; ARMV7-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+; ARMV7-NEXT: .LBB0_13:
+; ARMV7-NEXT: ldr r0, [sp, #108] @ 4-byte Reload
+; ARMV7-NEXT: b .LBB0_5
+; ARMV7-NEXT: .LBB0_14:
+; ARMV7-NEXT: mov r2, #0
+; ARMV7-NEXT: ldr r3, [sp, #108] @ 4-byte Reload
+; ARMV7-NEXT: ldr r4, [sp, #96] @ 4-byte Reload
+; ARMV7-NEXT: ldr r5, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: b .LBB0_11
+; ARMV7-NEXT: .LBB0_15:
+; ARMV7-NEXT: ldr r11, [sp, #48] @ 4-byte Reload
+; ARMV7-NEXT: b .LBB0_6
+ %q = sdiv i128 %n, %d
+ %r = srem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
+
+define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; ARMV6-LABEL: udivrem_i128:
+; ARMV6: @ %bb.0: @ %_udiv-special-cases_udiv-special-cases
+; ARMV6-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; ARMV6-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; ARMV6-NEXT: .pad #228
+; ARMV6-NEXT: sub sp, sp, #228
+; ARMV6-NEXT: ldr r11, [sp, #264]
+; ARMV6-NEXT: mov r8, r2
+; ARMV6-NEXT: ldr r4, [sp, #268]
+; ARMV6-NEXT: clz r2, r3
+; ARMV6-NEXT: str r0, [sp, #28] @ 4-byte Spill
+; ARMV6-NEXT: clz r0, r11
+; ARMV6-NEXT: str r1, [sp, #32] @ 4-byte Spill
+; ARMV6-NEXT: clz r1, r8
+; ARMV6-NEXT: add r0, r0, #32
+; ARMV6-NEXT: cmp r4, #0
+; ARMV6-NEXT: clzne r0, r4
+; ARMV6-NEXT: add r1, r1, #32
+; ARMV6-NEXT: cmp r3, #0
+; ARMV6-NEXT: str r1, [sp, #8] @ 4-byte Spill
+; ARMV6-NEXT: str r2, [sp, #4] @ 4-byte Spill
+; ARMV6-NEXT: movne r1, r2
+; ARMV6-NEXT: orrs r2, r11, r4
+; ARMV6-NEXT: ldr lr, [sp, #280]
+; ARMV6-NEXT: ldr r2, [sp, #272]
+; ARMV6-NEXT: addeq r0, r1, #64
+; ARMV6-NEXT: ldr r7, [sp, #284]
+; ARMV6-NEXT: clz r1, lr
+; ARMV6-NEXT: ldr r12, [sp, #276]
+; ARMV6-NEXT: clz r2, r2
+; ARMV6-NEXT: add r1, r1, #32
+; ARMV6-NEXT: cmp r7, #0
+; ARMV6-NEXT: clzne r1, r7
+; ARMV6-NEXT: add r2, r2, #32
+; ARMV6-NEXT: cmp r12, #0
+; ARMV6-NEXT: mov r10, r3
+; ARMV6-NEXT: clzne r2, r12
+; ARMV6-NEXT: orrs r3, lr, r7
+; ARMV6-NEXT: addeq r1, r2, #64
+; ARMV6-NEXT: mov r2, #0
+; ARMV6-NEXT: subs r9, r1, r0
+; ARMV6-NEXT: ldr r3, [sp, #272]
+; ARMV6-NEXT: sbcs r6, r2, #0
+; ARMV6-NEXT: str r4, [sp, #48] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r5, r2, #0
+; ARMV6-NEXT: orr r3, r3, lr
+; ARMV6-NEXT: sbc r1, r2, #0
+; ARMV6-NEXT: rsbs r0, r9, #127
+; ARMV6-NEXT: rscs r0, r6, #0
+; ARMV6-NEXT: str r1, [sp, #84] @ 4-byte Spill
+; ARMV6-NEXT: rscs r0, r5, #0
+; ARMV6-NEXT: orr r2, r8, r11
+; ARMV6-NEXT: rscs r0, r1, #0
+; ARMV6-NEXT: orr r1, r10, r4
+; ARMV6-NEXT: orr r1, r2, r1
+; ARMV6-NEXT: orr r2, r12, r7
+; ARMV6-NEXT: orr r2, r3, r2
+; ARMV6-NEXT: clz r1, r1
+; ARMV6-NEXT: clz r2, r2
+; ARMV6-NEXT: mov r0, #0
+; ARMV6-NEXT: lsr r1, r1, #5
+; ARMV6-NEXT: movlo r0, #1
+; ARMV6-NEXT: lsr r2, r2, #5
+; ARMV6-NEXT: orr r1, r2, r1
+; ARMV6-NEXT: orrs r0, r1, r0
+; ARMV6-NEXT: mov r3, r10
+; ARMV6-NEXT: mov r7, r8
+; ARMV6-NEXT: str r11, [sp, #44] @ 4-byte Spill
+; ARMV6-NEXT: movne r4, #0
+; ARMV6-NEXT: movne r11, #0
+; ARMV6-NEXT: movne r3, #0
+; ARMV6-NEXT: movne r7, #0
+; ARMV6-NEXT: str r10, [sp, #40] @ 4-byte Spill
+; ARMV6-NEXT: str r8, [sp, #36] @ 4-byte Spill
+; ARMV6-NEXT: bne .LBB1_6
+; ARMV6-NEXT: @ %bb.1: @ %_udiv-special-cases_udiv-special-cases
+; ARMV6-NEXT: ldr r1, [sp, #84] @ 4-byte Reload
+; ARMV6-NEXT: eor r0, r9, #127
+; ARMV6-NEXT: orr r0, r0, r5
+; ARMV6-NEXT: str r5, [sp, #76] @ 4-byte Spill
+; ARMV6-NEXT: orr r1, r6, r1
+; ARMV6-NEXT: str r6, [sp, #80] @ 4-byte Spill
+; ARMV6-NEXT: orrs r0, r0, r1
+; ARMV6-NEXT: beq .LBB1_6
+; ARMV6-NEXT: @ %bb.2: @ %udiv-bb15
+; ARMV6-NEXT: mov r0, #0
+; ARMV6-NEXT: str r8, [sp, #208]
+; ARMV6-NEXT: str r0, [sp, #204]
+; ARMV6-NEXT: add r2, sp, #192
+; ARMV6-NEXT: str r0, [sp, #200]
+; ARMV6-NEXT: mov r11, #12
+; ARMV6-NEXT: str r0, [sp, #196]
+; ARMV6-NEXT: add r2, r2, #16
+; ARMV6-NEXT: str r0, [sp, #192]
+; ARMV6-NEXT: rsb r0, r9, #127
+; ARMV6-NEXT: str r10, [sp, #212]
+; ARMV6-NEXT: mov r6, r8
+; ARMV6-NEXT: ldr lr, [sp, #44] @ 4-byte Reload
+; ARMV6-NEXT: and r1, r11, r0, lsr #3
+; ARMV6-NEXT: str lr, [sp, #216]
+; ARMV6-NEXT: and r0, r0, #31
+; ARMV6-NEXT: ldr r12, [sp, #48] @ 4-byte Reload
+; ARMV6-NEXT: eor r5, r0, #31
+; ARMV6-NEXT: str r12, [sp, #220]
+; ARMV6-NEXT: ldr r1, [r2, -r1]!
+; ARMV6-NEXT: ldr r4, [r2, #8]
+; ARMV6-NEXT: ldr r7, [r2, #4]
+; ARMV6-NEXT: ldr r2, [r2, #12]
+; ARMV6-NEXT: lsr r3, r4, #1
+; ARMV6-NEXT: lsl r2, r2, r0
+; ARMV6-NEXT: orr r2, r2, r3, lsr r5
+; ARMV6-NEXT: str r2, [sp, #92] @ 4-byte Spill
+; ARMV6-NEXT: lsl r2, r4, r0
+; ARMV6-NEXT: lsrs r3, r7, #1
+; ARMV6-NEXT: orr r8, r2, r3, lsr r5
+; ARMV6-NEXT: lsl r2, r7, r0
+; ARMV6-NEXT: lsr r3, r1, #1
+; ARMV6-NEXT: lsl r4, r1, r0
+; ARMV6-NEXT: ldr r0, [sp, #80] @ 4-byte Reload
+; ARMV6-NEXT: orr r2, r2, r3, lsr r5
+; ARMV6-NEXT: adds r5, r9, #1
+; ARMV6-NEXT: str r2, [sp, #72] @ 4-byte Spill
+; ARMV6-NEXT: adcs r0, r0, #0
+; ARMV6-NEXT: str r0, [sp, #80] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #76] @ 4-byte Reload
+; ARMV6-NEXT: mov r2, #0
+; ARMV6-NEXT: adcs r0, r0, #0
+; ARMV6-NEXT: str r0, [sp, #76] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #84] @ 4-byte Reload
+; ARMV6-NEXT: adcs r7, r0, #0
+; ARMV6-NEXT: mov r0, #0
+; ARMV6-NEXT: str r0, [sp, #88] @ 4-byte Spill
+; ARMV6-NEXT: adcs r0, r2, #0
+; ARMV6-NEXT: bne .LBB1_13
+; ARMV6-NEXT: @ %bb.3: @ %udiv-preheader4
+; ARMV6-NEXT: mov r0, #0
+; ARMV6-NEXT: str r12, [sp, #172]
+; ARMV6-NEXT: str r0, [sp, #188]
+; ARMV6-NEXT: str r0, [sp, #184]
+; ARMV6-NEXT: str r0, [sp, #180]
+; ARMV6-NEXT: str r0, [sp, #176]
+; ARMV6-NEXT: add r0, sp, #160
+; ARMV6-NEXT: stm r0, {r6, r10, lr}
+; ARMV6-NEXT: and r0, r11, r5, lsr #3
+; ARMV6-NEXT: add r6, sp, #160
+; ARMV6-NEXT: add r2, r6, r0
+; ARMV6-NEXT: ldr r10, [sp, #80] @ 4-byte Reload
+; ARMV6-NEXT: ldr r11, [sp, #72] @ 4-byte Reload
+; ARMV6-NEXT: ldmib r2, {r1, r3, lr}
+; ARMV6-NEXT: lsl r2, lr, #1
+; ARMV6-NEXT: str r5, [sp, #84] @ 4-byte Spill
+; ARMV6-NEXT: and r5, r5, #31
+; ARMV6-NEXT: ldr r0, [r6, r0]
+; ARMV6-NEXT: eor r12, r5, #31
+; ARMV6-NEXT: lsr r9, r3, r5
+; ARMV6-NEXT: orr r9, r9, r2, lsl r12
+; ARMV6-NEXT: lsr r2, r1, r5
+; ARMV6-NEXT: lsl r1, r1, #1
+; ARMV6-NEXT: lsl r3, r3, #1
+; ARMV6-NEXT: lsr r0, r0, r5
+; ARMV6-NEXT: orr r1, r0, r1, lsl r12
+; ARMV6-NEXT: ldr r0, [sp, #272]
+; ARMV6-NEXT: orr r3, r2, r3, lsl r12
+; ARMV6-NEXT: ldr r6, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: lsr lr, lr, r5
+; ARMV6-NEXT: subs r0, r0, #1
+; ARMV6-NEXT: str r0, [sp, #64] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #276]
+; ARMV6-NEXT: mov r5, #0
+; ARMV6-NEXT: ldr r12, [sp, #76] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r0, r0, #0
+; ARMV6-NEXT: str r0, [sp, #60] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #280]
+; ARMV6-NEXT: sbcs r0, r0, #0
+; ARMV6-NEXT: str r0, [sp, #56] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #284]
+; ARMV6-NEXT: sbc r0, r0, #0
+; ARMV6-NEXT: str r0, [sp, #52] @ 4-byte Spill
+; ARMV6-NEXT: .LBB1_4: @ %udiv-do-while3
+; ARMV6-NEXT: @ =>This Inner Loop Header: Depth=1
+; ARMV6-NEXT: ldr r2, [sp, #88] @ 4-byte Reload
+; ARMV6-NEXT: lsl r0, lr, #1
+; ARMV6-NEXT: str r2, [sp, #68] @ 4-byte Spill
+; ARMV6-NEXT: lsl r2, r9, #1
+; ARMV6-NEXT: orr r2, r2, r3, lsr #31
+; ARMV6-NEXT: lsl r3, r3, #1
+; ARMV6-NEXT: orr r3, r3, r1, lsr #31
+; ARMV6-NEXT: lsl r1, r1, #1
+; ARMV6-NEXT: str r6, [sp, #92] @ 4-byte Spill
+; ARMV6-NEXT: orr r1, r1, r6, lsr #31
+; ARMV6-NEXT: ldr r6, [sp, #64] @ 4-byte Reload
+; ARMV6-NEXT: orr r0, r0, r9, lsr #31
+; ARMV6-NEXT: str r4, [sp, #72] @ 4-byte Spill
+; ARMV6-NEXT: subs r4, r6, r1
+; ARMV6-NEXT: ldr r6, [sp, #60] @ 4-byte Reload
+; ARMV6-NEXT: str r11, [sp, #76] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r4, r6, r3
+; ARMV6-NEXT: ldr r6, [sp, #56] @ 4-byte Reload
+; ARMV6-NEXT: str r8, [sp, #80] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r4, r6, r2
+; ARMV6-NEXT: ldr r6, [sp, #52] @ 4-byte Reload
+; ARMV6-NEXT: sbc r4, r6, r0
+; ARMV6-NEXT: ldr r6, [sp, #284]
+; ARMV6-NEXT: and r11, r6, r4, asr #31
+; ARMV6-NEXT: ldr r6, [sp, #280]
+; ARMV6-NEXT: and lr, r6, r4, asr #31
+; ARMV6-NEXT: ldr r6, [sp, #276]
+; ARMV6-NEXT: and r8, r6, r4, asr #31
+; ARMV6-NEXT: ldr r6, [sp, #272]
+; ARMV6-NEXT: and r9, r6, r4, asr #31
+; ARMV6-NEXT: ldr r6, [sp, #72] @ 4-byte Reload
+; ARMV6-NEXT: subs r1, r1, r9
+; ARMV6-NEXT: sbcs r3, r3, r8
+; ARMV6-NEXT: sbcs r9, r2, lr
+; ARMV6-NEXT: sbc lr, r0, r11
+; ARMV6-NEXT: mov r0, #1
+; ARMV6-NEXT: and r0, r0, r4, asr #31
+; ARMV6-NEXT: str r0, [sp, #88] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #84] @ 4-byte Reload
+; ARMV6-NEXT: subs r0, r0, #1
+; ARMV6-NEXT: str r0, [sp, #84] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r10, r10, #0
+; ARMV6-NEXT: sbcs r12, r12, #0
+; ARMV6-NEXT: sbc r7, r7, #0
+; ARMV6-NEXT: orr r0, r0, r12
+; ARMV6-NEXT: orr r4, r10, r7
+; ARMV6-NEXT: orrs r0, r0, r4
+; ARMV6-NEXT: ldr r4, [sp, #76] @ 4-byte Reload
+; ARMV6-NEXT: ldr r0, [sp, #68] @ 4-byte Reload
+; ARMV6-NEXT: orr r2, r0, r6, lsl #1
+; ARMV6-NEXT: lsl r0, r4, #1
+; ARMV6-NEXT: orr r0, r0, r6, lsr #31
+; ARMV6-NEXT: ldr r6, [sp, #80] @ 4-byte Reload
+; ARMV6-NEXT: orr r11, r5, r0
+; ARMV6-NEXT: lsl r0, r6, #1
+; ARMV6-NEXT: orr r0, r0, r4, lsr #31
+; ARMV6-NEXT: mov r4, r2
+; ARMV6-NEXT: orr r8, r5, r0
+; ARMV6-NEXT: ldr r0, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: lsl r0, r0, #1
+; ARMV6-NEXT: orr r0, r0, r6, lsr #31
+; ARMV6-NEXT: orr r6, r5, r0
+; ARMV6-NEXT: mov r5, #0
+; ARMV6-NEXT: bne .LBB1_4
+; ARMV6-NEXT: .LBB1_5: @ %udiv-loop-exit2
+; ARMV6-NEXT: ldr r0, [sp, #88] @ 4-byte Reload
+; ARMV6-NEXT: lsl r3, r11, #1
+; ARMV6-NEXT: lsl r2, r8, #1
+; ARMV6-NEXT: orr r3, r3, r4, lsr #31
+; ARMV6-NEXT: orr r7, r0, r4, lsl #1
+; ARMV6-NEXT: lsl r0, r6, #1
+; ARMV6-NEXT: orr r4, r0, r8, lsr #31
+; ARMV6-NEXT: ldr r10, [sp, #40] @ 4-byte Reload
+; ARMV6-NEXT: ldr r8, [sp, #36] @ 4-byte Reload
+; ARMV6-NEXT: orr r11, r2, r11, lsr #31
+; ARMV6-NEXT: .LBB1_6: @ %udiv-end1
+; ARMV6-NEXT: ldr r6, [sp, #44] @ 4-byte Reload
+; ARMV6-NEXT: mov lr, #0
+; ARMV6-NEXT: str r7, [sp, #12] @ 4-byte Spill
+; ARMV6-NEXT: ldr r7, [sp, #48] @ 4-byte Reload
+; ARMV6-NEXT: clz r0, r6
+; ARMV6-NEXT: ldmib sp, {r1, r2} @ 8-byte Folded Reload
+; ARMV6-NEXT: add r0, r0, #32
+; ARMV6-NEXT: cmp r7, #0
+; ARMV6-NEXT: clzne r0, r7
+; ARMV6-NEXT: cmp r10, #0
+; ARMV6-NEXT: movne r2, r1
+; ARMV6-NEXT: orrs r1, r6, r7
+; ARMV6-NEXT: ldr r5, [sp, #280]
+; ARMV6-NEXT: addeq r0, r2, #64
+; ARMV6-NEXT: ldr r2, [sp, #272]
+; ARMV6-NEXT: str r4, [sp, #24] @ 4-byte Spill
+; ARMV6-NEXT: clz r1, r5
+; ARMV6-NEXT: ldr r4, [sp, #284]
+; ARMV6-NEXT: clz r2, r2
+; ARMV6-NEXT: ldr r12, [sp, #276]
+; ARMV6-NEXT: add r1, r1, #32
+; ARMV6-NEXT: cmp r4, #0
+; ARMV6-NEXT: add r2, r2, #32
+; ARMV6-NEXT: clzne r1, r4
+; ARMV6-NEXT: cmp r12, #0
+; ARMV6-NEXT: str r3, [sp, #16] @ 4-byte Spill
+; ARMV6-NEXT: clzne r2, r12
+; ARMV6-NEXT: orrs r3, r5, r4
+; ARMV6-NEXT: str r11, [sp, #20] @ 4-byte Spill
+; ARMV6-NEXT: addeq r1, r2, #64
+; ARMV6-NEXT: subs r9, r1, r0
+; ARMV6-NEXT: sbcs r2, lr, #0
+; ARMV6-NEXT: sbcs r1, lr, #0
+; ARMV6-NEXT: sbc r3, lr, #0
+; ARMV6-NEXT: rsbs r0, r9, #127
+; ARMV6-NEXT: rscs r0, r2, #0
+; ARMV6-NEXT: mov r11, r1
+; ARMV6-NEXT: rscs r0, r1, #0
+; ARMV6-NEXT: orr r1, r10, r7
+; ARMV6-NEXT: rscs r0, r3, #0
+; ARMV6-NEXT: str r3, [sp, #84] @ 4-byte Spill
+; ARMV6-NEXT: orr r0, r8, r6
+; ARMV6-NEXT: orr r3, r12, r4
+; ARMV6-NEXT: orr r0, r0, r1
+; ARMV6-NEXT: ldr r1, [sp, #272]
+; ARMV6-NEXT: clz r0, r0
+; ARMV6-NEXT: movlo lr, #1
+; ARMV6-NEXT: orr r1, r1, r5
+; ARMV6-NEXT: mov r4, r8
+; ARMV6-NEXT: orr r1, r1, r3
+; ARMV6-NEXT: lsr r0, r0, #5
+; ARMV6-NEXT: clz r1, r1
+; ARMV6-NEXT: mov r3, r10
+; ARMV6-NEXT: lsr r1, r1, #5
+; ARMV6-NEXT: orr r0, r1, r0
+; ARMV6-NEXT: orrs r0, r0, lr
+; ARMV6-NEXT: movne r7, #0
+; ARMV6-NEXT: movne r6, #0
+; ARMV6-NEXT: movne r3, #0
+; ARMV6-NEXT: movne r4, #0
+; ARMV6-NEXT: bne .LBB1_12
+; ARMV6-NEXT: @ %bb.7: @ %udiv-end1
+; ARMV6-NEXT: ldr r1, [sp, #84] @ 4-byte Reload
+; ARMV6-NEXT: eor r0, r9, #127
+; ARMV6-NEXT: orr r0, r0, r11
+; ARMV6-NEXT: orr r1, r2, r1
+; ARMV6-NEXT: orrs r0, r0, r1
+; ARMV6-NEXT: beq .LBB1_12
+; ARMV6-NEXT: @ %bb.8: @ %udiv-bb1
+; ARMV6-NEXT: rsb r1, r9, #127
+; ARMV6-NEXT: add r4, sp, #128
+; ARMV6-NEXT: ldr r0, [sp, #264]
+; ARMV6-NEXT: mov lr, r11
+; ARMV6-NEXT: mov r12, r2
+; ARMV6-NEXT: mov r2, #0
+; ARMV6-NEXT: str r0, [sp, #152]
+; ARMV6-NEXT: mov r0, #12
+; ARMV6-NEXT: ldr r11, [sp, #268]
+; ARMV6-NEXT: and r3, r0, r1, lsr #3
+; ARMV6-NEXT: add r4, r4, #16
+; ARMV6-NEXT: str r8, [sp, #144]
+; ARMV6-NEXT: str r2, [sp, #140]
+; ARMV6-NEXT: and r0, r1, #31
+; ARMV6-NEXT: str r2, [sp, #136]
+; ARMV6-NEXT: eor r6, r0, #31
+; ARMV6-NEXT: str r2, [sp, #132]
+; ARMV6-NEXT: str r2, [sp, #128]
+; ARMV6-NEXT: str r10, [sp, #148]
+; ARMV6-NEXT: str r11, [sp, #156]
+; ARMV6-NEXT: ldr r3, [r4, -r3]!
+; ARMV6-NEXT: ldr r7, [r4, #4]
+; ARMV6-NEXT: ldr r5, [r4, #8]
+; ARMV6-NEXT: ldr r4, [r4, #12]
+; ARMV6-NEXT: lsl r1, r4, r0
+; ARMV6-NEXT: lsr r4, r5, #1
+; ARMV6-NEXT: orr r1, r1, r4, lsr r6
+; ARMV6-NEXT: str r1, [sp, #92] @ 4-byte Spill
+; ARMV6-NEXT: lsl r1, r5, r0
+; ARMV6-NEXT: lsrs r4, r7, #1
+; ARMV6-NEXT: orr r1, r1, r4, lsr r6
+; ARMV6-NEXT: str r1, [sp, #88] @ 4-byte Spill
+; ARMV6-NEXT: lsl r1, r7, r0
+; ARMV6-NEXT: lsr r4, r3, #1
+; ARMV6-NEXT: orr r1, r1, r4, lsr r6
+; ARMV6-NEXT: adds r7, r9, #1
+; ARMV6-NEXT: adcs r6, r12, #0
+; ARMV6-NEXT: str r1, [sp, #80] @ 4-byte Spill
+; ARMV6-NEXT: lsl r1, r3, r0
+; ARMV6-NEXT: ldr r0, [sp, #84] @ 4-byte Reload
+; ARMV6-NEXT: adcs r9, lr, #0
+; ARMV6-NEXT: adcs r0, r0, #0
+; ARMV6-NEXT: str r0, [sp, #76] @ 4-byte Spill
+; ARMV6-NEXT: adcs r0, r2, #0
+; ARMV6-NEXT: bne .LBB1_14
+; ARMV6-NEXT: @ %bb.9: @ %udiv-preheader
+; ARMV6-NEXT: ldr r0, [sp, #264]
+; ARMV6-NEXT: add r5, sp, #96
+; ARMV6-NEXT: str r0, [sp, #104]
+; ARMV6-NEXT: mov r0, #12
+; ARMV6-NEXT: str r2, [sp, #124]
+; ARMV6-NEXT: str r2, [sp, #120]
+; ARMV6-NEXT: str r2, [sp, #116]
+; ARMV6-NEXT: str r2, [sp, #112]
+; ARMV6-NEXT: and r2, r0, r7, lsr #3
+; ARMV6-NEXT: add r0, r5, r2
+; ARMV6-NEXT: str r11, [sp, #108]
+; ARMV6-NEXT: str r8, [sp, #96]
+; ARMV6-NEXT: and r11, r7, #31
+; ARMV6-NEXT: str r10, [sp, #100]
+; ARMV6-NEXT: eor r12, r11, #31
+; ARMV6-NEXT: ldr r3, [r0, #8]
+; ARMV6-NEXT: ldr r8, [r0, #12]
+; ARMV6-NEXT: ldr r4, [r0, #4]
+; ARMV6-NEXT: str r7, [sp, #84] @ 4-byte Spill
+; ARMV6-NEXT: lsr r0, r3, r11
+; ARMV6-NEXT: lsl r7, r8, #1
+; ARMV6-NEXT: lsl r3, r3, #1
+; ARMV6-NEXT: orr lr, r0, r7, lsl r12
+; ARMV6-NEXT: lsr r0, r4, r11
+; ARMV6-NEXT: orr r10, r0, r3, lsl r12
+; ARMV6-NEXT: ldr r3, [r5, r2]
+; ARMV6-NEXT: lsl r4, r4, #1
+; ARMV6-NEXT: lsr r8, r8, r11
+; ARMV6-NEXT: ldr r5, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: lsr r3, r3, r11
+; ARMV6-NEXT: orr r4, r3, r4, lsl r12
+; ARMV6-NEXT: ldr r3, [sp, #272]
+; ARMV6-NEXT: ldr r12, [sp, #76] @ 4-byte Reload
+; ARMV6-NEXT: subs r0, r3, #1
+; ARMV6-NEXT: ldr r3, [sp, #276]
+; ARMV6-NEXT: str r0, [sp, #64] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r0, r3, #0
+; ARMV6-NEXT: ldr r3, [sp, #280]
+; ARMV6-NEXT: str r0, [sp, #60] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r0, r3, #0
+; ARMV6-NEXT: ldr r3, [sp, #284]
+; ARMV6-NEXT: ldr r11, [sp, #80] @ 4-byte Reload
+; ARMV6-NEXT: str r0, [sp, #56] @ 4-byte Spill
+; ARMV6-NEXT: sbc r0, r3, #0
+; ARMV6-NEXT: str r0, [sp, #52] @ 4-byte Spill
+; ARMV6-NEXT: mov r3, #0
+; ARMV6-NEXT: mov r0, #0
+; ARMV6-NEXT: .LBB1_10: @ %udiv-do-while
+; ARMV6-NEXT: @ =>This Inner Loop Header: Depth=1
+; ARMV6-NEXT: add r7, sp, #72
+; ARMV6-NEXT: ldr r2, [sp, #88] @ 4-byte Reload
+; ARMV6-NEXT: stm r7, {r0, r1, r2} @ 12-byte Folded Spill
+; ARMV6-NEXT: lsl r0, r10, #1
+; ARMV6-NEXT: orr r0, r0, r4, lsr #31
+; ARMV6-NEXT: lsl r4, r4, #1
+; ARMV6-NEXT: ldr r1, [sp, #64] @ 4-byte Reload
+; ARMV6-NEXT: orr r4, r4, r5, lsr #31
+; ARMV6-NEXT: str r5, [sp, #92] @ 4-byte Spill
+; ARMV6-NEXT: subs r5, r1, r4
+; ARMV6-NEXT: ldr r1, [sp, #60] @ 4-byte Reload
+; ARMV6-NEXT: lsl r7, lr, #1
+; ARMV6-NEXT: mov r2, r3
+; ARMV6-NEXT: sbcs r5, r1, r0
+; ARMV6-NEXT: ldr r1, [sp, #56] @ 4-byte Reload
+; ARMV6-NEXT: orr r7, r7, r10, lsr #31
+; ARMV6-NEXT: lsl r3, r8, #1
+; ARMV6-NEXT: sbcs r5, r1, r7
+; ARMV6-NEXT: ldr r1, [sp, #52] @ 4-byte Reload
+; ARMV6-NEXT: orr r3, r3, lr, lsr #31
+; ARMV6-NEXT: str r11, [sp, #88] @ 4-byte Spill
+; ARMV6-NEXT: sbc r5, r1, r3
+; ARMV6-NEXT: ldr r1, [sp, #284]
+; ARMV6-NEXT: and r11, r1, r5, asr #31
+; ARMV6-NEXT: ldr r1, [sp, #280]
+; ARMV6-NEXT: and lr, r1, r5, asr #31
+; ARMV6-NEXT: ldr r1, [sp, #276]
+; ARMV6-NEXT: and r10, r1, r5, asr #31
+; ARMV6-NEXT: ldr r1, [sp, #272]
+; ARMV6-NEXT: and r8, r1, r5, asr #31
+; ARMV6-NEXT: subs r1, r4, r8
+; ARMV6-NEXT: str r1, [sp, #68] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r4, r0, r10
+; ARMV6-NEXT: mov r0, #1
+; ARMV6-NEXT: sbcs r10, r7, lr
+; ARMV6-NEXT: and r0, r0, r5, asr #31
+; ARMV6-NEXT: sbc r8, r3, r11
+; ARMV6-NEXT: ldr r3, [sp, #84] @ 4-byte Reload
+; ARMV6-NEXT: ldr r1, [sp, #76] @ 4-byte Reload
+; ARMV6-NEXT: subs r3, r3, #1
+; ARMV6-NEXT: str r3, [sp, #84] @ 4-byte Spill
+; ARMV6-NEXT: sbcs r6, r6, #0
+; ARMV6-NEXT: ldr lr, [sp, #88] @ 4-byte Reload
+; ARMV6-NEXT: sbcs r9, r9, #0
+; ARMV6-NEXT: sbc r12, r12, #0
+; ARMV6-NEXT: orr r3, r3, r9
+; ARMV6-NEXT: orr r5, r6, r12
+; ARMV6-NEXT: orrs r3, r3, r5
+; ARMV6-NEXT: ldr r5, [sp, #80] @ 4-byte Reload
+; ARMV6-NEXT: ldr r3, [sp, #72] @ 4-byte Reload
+; ARMV6-NEXT: orr r7, r3, r1, lsl #1
+; ARMV6-NEXT: lsl r3, lr, #1
+; ARMV6-NEXT: orr r1, r3, r1, lsr #31
+; ARMV6-NEXT: lsl r3, r5, #1
+; ARMV6-NEXT: orr r3, r3, lr, lsr #31
+; ARMV6-NEXT: orr r11, r2, r1
+; ARMV6-NEXT: orr r1, r2, r3
+; ARMV6-NEXT: str r1, [sp, #88] @ 4-byte Spill
+; ARMV6-NEXT: ldr r1, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: mov lr, r10
+; ARMV6-NEXT: mov r10, r4
+; ARMV6-NEXT: ldr r4, [sp, #68] @ 4-byte Reload
+; ARMV6-NEXT: lsl r3, r1, #1
+; ARMV6-NEXT: mov r1, r7
+; ARMV6-NEXT: orr r3, r3, r5, lsr #31
+; ARMV6-NEXT: orr r5, r2, r3
+; ARMV6-NEXT: mov r3, #0
+; ARMV6-NEXT: bne .LBB1_10
+; ARMV6-NEXT: .LBB1_11: @ %udiv-loop-exit
+; ARMV6-NEXT: orr r4, r0, r1, lsl #1
+; ARMV6-NEXT: lsl r0, r11, #1
+; ARMV6-NEXT: orr r3, r0, r1, lsr #31
+; ARMV6-NEXT: ldr r1, [sp, #88] @ 4-byte Reload
+; ARMV6-NEXT: ldr r10, [sp, #40] @ 4-byte Reload
+; ARMV6-NEXT: ldr r8, [sp, #36] @ 4-byte Reload
+; ARMV6-NEXT: lsl r0, r1, #1
+; ARMV6-NEXT: orr r6, r0, r11, lsr #31
+; ARMV6-NEXT: lsl r0, r5, #1
+; ARMV6-NEXT: orr r7, r0, r1, lsr #31
+; ARMV6-NEXT: .LBB1_12: @ %udiv-end
+; ARMV6-NEXT: ldr r0, [sp, #28] @ 4-byte Reload
+; ARMV6-NEXT: mov lr, r7
+; ARMV6-NEXT: ldr r1, [sp, #12] @ 4-byte Reload
+; ARMV6-NEXT: mov r7, #0
+; ARMV6-NEXT: ldr r11, [sp, #272]
+; ARMV6-NEXT: mov r12, r6
+; ARMV6-NEXT: str r1, [r0]
+; ARMV6-NEXT: mov r2, #0
+; ARMV6-NEXT: ldr r1, [sp, #16] @ 4-byte Reload
+; ARMV6-NEXT: str r1, [r0, #4]
+; ARMV6-NEXT: umull r6, r5, r11, r3
+; ARMV6-NEXT: ldr r1, [sp, #20] @ 4-byte Reload
+; ARMV6-NEXT: str r1, [r0, #8]
+; ARMV6-NEXT: ldr r1, [sp, #24] @ 4-byte Reload
+; ARMV6-NEXT: str r1, [r0, #12]
+; ARMV6-NEXT: umull r0, r1, r11, r4
+; ARMV6-NEXT: ldr r9, [sp, #276]
+; ARMV6-NEXT: umlal r1, r7, r9, r4
+; ARMV6-NEXT: str r0, [sp, #92] @ 4-byte Spill
+; ARMV6-NEXT: adds r0, r6, r1
+; ARMV6-NEXT: ldr r1, [sp, #280]
+; ARMV6-NEXT: adcs r7, r7, r5
+; ARMV6-NEXT: str r0, [sp, #88] @ 4-byte Spill
+; ARMV6-NEXT: ldr r0, [sp, #284]
+; ARMV6-NEXT: adc r2, r2, #0
+; ARMV6-NEXT: umull r6, r5, r4, r1
+; ARMV6-NEXT: mla r5, r4, r0, r5
+; ARMV6-NEXT: ldr r0, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: umlal r7, r2, r9, r3
+; ARMV6-NEXT: mla r3, r3, r1, r5
+; ARMV6-NEXT: ldr r1, [sp, #88] @ 4-byte Reload
+; ARMV6-NEXT: umull r5, r4, r12, r11
+; ARMV6-NEXT: mla r4, r12, r9, r4
+; ARMV6-NEXT: adds r6, r5, r6
+; ARMV6-NEXT: mla r4, lr, r11, r4
+; ARMV6-NEXT: adc r3, r4, r3
+; ARMV6-NEXT: adds r7, r7, r6
+; ARMV6-NEXT: adc r2, r2, r3
+; ARMV6-NEXT: subs r0, r8, r0
+; ARMV6-NEXT: ldr r3, [sp, #264]
+; ARMV6-NEXT: sbcs r1, r10, r1
+; ARMV6-NEXT: sbcs r3, r3, r7
+; ARMV6-NEXT: ldr r7, [sp, #268]
+; ARMV6-NEXT: sbc r2, r7, r2
+; ARMV6-NEXT: ldr r7, [sp, #32] @ 4-byte Reload
+; ARMV6-NEXT: stm r7, {r0, r1, r3}
+; ARMV6-NEXT: str r2, [r7, #12]
+; ARMV6-NEXT: add sp, sp, #228
+; ARMV6-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+; ARMV6-NEXT: .LBB1_13:
+; ARMV6-NEXT: ldr r6, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: ldr r11, [sp, #72] @ 4-byte Reload
+; ARMV6-NEXT: b .LBB1_5
+; ARMV6-NEXT: .LBB1_14:
+; ARMV6-NEXT: ldr r5, [sp, #92] @ 4-byte Reload
+; ARMV6-NEXT: mov r0, #0
+; ARMV6-NEXT: ldr r11, [sp, #80] @ 4-byte Reload
+; ARMV6-NEXT: b .LBB1_11
+;
+; ARMV7-LABEL: udivrem_i128:
+; ARMV7: @ %bb.0: @ %_udiv-special-cases_udiv-special-cases
+; ARMV7-NEXT: .save {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; ARMV7-NEXT: push {r4, r5, r6, r7, r8, r9, r10, r11, lr}
+; ARMV7-NEXT: .pad #228
+; ARMV7-NEXT: sub sp, sp, #228
+; ARMV7-NEXT: ldr r4, [sp, #264]
+; ARMV7-NEXT: mov r11, r3
+; ARMV7-NEXT: ldr r5, [sp, #268]
+; ARMV7-NEXT: clz r3, r3
+; ARMV7-NEXT: str r0, [sp, #24] @ 4-byte Spill
+; ARMV7-NEXT: clz r0, r4
+; ARMV7-NEXT: str r1, [sp, #28] @ 4-byte Spill
+; ARMV7-NEXT: clz r1, r2
+; ARMV7-NEXT: add r0, r0, #32
+; ARMV7-NEXT: cmp r5, #0
+; ARMV7-NEXT: clzne r0, r5
+; ARMV7-NEXT: add r1, r1, #32
+; ARMV7-NEXT: ldr r10, [sp, #280]
+; ARMV7-NEXT: cmp r11, #0
+; ARMV7-NEXT: str r1, [sp, #8] @ 4-byte Spill
+; ARMV7-NEXT: movne r1, r3
+; ARMV7-NEXT: str r3, [sp, #4] @ 4-byte Spill
+; ARMV7-NEXT: orrs r3, r4, r5
+; ARMV7-NEXT: ldr r12, [sp, #272]
+; ARMV7-NEXT: addeq r0, r1, #64
+; ARMV7-NEXT: ldr r6, [sp, #284]
+; ARMV7-NEXT: clz r1, r10
+; ARMV7-NEXT: ldr lr, [sp, #276]
+; ARMV7-NEXT: clz r3, r12
+; ARMV7-NEXT: add r1, r1, #32
+; ARMV7-NEXT: cmp r6, #0
+; ARMV7-NEXT: clzne r1, r6
+; ARMV7-NEXT: add r7, r3, #32
+; ARMV7-NEXT: cmp lr, #0
+; ARMV7-NEXT: str r4, [sp, #44] @ 4-byte Spill
+; ARMV7-NEXT: clzne r7, lr
+; ARMV7-NEXT: orrs r3, r10, r6
+; ARMV7-NEXT: addeq r1, r7, #64
+; ARMV7-NEXT: orr r7, r2, r4
+; ARMV7-NEXT: subs r9, r1, r0
+; ARMV7-NEXT: mov r0, #0
+; ARMV7-NEXT: sbcs r3, r0, #0
+; ARMV7-NEXT: str r3, [sp, #80] @ 4-byte Spill
+; ARMV7-NEXT: sbcs r8, r0, #0
+; ARMV7-NEXT: str r5, [sp, #40] @ 4-byte Spill
+; ARMV7-NEXT: sbc r1, r0, #0
+; ARMV7-NEXT: rsbs r0, r9, #127
+; ARMV7-NEXT: rscs r0, r3, #0
+; ARMV7-NEXT: str r1, [sp, #84] @ 4-byte Spill
+; ARMV7-NEXT: rscs r0, r8, #0
+; ARMV7-NEXT: orr r3, r12, r10
+; ARMV7-NEXT: rscs r0, r1, #0
+; ARMV7-NEXT: orr r1, lr, r6
+; ARMV7-NEXT: orr r1, r3, r1
+; ARMV7-NEXT: orr r3, r11, r5
+; ARMV7-NEXT: orr r3, r7, r3
+; ARMV7-NEXT: clz r1, r1
+; ARMV7-NEXT: clz r3, r3
+; ARMV7-NEXT: mov r0, #0
+; ARMV7-NEXT: lsr r1, r1, #5
+; ARMV7-NEXT: movwlo r0, #1
+; ARMV7-NEXT: lsr r3, r3, #5
+; ARMV7-NEXT: orr r1, r1, r3
+; ARMV7-NEXT: orrs r0, r1, r0
+; ARMV7-NEXT: mov r6, r11
+; ARMV7-NEXT: mov r7, r2
+; ARMV7-NEXT: movwne r5, #0
+; ARMV7-NEXT: movwne r4, #0
+; ARMV7-NEXT: movwne r6, #0
+; ARMV7-NEXT: movwne r7, #0
+; ARMV7-NEXT: str r2, [sp, #36] @ 4-byte Spill
+; ARMV7-NEXT: str r11, [sp, #32] @ 4-byte Spill
+; ARMV7-NEXT: bne .LBB1_6
+; ARMV7-NEXT: @ %bb.1: @ %_udiv-special-cases_udiv-special-cases
+; ARMV7-NEXT: ldr r1, [sp, #84] @ 4-byte Reload
+; ARMV7-NEXT: eor r0, r9, #127
+; ARMV7-NEXT: ldr r2, [sp, #80] @ 4-byte Reload
+; ARMV7-NEXT: orr r0, r0, r8
+; ARMV7-NEXT: str r8, [sp, #76] @ 4-byte Spill
+; ARMV7-NEXT: orr r2, r2, r1
+; ARMV7-NEXT: orrs r0, r0, r2
+; ARMV7-NEXT: beq .LBB1_6
+; ARMV7-NEXT: @ %bb.2: @ %udiv-bb15
+; ARMV7-NEXT: ldr r8, [sp, #36] @ 4-byte Reload
+; ARMV7-NEXT: mov r0, #0
+; ARMV7-NEXT: str r8, [sp, #208]
+; ARMV7-NEXT: add r3, sp, #192
+; ARMV7-NEXT: str r0, [sp, #204]
+; ARMV7-NEXT: mov r2, #12
+; ARMV7-NEXT: str r0, [sp, #200]
+; ARMV7-NEXT: add r3, r3, #16
+; ARMV7-NEXT: str r0, [sp, #196]
+; ARMV7-NEXT: str r0, [sp, #192]
+; ARMV7-NEXT: rsb r0, r9, #127
+; ARMV7-NEXT: str r11, [sp, #212]
+; ARMV7-NEXT: ldr r12, [sp, #44] @ 4-byte Reload
+; ARMV7-NEXT: and r2, r2, r0, lsr #3
+; ARMV7-NEXT: str r12, [sp, #216]
+; ARMV7-NEXT: and r0, r0, #31
+; ARMV7-NEXT: ldr r10, [sp, #40] @ 4-byte Reload
+; ARMV7-NEXT: eor r1, r0, #31
+; ARMV7-NEXT: str r10, [sp, #220]
+; ARMV7-NEXT: ldr r7, [r3, -r2]!
+; ARMV7-NEXT: ldmib r3, {r2, r4}
+; ARMV7-NEXT: lsr r6, r7, #1
+; ARMV7-NEXT: ldr r3, [r3, #12]
+; ARMV7-NEXT: lsl r5, r2, r0
+; ARMV7-NEXT: lsrs r2, r2, #1
+; ARMV7-NEXT: orr r5, r5, r6, lsr r1
+; ARMV7-NEXT: str r5, [sp, #72] @ 4-byte Spill
+; ARMV7-NEXT: lsl r3, r3, r0
+; ARMV7-NEXT: lsr r5, r4, #1
+; ARMV7-NEXT: orr r3, r3, r5, lsr r1
+; ARMV7-NEXT: str r3, [sp, #92] @ 4-byte Spill
+; ARMV7-NEXT: lsl r3, r4, r0
+; ARMV7-NEXT: lsl r0, r7, r0
+; ARMV7-NEXT: str r0, [sp, #68] @ 4-byte Spill
+; ARMV7-NEXT: adds r5, r9, #1
+; ARMV7-NEXT: ldr r0, [sp, #80] @ 4-byte Reload
+; ARMV7-NEXT: orr r1, r3, r2, lsr r1
+; ARMV7-NEXT: str r1, [sp, #64] @ 4-byte Spill
+; ARMV7-NEXT: mov r3, #0
+; ARMV7-NEXT: adcs r0, r0, #0
+; ARMV7-NEXT: str r0, [sp, #20] @ 4-byte Spill
+; ARMV7-NEXT: ldr r0, [sp, #76] @ 4-byte Reload
+; ARMV7-NEXT: adcs r6, r0, #0
+; ARMV7-NEXT: ldr r0, [sp, #84] @ 4-byte Reload
+; ARMV7-NEXT: adcs r0, r0, #0
+; ARMV7-NEXT: str r0, [sp, #76] @ 4-byte Spill
+; ARMV7-NEXT: mov r0, #0
+; ARMV7-NEXT: str r0, [sp, #88] @ 4-byte Spill
+; ARMV7-NEXT: adcs r0, r3, #0
+; ARMV7-NEXT: bne .LBB1_13
+; ARMV7-NEXT: @ %bb.3: @ %udiv-preheader4
+; ARMV7-NEXT: mov r0, #0
+; ARMV7-NEXT: ubfx r1, r5, #5, #2
+; ARMV7-NEXT: str r0, [sp, #188]
+; ARMV7-NEXT: and r9, r5, #31
+; ARMV7-NEXT: str r0, [sp, #184]
+; ARMV7-NEXT: eor r3, r9, #31
+; ARMV7-NEXT: str r0, [sp, #180]
+; ARMV7-NEXT: str r0, [sp, #176]
+; ARMV7-NEXT: add r0, sp, #160
+; ARMV7-NEXT: stm r0, {r8, r11, r12}
+; ARMV7-NEXT: add r12, sp, #160
+; ARMV7-NEXT: add r0, r12, r1, lsl #2
+; ARMV7-NEXT: str r10, [sp, #172]
+; ARMV7-NEXT: ldmib r0, {r4, r7, r8}
+; ARMV7-NEXT: lsr r10, r7, r9
+; ARMV7-NEXT: lsl r0, r8, #1
+; ARMV7-NEXT: lsl r7, r7, #1
+; ARMV7-NEXT: str r5, [sp, #84] @ 4-byte Spill
+; ARMV7-NEXT: orr lr, r10, r0, lsl r3
+; ARMV7-NEXT: lsr r10, r4, r9
+; ARMV7-NEXT: orr r0, r10, r7, lsl r3
+; ARMV7-NEXT: str r0, [sp, #80] @ 4-byte Spill
+; ARMV7-NEXT: ldr r1, [r12, r1, lsl #2]
+; ARMV7-NEXT: lsl r7, r4, #1
+; ARMV7-NEXT: ldr r12, [sp, #276]
+; ARMV7-NEXT: lsr r11, r8, r9
+; ARMV7-NEXT: ldr r10, [sp, #76] @ 4-byte Reload
+; ARMV7-NEXT: ldr r5, [sp, #68] @ 4-byte Reload
+; ARMV7-NEXT: mov r8, #0
+; ARMV7-NEXT: lsr r1, r1, r9
+; ARMV7-NEXT: ldr r9, [sp, #20] @ 4-byte Reload
+; ARMV7-NEXT: orr r1, r1, r7, lsl r3
+; ARMV7-NEXT: ldr r7, [sp, #272]
+; ARMV7-NEXT: ldr r2, [sp, #64] @ 4-byte Reload
+; ARMV7-NEXT: subs r3, r7, #1
+; ARMV7-NEXT: ldr r7, [sp, #280]
+; ARMV7-NEXT: str r3, [sp, #60] @ 4-byte Spill
+; ARMV7-NEXT: sbcs r3, r12, #0
+; ARMV7-NEXT: str r3, [sp, #56] @ 4-byte Spill
+; ARMV7-NEXT: sbcs r3, r7, #0
+; ARMV7-NEXT: ldr r7, [sp, #284]
+; ARMV7-NEXT: str r3, [sp, #52] @ 4-byte Spill
+; ARMV7-NEXT: sbc r3, r7, #0
+; ARMV7-NEXT: str r3, [sp, #48] @ 4-byte Spill
+; ARMV7-NEXT: ldr r12, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: ldr r3, [sp, #72] @ 4-byte Reload
+; ARMV7-NEXT: .LBB1_4: @ %udiv-do-while3
+; ARMV7-NEXT: @ =>This Inner Loop Header: Depth=1
+; ARMV7-NEXT: str r3, [sp, #72] @ 4-byte Spill
+; ARMV7-NEXT: lsl r3, r11, #1
+; ARMV7-NEXT: ldr r11, [sp, #80] @ 4-byte Reload
+; ARMV7-NEXT: lsl r7, lr, #1
+; ARMV7-NEXT: ldr r0, [sp, #88] @ 4-byte Reload
+; ARMV7-NEXT: orr r3, r3, lr, lsr #31
+; ARMV7-NEXT: str r0, [sp, #64] @ 4-byte Spill
+; ARMV7-NEXT: lsl r0, r11, #1
+; ARMV7-NEXT: str r2, [sp, #76] @ 4-byte Spill
+; ARMV7-NEXT: orr r0, r0, r1, lsr #31
+; ARMV7-NEXT: lsl r1, r1, #1
+; ARMV7-NEXT: ldr r2, [sp, #60] @ 4-byte Reload
+; ARMV7-NEXT: orr r1, r1, r12, lsr #31
+; ARMV7-NEXT: orr r7, r7, r11, lsr #31
+; ARMV7-NEXT: str r5, [sp, #68] @ 4-byte Spill
+; ARMV7-NEXT: subs r4, r2, r1
+; ARMV7-NEXT: ldr r2, [sp, #56] @ 4-byte Reload
+; ARMV7-NEXT: str r12, [sp, #92] @ 4-byte Spill
+; ARMV7-NEXT: sbcs r4, r2, r0
+; ARMV7-NEXT: ldr r2, [sp, #52] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r4, r2, r7
+; ARMV7-NEXT: ldr r2, [sp, #48] @ 4-byte Reload
+; ARMV7-NEXT: sbc r4, r2, r3
+; ARMV7-NEXT: ldr r2, [sp, #284]
+; ARMV7-NEXT: and r5, r2, r4, asr #31
+; ARMV7-NEXT: ldr r2, [sp, #280]
+; ARMV7-NEXT: and lr, r2, r4, asr #31
+; ARMV7-NEXT: ldr r2, [sp, #276]
+; ARMV7-NEXT: and r11, r2, r4, asr #31
+; ARMV7-NEXT: ldr r2, [sp, #272]
+; ARMV7-NEXT: and r12, r2, r4, asr #31
+; ARMV7-NEXT: mov r2, #1
+; ARMV7-NEXT: subs r1, r1, r12
+; ARMV7-NEXT: and r2, r2, r4, asr #31
+; ARMV7-NEXT: sbcs r0, r0, r11
+; ARMV7-NEXT: ldr r4, [sp, #84] @ 4-byte Reload
+; ARMV7-NEXT: sbcs lr, r7, lr
+; ARMV7-NEXT: str r2, [sp, #88] @ 4-byte Spill
+; ARMV7-NEXT: ldr r2, [sp, #68] @ 4-byte Reload
+; ARMV7-NEXT: sbc r11, r3, r5
+; ARMV7-NEXT: subs r4, r4, #1
+; ARMV7-NEXT: str r0, [sp, #80] @ 4-byte Spill
+; ARMV7-NEXT: ldr r0, [sp, #64] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r9, r9, #0
+; ARMV7-NEXT: sbcs r6, r6, #0
+; ARMV7-NEXT: ldr r7, [sp, #76] @ 4-byte Reload
+; ARMV7-NEXT: orr r5, r0, r2, lsl #1
+; ARMV7-NEXT: ldr r0, [sp, #72] @ 4-byte Reload
+; ARMV7-NEXT: sbc r10, r10, #0
+; ARMV7-NEXT: str r4, [sp, #84] @ 4-byte Spill
+; ARMV7-NEXT: orr r3, r9, r10
+; ARMV7-NEXT: orr r4, r4, r6
+; ARMV7-NEXT: orrs r3, r4, r3
+; ARMV7-NEXT: lsl r4, r0, #1
+; ARMV7-NEXT: orr r2, r4, r2, lsr #31
+; ARMV7-NEXT: orr r3, r8, r2
+; ARMV7-NEXT: lsl r2, r7, #1
+; ARMV7-NEXT: orr r2, r2, r0, lsr #31
+; ARMV7-NEXT: ldr r0, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: orr r2, r8, r2
+; ARMV7-NEXT: lsl r4, r0, #1
+; ARMV7-NEXT: orr r4, r4, r7, lsr #31
+; ARMV7-NEXT: orr r12, r8, r4
+; ARMV7-NEXT: mov r8, #0
+; ARMV7-NEXT: bne .LBB1_4
+; ARMV7-NEXT: .LBB1_5: @ %udiv-loop-exit2
+; ARMV7-NEXT: ldr r0, [sp, #88] @ 4-byte Reload
+; ARMV7-NEXT: lsl r1, r3, #1
+; ARMV7-NEXT: orr r6, r1, r5, lsr #31
+; ARMV7-NEXT: lsl r1, r2, #1
+; ARMV7-NEXT: ldr r11, [sp, #32] @ 4-byte Reload
+; ARMV7-NEXT: orr r4, r1, r3, lsr #31
+; ARMV7-NEXT: orr r7, r0, r5, lsl #1
+; ARMV7-NEXT: lsl r1, r12, #1
+; ARMV7-NEXT: orr r5, r1, r2, lsr #31
+; ARMV7-NEXT: .LBB1_6: @ %udiv-end1
+; ARMV7-NEXT: str r5, [sp, #48] @ 4-byte Spill
+; ARMV7-NEXT: ldr r5, [sp, #44] @ 4-byte Reload
+; ARMV7-NEXT: str r4, [sp, #20] @ 4-byte Spill
+; ARMV7-NEXT: ldr r4, [sp, #40] @ 4-byte Reload
+; ARMV7-NEXT: clz r0, r5
+; ARMV7-NEXT: ldmib sp, {r1, r2} @ 8-byte Folded Reload
+; ARMV7-NEXT: add r0, r0, #32
+; ARMV7-NEXT: cmp r4, #0
+; ARMV7-NEXT: clzne r0, r4
+; ARMV7-NEXT: cmp r11, #0
+; ARMV7-NEXT: ldr lr, [sp, #280]
+; ARMV7-NEXT: movne r2, r1
+; ARMV7-NEXT: orrs r1, r5, r4
+; ARMV7-NEXT: str r6, [sp, #16] @ 4-byte Spill
+; ARMV7-NEXT: ldr r6, [sp, #284]
+; ARMV7-NEXT: clz r1, lr
+; ARMV7-NEXT: ldr r12, [sp, #272]
+; ARMV7-NEXT: addeq r0, r2, #64
+; ARMV7-NEXT: str r7, [sp, #12] @ 4-byte Spill
+; ARMV7-NEXT: add r1, r1, #32
+; ARMV7-NEXT: ldr r7, [sp, #276]
+; ARMV7-NEXT: clz r2, r12
+; ARMV7-NEXT: cmp r6, #0
+; ARMV7-NEXT: add r2, r2, #32
+; ARMV7-NEXT: clzne r1, r6
+; ARMV7-NEXT: cmp r7, #0
+; ARMV7-NEXT: clzne r2, r7
+; ARMV7-NEXT: orrs r3, lr, r6
+; ARMV7-NEXT: addeq r1, r2, #64
+; ARMV7-NEXT: mov r2, #0
+; ARMV7-NEXT: subs r10, r1, r0
+; ARMV7-NEXT: orr r3, r11, r4
+; ARMV7-NEXT: sbcs r9, r2, #0
+; ARMV7-NEXT: sbcs r1, r2, #0
+; ARMV7-NEXT: str r1, [sp, #80] @ 4-byte Spill
+; ARMV7-NEXT: sbc r8, r2, #0
+; ARMV7-NEXT: rsbs r0, r10, #127
+; ARMV7-NEXT: rscs r0, r9, #0
+; ARMV7-NEXT: rscs r0, r1, #0
+; ARMV7-NEXT: orr r1, r7, r6
+; ARMV7-NEXT: rscs r0, r8, #0
+; ARMV7-NEXT: mov r7, r11
+; ARMV7-NEXT: orr r0, r12, lr
+; ARMV7-NEXT: ldr r12, [sp, #36] @ 4-byte Reload
+; ARMV7-NEXT: orr r0, r0, r1
+; ARMV7-NEXT: movwlo r2, #1
+; ARMV7-NEXT: orr r1, r12, r5
+; ARMV7-NEXT: clz r0, r0
+; ARMV7-NEXT: orr r1, r1, r3
+; ARMV7-NEXT: mov r3, r12
+; ARMV7-NEXT: clz r1, r1
+; ARMV7-NEXT: lsr r0, r0, #5
+; ARMV7-NEXT: lsr r1, r1, #5
+; ARMV7-NEXT: orr r0, r0, r1
+; ARMV7-NEXT: orrs r0, r0, r2
+; ARMV7-NEXT: movwne r5, #0
+; ARMV7-NEXT: movwne r4, #0
+; ARMV7-NEXT: movwne r3, #0
+; ARMV7-NEXT: movwne r7, #0
+; ARMV7-NEXT: str r5, [sp, #44] @ 4-byte Spill
+; ARMV7-NEXT: str r4, [sp, #40] @ 4-byte Spill
+; ARMV7-NEXT: bne .LBB1_15
+; ARMV7-NEXT: @ %bb.7: @ %udiv-end1
+; ARMV7-NEXT: ldr r1, [sp, #80] @ 4-byte Reload
+; ARMV7-NEXT: eor r0, r10, #127
+; ARMV7-NEXT: ldr lr, [sp, #264]
+; ARMV7-NEXT: orr r0, r0, r1
+; ARMV7-NEXT: orr r1, r9, r8
+; ARMV7-NEXT: orrs r0, r0, r1
+; ARMV7-NEXT: beq .LBB1_12
+; ARMV7-NEXT: @ %bb.8: @ %udiv-bb1
+; ARMV7-NEXT: mov r0, #0
+; ARMV7-NEXT: add r3, sp, #128
+; ARMV7-NEXT: str r0, [sp, #140]
+; ARMV7-NEXT: mov r1, #12
+; ARMV7-NEXT: str r0, [sp, #136]
+; ARMV7-NEXT: add r3, r3, #16
+; ARMV7-NEXT: str r0, [sp, #132]
+; ARMV7-NEXT: str r0, [sp, #128]
+; ARMV7-NEXT: ldr r0, [sp, #268]
+; ARMV7-NEXT: str r0, [sp, #156]
+; ARMV7-NEXT: rsb r0, r10, #127
+; ARMV7-NEXT: str r12, [sp, #144]
+; ARMV7-NEXT: and r1, r1, r0, lsr #3
+; ARMV7-NEXT: str r11, [sp, #148]
+; ARMV7-NEXT: str lr, [sp, #152]
+; ARMV7-NEXT: and r0, r0, #31
+; ARMV7-NEXT: ldr r1, [r3, -r1]!
+; ARMV7-NEXT: eor r2, r0, #31
+; ARMV7-NEXT: ldmib r3, {r5, r7}
+; ARMV7-NEXT: lsr r6, r1, #1
+; ARMV7-NEXT: ldr r3, [r3, #12]
+; ARMV7-NEXT: lsl r4, r5, r0
+; ARMV7-NEXT: orr r6, r4, r6, lsr r2
+; ARMV7-NEXT: lsr r4, r7, #1
+; ARMV7-NEXT: str r6, [sp, #84] @ 4-byte Spill
+; ARMV7-NEXT: lsl r3, r3, r0
+; ARMV7-NEXT: orr r3, r3, r4, lsr r2
+; ARMV7-NEXT: lsrs r4, r5, #1
+; ARMV7-NEXT: str r3, [sp, #92] @ 4-byte Spill
+; ARMV7-NEXT: lsl r3, r7, r0
+; ARMV7-NEXT: orr r5, r3, r4, lsr r2
+; ARMV7-NEXT: adds r4, r10, #1
+; ARMV7-NEXT: lsl r7, r1, r0
+; ARMV7-NEXT: adcs r0, r9, #0
+; ARMV7-NEXT: str r0, [sp, #72] @ 4-byte Spill
+; ARMV7-NEXT: mov r1, #0
+; ARMV7-NEXT: ldr r0, [sp, #80] @ 4-byte Reload
+; ARMV7-NEXT: adcs r2, r0, #0
+; ARMV7-NEXT: adcs r0, r8, #0
+; ARMV7-NEXT: str r0, [sp, #76] @ 4-byte Spill
+; ARMV7-NEXT: mov r0, #0
+; ARMV7-NEXT: str r0, [sp, #88] @ 4-byte Spill
+; ARMV7-NEXT: adcs r0, r1, #0
+; ARMV7-NEXT: bne .LBB1_14
+; ARMV7-NEXT: @ %bb.9: @ %udiv-preheader
+; ARMV7-NEXT: mov r0, #0
+; ARMV7-NEXT: add r6, sp, #96
+; ARMV7-NEXT: str r0, [sp, #124]
+; ARMV7-NEXT: and r10, r4, #31
+; ARMV7-NEXT: str r0, [sp, #120]
+; ARMV7-NEXT: str r0, [sp, #116]
+; ARMV7-NEXT: str r0, [sp, #112]
+; ARMV7-NEXT: ldr r0, [sp, #264]
+; ARMV7-NEXT: str r0, [sp, #104]
+; ARMV7-NEXT: ldr r0, [sp, #268]
+; ARMV7-NEXT: str r0, [sp, #108]
+; ARMV7-NEXT: ubfx r0, r4, #5, #2
+; ARMV7-NEXT: str r12, [sp, #96]
+; ARMV7-NEXT: add r3, r6, r0, lsl #2
+; ARMV7-NEXT: str r11, [sp, #100]
+; ARMV7-NEXT: ldr r1, [r3, #8]
+; ARMV7-NEXT: ldr r12, [r3, #4]
+; ARMV7-NEXT: ldr r9, [r3, #12]
+; ARMV7-NEXT: str r4, [sp, #80] @ 4-byte Spill
+; ARMV7-NEXT: eor r4, r10, #31
+; ARMV7-NEXT: ldr r0, [r6, r0, lsl #2]
+; ARMV7-NEXT: lsr r11, r1, r10
+; ARMV7-NEXT: lsl r3, r9, #1
+; ARMV7-NEXT: lsl r1, r1, #1
+; ARMV7-NEXT: orr lr, r11, r3, lsl r4
+; ARMV7-NEXT: lsr r11, r12, r10
+; ARMV7-NEXT: orr r3, r11, r1, lsl r4
+; ARMV7-NEXT: lsr r0, r0, r10
+; ARMV7-NEXT: lsl r1, r12, #1
+; ARMV7-NEXT: orr r8, r0, r1, lsl r4
+; ARMV7-NEXT: ldr r0, [sp, #272]
+; ARMV7-NEXT: lsr r1, r9, r10
+; ARMV7-NEXT: ldr r6, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: subs r0, r0, #1
+; ARMV7-NEXT: str r0, [sp, #64] @ 4-byte Spill
+; ARMV7-NEXT: ldr r0, [sp, #276]
+; ARMV7-NEXT: mov r10, #0
+; ARMV7-NEXT: ldr r9, [sp, #72] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r0, r0, #0
+; ARMV7-NEXT: str r0, [sp, #60] @ 4-byte Spill
+; ARMV7-NEXT: ldr r0, [sp, #280]
+; ARMV7-NEXT: ldr r11, [sp, #76] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r0, r0, #0
+; ARMV7-NEXT: str r0, [sp, #56] @ 4-byte Spill
+; ARMV7-NEXT: ldr r0, [sp, #284]
+; ARMV7-NEXT: sbc r0, r0, #0
+; ARMV7-NEXT: str r0, [sp, #52] @ 4-byte Spill
+; ARMV7-NEXT: .LBB1_10: @ %udiv-do-while
+; ARMV7-NEXT: @ =>This Inner Loop Header: Depth=1
+; ARMV7-NEXT: ldr r4, [sp, #88] @ 4-byte Reload
+; ARMV7-NEXT: str r4, [sp, #68] @ 4-byte Spill
+; ARMV7-NEXT: lsl r4, r8, #1
+; ARMV7-NEXT: ldr r0, [sp, #64] @ 4-byte Reload
+; ARMV7-NEXT: orr r4, r4, r6, lsr #31
+; ARMV7-NEXT: str r5, [sp, #76] @ 4-byte Spill
+; ARMV7-NEXT: ldr r5, [sp, #84] @ 4-byte Reload
+; ARMV7-NEXT: str r7, [sp, #84] @ 4-byte Spill
+; ARMV7-NEXT: lsl r7, r1, #1
+; ARMV7-NEXT: lsl r1, lr, #1
+; ARMV7-NEXT: str r5, [sp, #72] @ 4-byte Spill
+; ARMV7-NEXT: orr r1, r1, r3, lsr #31
+; ARMV7-NEXT: lsl r3, r3, #1
+; ARMV7-NEXT: subs r5, r0, r4
+; ARMV7-NEXT: ldr r0, [sp, #60] @ 4-byte Reload
+; ARMV7-NEXT: orr r3, r3, r8, lsr #31
+; ARMV7-NEXT: orr r7, r7, lr, lsr #31
+; ARMV7-NEXT: sbcs r5, r0, r3
+; ARMV7-NEXT: ldr r0, [sp, #56] @ 4-byte Reload
+; ARMV7-NEXT: str r6, [sp, #92] @ 4-byte Spill
+; ARMV7-NEXT: sbcs r5, r0, r1
+; ARMV7-NEXT: ldr r0, [sp, #52] @ 4-byte Reload
+; ARMV7-NEXT: sbc r5, r0, r7
+; ARMV7-NEXT: ldr r0, [sp, #284]
+; ARMV7-NEXT: and r6, r0, r5, asr #31
+; ARMV7-NEXT: ldr r0, [sp, #280]
+; ARMV7-NEXT: and lr, r0, r5, asr #31
+; ARMV7-NEXT: ldr r0, [sp, #276]
+; ARMV7-NEXT: and r12, r0, r5, asr #31
+; ARMV7-NEXT: ldr r0, [sp, #272]
+; ARMV7-NEXT: and r8, r0, r5, asr #31
+; ARMV7-NEXT: mov r0, #1
+; ARMV7-NEXT: subs r8, r4, r8
+; ARMV7-NEXT: and r0, r0, r5, asr #31
+; ARMV7-NEXT: sbcs r3, r3, r12
+; ARMV7-NEXT: ldr r5, [sp, #80] @ 4-byte Reload
+; ARMV7-NEXT: sbcs lr, r1, lr
+; ARMV7-NEXT: str r0, [sp, #88] @ 4-byte Spill
+; ARMV7-NEXT: sbc r12, r7, r6
+; ARMV7-NEXT: subs r5, r5, #1
+; ARMV7-NEXT: sbcs r9, r9, #0
+; ARMV7-NEXT: ldr r0, [sp, #84] @ 4-byte Reload
+; ARMV7-NEXT: sbcs r2, r2, #0
+; ARMV7-NEXT: ldr r4, [sp, #72] @ 4-byte Reload
+; ARMV7-NEXT: sbc r11, r11, #0
+; ARMV7-NEXT: str r5, [sp, #80] @ 4-byte Spill
+; ARMV7-NEXT: orr r7, r9, r11
+; ARMV7-NEXT: orr r5, r5, r2
+; ARMV7-NEXT: ldr r1, [sp, #68] @ 4-byte Reload
+; ARMV7-NEXT: orrs r7, r5, r7
+; ARMV7-NEXT: lsl r5, r4, #1
+; ARMV7-NEXT: ldr r6, [sp, #76] @ 4-byte Reload
+; ARMV7-NEXT: orr r7, r1, r0, lsl #1
+; ARMV7-NEXT: orr r0, r5, r0, lsr #31
+; ARMV7-NEXT: orr r0, r10, r0
+; ARMV7-NEXT: str r0, [sp, #84] @ 4-byte Spill
+; ARMV7-NEXT: ldr r0, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: lsl r5, r6, #1
+; ARMV7-NEXT: orr r5, r5, r4, lsr #31
+; ARMV7-NEXT: mov r1, r12
+; ARMV7-NEXT: orr r5, r10, r5
+; ARMV7-NEXT: lsl r0, r0, #1
+; ARMV7-NEXT: orr r0, r0, r6, lsr #31
+; ARMV7-NEXT: orr r6, r10, r0
+; ARMV7-NEXT: mov r10, #0
+; ARMV7-NEXT: bne .LBB1_10
+; ARMV7-NEXT: .LBB1_11: @ %udiv-loop-exit
+; ARMV7-NEXT: ldr r0, [sp, #88] @ 4-byte Reload
+; ARMV7-NEXT: ldr r11, [sp, #32] @ 4-byte Reload
+; ARMV7-NEXT: orr r3, r0, r7, lsl #1
+; ARMV7-NEXT: ldr r0, [sp, #84] @ 4-byte Reload
+; ARMV7-NEXT: ldr r12, [sp, #36] @ 4-byte Reload
+; ARMV7-NEXT: ldr lr, [sp, #264]
+; ARMV7-NEXT: lsl r1, r0, #1
+; ARMV7-NEXT: orr r7, r1, r7, lsr #31
+; ARMV7-NEXT: lsl r1, r5, #1
+; ARMV7-NEXT: orr r0, r1, r0, lsr #31
+; ARMV7-NEXT: str r0, [sp, #44] @ 4-byte Spill
+; ARMV7-NEXT: lsl r0, r6, #1
+; ARMV7-NEXT: orr r0, r0, r5, lsr #31
+; ARMV7-NEXT: str r0, [sp, #40] @ 4-byte Spill
+; ARMV7-NEXT: .LBB1_12: @ %udiv-end
+; ARMV7-NEXT: ldr r10, [sp, #272]
+; ARMV7-NEXT: mov r6, #0
+; ARMV7-NEXT: ldr r4, [sp, #12] @ 4-byte Reload
+; ARMV7-NEXT: mov r2, #0
+; ARMV7-NEXT: ldr r8, [sp, #276]
+; ARMV7-NEXT: umull r0, r1, r10, r3
+; ARMV7-NEXT: umlal r1, r6, r8, r3
+; ARMV7-NEXT: str r0, [sp, #92] @ 4-byte Spill
+; ARMV7-NEXT: ldr r0, [sp, #24] @ 4-byte Reload
+; ARMV7-NEXT: str r4, [r0]
+; ARMV7-NEXT: ldr r4, [sp, #16] @ 4-byte Reload
+; ARMV7-NEXT: str r4, [r0, #4]
+; ARMV7-NEXT: ldr r4, [sp, #20] @ 4-byte Reload
+; ARMV7-NEXT: str r4, [r0, #8]
+; ARMV7-NEXT: ldr r4, [sp, #48] @ 4-byte Reload
+; ARMV7-NEXT: str r4, [r0, #12]
+; ARMV7-NEXT: umull r5, r4, r10, r7
+; ARMV7-NEXT: ldr r0, [sp, #280]
+; ARMV7-NEXT: adds r9, r5, r1
+; ARMV7-NEXT: ldr r1, [sp, #284]
+; ARMV7-NEXT: adcs r6, r6, r4
+; ARMV7-NEXT: umull r5, r4, r3, r0
+; ARMV7-NEXT: adc r2, r2, #0
+; ARMV7-NEXT: mla r3, r3, r1, r4
+; ARMV7-NEXT: umlal r6, r2, r8, r7
+; ARMV7-NEXT: mla r3, r7, r0, r3
+; ARMV7-NEXT: ldr r0, [sp, #44] @ 4-byte Reload
+; ARMV7-NEXT: umull r7, r4, r0, r10
+; ARMV7-NEXT: mla r4, r0, r8, r4
+; ARMV7-NEXT: ldr r0, [sp, #40] @ 4-byte Reload
+; ARMV7-NEXT: adds r7, r7, r5
+; ARMV7-NEXT: mla r4, r0, r10, r4
+; ARMV7-NEXT: ldr r0, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: adc r3, r4, r3
+; ARMV7-NEXT: adds r7, r6, r7
+; ARMV7-NEXT: adc r2, r2, r3
+; ARMV7-NEXT: subs r0, r12, r0
+; ARMV7-NEXT: sbcs r1, r11, r9
+; ARMV7-NEXT: sbcs r3, lr, r7
+; ARMV7-NEXT: ldr r7, [sp, #268]
+; ARMV7-NEXT: sbc r2, r7, r2
+; ARMV7-NEXT: ldr r7, [sp, #28] @ 4-byte Reload
+; ARMV7-NEXT: stm r7, {r0, r1, r3}
+; ARMV7-NEXT: str r2, [r7, #12]
+; ARMV7-NEXT: add sp, sp, #228
+; ARMV7-NEXT: pop {r4, r5, r6, r7, r8, r9, r10, r11, pc}
+; ARMV7-NEXT: .LBB1_13:
+; ARMV7-NEXT: ldr r12, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: ldr r3, [sp, #72] @ 4-byte Reload
+; ARMV7-NEXT: ldr r5, [sp, #68] @ 4-byte Reload
+; ARMV7-NEXT: ldr r2, [sp, #64] @ 4-byte Reload
+; ARMV7-NEXT: b .LBB1_5
+; ARMV7-NEXT: .LBB1_14:
+; ARMV7-NEXT: ldr r6, [sp, #92] @ 4-byte Reload
+; ARMV7-NEXT: b .LBB1_11
+; ARMV7-NEXT: .LBB1_15:
+; ARMV7-NEXT: ldr lr, [sp, #264]
+; ARMV7-NEXT: b .LBB1_12
+ %q = udiv i128 %n, %d
+ %r = urem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
diff --git a/llvm/test/CodeGen/LoongArch/i128-divrem-libcall.ll b/llvm/test/CodeGen/LoongArch/i128-divrem-libcall.ll
new file mode 100644
index 0000000000000..47ac12c03638a
--- /dev/null
+++ b/llvm/test/CodeGen/LoongArch/i128-divrem-libcall.ll
@@ -0,0 +1,132 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=loongarch64-linux-gnu | FileCheck %s
+
+define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; CHECK-LABEL: sdivrem_i128:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addi.d $sp, $sp, -80
+; CHECK-NEXT: .cfi_def_cfa_offset 80
+; CHECK-NEXT: st.d $ra, $sp, 72 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $fp, $sp, 64 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s0, $sp, 56 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s1, $sp, 48 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s2, $sp, 40 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s3, $sp, 32 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s4, $sp, 24 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s5, $sp, 16 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s6, $sp, 8 # 8-byte Folded Spill
+; CHECK-NEXT: .cfi_offset 1, -8
+; CHECK-NEXT: .cfi_offset 22, -16
+; CHECK-NEXT: .cfi_offset 23, -24
+; CHECK-NEXT: .cfi_offset 24, -32
+; CHECK-NEXT: .cfi_offset 25, -40
+; CHECK-NEXT: .cfi_offset 26, -48
+; CHECK-NEXT: .cfi_offset 27, -56
+; CHECK-NEXT: .cfi_offset 28, -64
+; CHECK-NEXT: .cfi_offset 29, -72
+; CHECK-NEXT: move $fp, $a5
+; CHECK-NEXT: move $s0, $a4
+; CHECK-NEXT: move $s1, $a3
+; CHECK-NEXT: move $s2, $a2
+; CHECK-NEXT: move $s3, $a1
+; CHECK-NEXT: move $s4, $a0
+; CHECK-NEXT: move $a0, $a2
+; CHECK-NEXT: move $a1, $a3
+; CHECK-NEXT: move $a2, $a4
+; CHECK-NEXT: move $a3, $a5
+; CHECK-NEXT: pcaddu18i $ra, %call36(__divti3)
+; CHECK-NEXT: jirl $ra, $ra, 0
+; CHECK-NEXT: move $s5, $a0
+; CHECK-NEXT: move $s6, $a1
+; CHECK-NEXT: move $a0, $s2
+; CHECK-NEXT: move $a1, $s1
+; CHECK-NEXT: move $a2, $s0
+; CHECK-NEXT: move $a3, $fp
+; CHECK-NEXT: pcaddu18i $ra, %call36(__modti3)
+; CHECK-NEXT: jirl $ra, $ra, 0
+; CHECK-NEXT: st.d $s5, $s4, 0
+; CHECK-NEXT: st.d $s6, $s4, 8
+; CHECK-NEXT: st.d $a0, $s3, 0
+; CHECK-NEXT: st.d $a1, $s3, 8
+; CHECK-NEXT: ld.d $s6, $sp, 8 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $s5, $sp, 16 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $s4, $sp, 24 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $s3, $sp, 32 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $s2, $sp, 40 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $s1, $sp, 48 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $s0, $sp, 56 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $fp, $sp, 64 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $ra, $sp, 72 # 8-byte Folded Reload
+; CHECK-NEXT: addi.d $sp, $sp, 80
+; CHECK-NEXT: ret
+ %q = sdiv i128 %n, %d
+ %r = srem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
+
+define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; CHECK-LABEL: udivrem_i128:
+; CHECK: # %bb.0:
+; CHECK-NEXT: addi.d $sp, $sp, -80
+; CHECK-NEXT: .cfi_def_cfa_offset 80
+; CHECK-NEXT: st.d $ra, $sp, 72 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $fp, $sp, 64 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s0, $sp, 56 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s1, $sp, 48 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s2, $sp, 40 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s3, $sp, 32 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s4, $sp, 24 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s5, $sp, 16 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s6, $sp, 8 # 8-byte Folded Spill
+; CHECK-NEXT: .cfi_offset 1, -8
+; CHECK-NEXT: .cfi_offset 22, -16
+; CHECK-NEXT: .cfi_offset 23, -24
+; CHECK-NEXT: .cfi_offset 24, -32
+; CHECK-NEXT: .cfi_offset 25, -40
+; CHECK-NEXT: .cfi_offset 26, -48
+; CHECK-NEXT: .cfi_offset 27, -56
+; CHECK-NEXT: .cfi_offset 28, -64
+; CHECK-NEXT: .cfi_offset 29, -72
+; CHECK-NEXT: move $fp, $a5
+; CHECK-NEXT: move $s0, $a4
+; CHECK-NEXT: move $s1, $a3
+; CHECK-NEXT: move $s2, $a2
+; CHECK-NEXT: move $s3, $a1
+; CHECK-NEXT: move $s4, $a0
+; CHECK-NEXT: move $a0, $a2
+; CHECK-NEXT: move $a1, $a3
+; CHECK-NEXT: move $a2, $a4
+; CHECK-NEXT: move $a3, $a5
+; CHECK-NEXT: pcaddu18i $ra, %call36(__udivti3)
+; CHECK-NEXT: jirl $ra, $ra, 0
+; CHECK-NEXT: move $s5, $a0
+; CHECK-NEXT: move $s6, $a1
+; CHECK-NEXT: move $a0, $s2
+; CHECK-NEXT: move $a1, $s1
+; CHECK-NEXT: move $a2, $s0
+; CHECK-NEXT: move $a3, $fp
+; CHECK-NEXT: pcaddu18i $ra, %call36(__umodti3)
+; CHECK-NEXT: jirl $ra, $ra, 0
+; CHECK-NEXT: st.d $s5, $s4, 0
+; CHECK-NEXT: st.d $s6, $s4, 8
+; CHECK-NEXT: st.d $a0, $s3, 0
+; CHECK-NEXT: st.d $a1, $s3, 8
+; CHECK-NEXT: ld.d $s6, $sp, 8 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $s5, $sp, 16 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $s4, $sp, 24 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $s3, $sp, 32 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $s2, $sp, 40 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $s1, $sp, 48 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $s0, $sp, 56 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $fp, $sp, 64 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $ra, $sp, 72 # 8-byte Folded Reload
+; CHECK-NEXT: addi.d $sp, $sp, 80
+; CHECK-NEXT: ret
+ %q = udiv i128 %n, %d
+ %r = urem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
diff --git a/llvm/test/CodeGen/PowerPC/i128-divrem-libcall.ll b/llvm/test/CodeGen/PowerPC/i128-divrem-libcall.ll
new file mode 100644
index 0000000000000..289d40b0f6c80
--- /dev/null
+++ b/llvm/test/CodeGen/PowerPC/i128-divrem-libcall.ll
@@ -0,0 +1,136 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=powerpc64-linux-gnu | FileCheck %s
+
+define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; CHECK-LABEL: sdivrem_i128:
+; CHECK: # %bb.0:
+; CHECK-NEXT: mflr 0
+; CHECK-NEXT: stdu 1, -192(1)
+; CHECK-NEXT: std 0, 208(1)
+; CHECK-NEXT: .cfi_def_cfa_offset 192
+; CHECK-NEXT: .cfi_offset lr, 16
+; CHECK-NEXT: .cfi_offset r23, -72
+; CHECK-NEXT: .cfi_offset r24, -64
+; CHECK-NEXT: .cfi_offset r25, -56
+; CHECK-NEXT: .cfi_offset r26, -48
+; CHECK-NEXT: .cfi_offset r27, -40
+; CHECK-NEXT: .cfi_offset r28, -32
+; CHECK-NEXT: .cfi_offset r29, -24
+; CHECK-NEXT: .cfi_offset r30, -16
+; CHECK-NEXT: std 25, 136(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 25, 3
+; CHECK-NEXT: mr 3, 5
+; CHECK-NEXT: std 26, 144(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 26, 4
+; CHECK-NEXT: mr 4, 6
+; CHECK-NEXT: std 27, 152(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 27, 5
+; CHECK-NEXT: mr 5, 7
+; CHECK-NEXT: std 28, 160(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 28, 6
+; CHECK-NEXT: mr 6, 8
+; CHECK-NEXT: std 23, 120(1) # 8-byte Folded Spill
+; CHECK-NEXT: std 24, 128(1) # 8-byte Folded Spill
+; CHECK-NEXT: std 29, 168(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 29, 7
+; CHECK-NEXT: std 30, 176(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 30, 8
+; CHECK-NEXT: bl __divti3
+; CHECK-NEXT: nop
+; CHECK-NEXT: mr 24, 3
+; CHECK-NEXT: mr 23, 4
+; CHECK-NEXT: mr 3, 27
+; CHECK-NEXT: mr 4, 28
+; CHECK-NEXT: mr 5, 29
+; CHECK-NEXT: mr 6, 30
+; CHECK-NEXT: bl __modti3
+; CHECK-NEXT: nop
+; CHECK-NEXT: std 24, 0(25)
+; CHECK-NEXT: std 23, 8(25)
+; CHECK-NEXT: std 3, 0(26)
+; CHECK-NEXT: std 4, 8(26)
+; CHECK-NEXT: ld 30, 176(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 29, 168(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 28, 160(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 27, 152(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 26, 144(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 25, 136(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 24, 128(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 23, 120(1) # 8-byte Folded Reload
+; CHECK-NEXT: addi 1, 1, 192
+; CHECK-NEXT: ld 0, 16(1)
+; CHECK-NEXT: mtlr 0
+; CHECK-NEXT: blr
+ %q = sdiv i128 %n, %d
+ %r = srem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
+
+define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; CHECK-LABEL: udivrem_i128:
+; CHECK: # %bb.0:
+; CHECK-NEXT: mflr 0
+; CHECK-NEXT: stdu 1, -192(1)
+; CHECK-NEXT: std 0, 208(1)
+; CHECK-NEXT: .cfi_def_cfa_offset 192
+; CHECK-NEXT: .cfi_offset lr, 16
+; CHECK-NEXT: .cfi_offset r23, -72
+; CHECK-NEXT: .cfi_offset r24, -64
+; CHECK-NEXT: .cfi_offset r25, -56
+; CHECK-NEXT: .cfi_offset r26, -48
+; CHECK-NEXT: .cfi_offset r27, -40
+; CHECK-NEXT: .cfi_offset r28, -32
+; CHECK-NEXT: .cfi_offset r29, -24
+; CHECK-NEXT: .cfi_offset r30, -16
+; CHECK-NEXT: std 25, 136(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 25, 3
+; CHECK-NEXT: mr 3, 5
+; CHECK-NEXT: std 26, 144(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 26, 4
+; CHECK-NEXT: mr 4, 6
+; CHECK-NEXT: std 27, 152(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 27, 5
+; CHECK-NEXT: mr 5, 7
+; CHECK-NEXT: std 28, 160(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 28, 6
+; CHECK-NEXT: mr 6, 8
+; CHECK-NEXT: std 23, 120(1) # 8-byte Folded Spill
+; CHECK-NEXT: std 24, 128(1) # 8-byte Folded Spill
+; CHECK-NEXT: std 29, 168(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 29, 7
+; CHECK-NEXT: std 30, 176(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 30, 8
+; CHECK-NEXT: bl __udivti3
+; CHECK-NEXT: nop
+; CHECK-NEXT: mr 24, 3
+; CHECK-NEXT: mr 23, 4
+; CHECK-NEXT: mr 3, 27
+; CHECK-NEXT: mr 4, 28
+; CHECK-NEXT: mr 5, 29
+; CHECK-NEXT: mr 6, 30
+; CHECK-NEXT: bl __umodti3
+; CHECK-NEXT: nop
+; CHECK-NEXT: std 24, 0(25)
+; CHECK-NEXT: std 23, 8(25)
+; CHECK-NEXT: std 3, 0(26)
+; CHECK-NEXT: std 4, 8(26)
+; CHECK-NEXT: ld 30, 176(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 29, 168(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 28, 160(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 27, 152(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 26, 144(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 25, 136(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 24, 128(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 23, 120(1) # 8-byte Folded Reload
+; CHECK-NEXT: addi 1, 1, 192
+; CHECK-NEXT: ld 0, 16(1)
+; CHECK-NEXT: mtlr 0
+; CHECK-NEXT: blr
+ %q = udiv i128 %n, %d
+ %r = urem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
diff --git a/llvm/test/CodeGen/RISCV/i128-divrem-libcall-rv32.ll b/llvm/test/CodeGen/RISCV/i128-divrem-libcall-rv32.ll
new file mode 100644
index 0000000000000..c9d68c7a38937
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/i128-divrem-libcall-rv32.ll
@@ -0,0 +1,4935 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=riscv32-linux-gnu | FileCheck %s --check-prefix=RV32I
+; RUN: llc < %s -mtriple=riscv32-linux-gnu -mattr=+m | FileCheck %s --check-prefix=RV32M
+
+; RV32 inline-expands i128 div/rem, so keep the checks focused on the absence
+; of libcalls instead of the whole expanded algorithm.
+
+define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; RV32I-LABEL: sdivrem_i128:
+; RV32I: # %bb.0: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: addi sp, sp, -288
+; RV32I-NEXT: .cfi_def_cfa_offset 288
+; RV32I-NEXT: sw ra, 284(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s0, 280(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s1, 276(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s2, 272(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s3, 268(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s4, 264(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s5, 260(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s6, 256(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s7, 252(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s8, 248(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s9, 244(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s10, 240(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s11, 236(sp) # 4-byte Folded Spill
+; RV32I-NEXT: .cfi_offset ra, -4
+; RV32I-NEXT: .cfi_offset s0, -8
+; RV32I-NEXT: .cfi_offset s1, -12
+; RV32I-NEXT: .cfi_offset s2, -16
+; RV32I-NEXT: .cfi_offset s3, -20
+; RV32I-NEXT: .cfi_offset s4, -24
+; RV32I-NEXT: .cfi_offset s5, -28
+; RV32I-NEXT: .cfi_offset s6, -32
+; RV32I-NEXT: .cfi_offset s7, -36
+; RV32I-NEXT: .cfi_offset s8, -40
+; RV32I-NEXT: .cfi_offset s9, -44
+; RV32I-NEXT: .cfi_offset s10, -48
+; RV32I-NEXT: .cfi_offset s11, -52
+; RV32I-NEXT: sw a1, 52(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw a0, 48(sp) # 4-byte Folded Spill
+; RV32I-NEXT: lw t2, 0(a2)
+; RV32I-NEXT: lw s3, 4(a2)
+; RV32I-NEXT: lw s11, 8(a2)
+; RV32I-NEXT: lw ra, 0(a3)
+; RV32I-NEXT: lw t3, 4(a3)
+; RV32I-NEXT: lw a7, 8(a3)
+; RV32I-NEXT: lw t0, 12(a3)
+; RV32I-NEXT: lw t4, 12(a2)
+; RV32I-NEXT: or a0, t2, s3
+; RV32I-NEXT: snez a1, s11
+; RV32I-NEXT: snez t1, a0
+; RV32I-NEXT: add a1, t4, a1
+; RV32I-NEXT: snez s2, t2
+; RV32I-NEXT: sw a1, 24(sp) # 4-byte Folded Spill
+; RV32I-NEXT: bltz t4, .LBB0_2
+; RV32I-NEXT: # %bb.1: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: mv s4, t4
+; RV32I-NEXT: mv t6, s11
+; RV32I-NEXT: mv s5, s3
+; RV32I-NEXT: mv s6, t2
+; RV32I-NEXT: j .LBB0_3
+; RV32I-NEXT: .LBB0_2:
+; RV32I-NEXT: neg a0, s11
+; RV32I-NEXT: neg a1, a1
+; RV32I-NEXT: neg a2, s3
+; RV32I-NEXT: sltu a3, a0, t1
+; RV32I-NEXT: sub t6, a0, t1
+; RV32I-NEXT: sub s5, a2, s2
+; RV32I-NEXT: sub s4, a1, a3
+; RV32I-NEXT: neg s6, t2
+; RV32I-NEXT: .LBB0_3: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: or a0, ra, t3
+; RV32I-NEXT: snez a1, a7
+; RV32I-NEXT: snez a4, a0
+; RV32I-NEXT: add a1, t0, a1
+; RV32I-NEXT: snez a5, ra
+; RV32I-NEXT: sw a4, 20(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw a5, 16(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw a1, 12(sp) # 4-byte Folded Spill
+; RV32I-NEXT: bltz t0, .LBB0_5
+; RV32I-NEXT: # %bb.4: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: mv s9, t0
+; RV32I-NEXT: mv s8, a7
+; RV32I-NEXT: mv t5, t3
+; RV32I-NEXT: sw ra, 92(sp) # 4-byte Folded Spill
+; RV32I-NEXT: j .LBB0_6
+; RV32I-NEXT: .LBB0_5:
+; RV32I-NEXT: neg a0, a7
+; RV32I-NEXT: neg a1, a1
+; RV32I-NEXT: neg a2, t3
+; RV32I-NEXT: sltu a3, a0, a4
+; RV32I-NEXT: sub s8, a0, a4
+; RV32I-NEXT: sub t5, a2, a5
+; RV32I-NEXT: sub s9, a1, a3
+; RV32I-NEXT: neg a0, ra
+; RV32I-NEXT: sw a0, 92(sp) # 4-byte Folded Spill
+; RV32I-NEXT: .LBB0_6: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: lui a0, 349525
+; RV32I-NEXT: lui a1, 209715
+; RV32I-NEXT: lui a2, 61681
+; RV32I-NEXT: addi s7, a0, 1365
+; RV32I-NEXT: addi s1, a1, 819
+; RV32I-NEXT: addi a1, a2, -241
+; RV32I-NEXT: bnez t5, .LBB0_9
+; RV32I-NEXT: # %bb.7: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: lw a2, 92(sp) # 4-byte Folded Reload
+; RV32I-NEXT: srli a0, a2, 1
+; RV32I-NEXT: or a0, a2, a0
+; RV32I-NEXT: srli a2, a0, 2
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 8
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 16
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: not a0, a0
+; RV32I-NEXT: srli a2, a0, 1
+; RV32I-NEXT: and a2, a2, s7
+; RV32I-NEXT: sub a0, a0, a2
+; RV32I-NEXT: and a2, a0, s1
+; RV32I-NEXT: srli a0, a0, 2
+; RV32I-NEXT: and a0, a0, s1
+; RV32I-NEXT: add a0, a2, a0
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: and a0, a0, a1
+; RV32I-NEXT: slli a2, a0, 8
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: slli a2, a0, 16
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: srli a0, a0, 24
+; RV32I-NEXT: addi a5, a0, 32
+; RV32I-NEXT: or a6, s8, s9
+; RV32I-NEXT: beqz s9, .LBB0_10
+; RV32I-NEXT: .LBB0_8:
+; RV32I-NEXT: srli a0, s9, 1
+; RV32I-NEXT: or a0, s9, a0
+; RV32I-NEXT: srli a2, a0, 2
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 8
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 16
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: not a0, a0
+; RV32I-NEXT: srli a2, a0, 1
+; RV32I-NEXT: and a2, a2, s7
+; RV32I-NEXT: sub a0, a0, a2
+; RV32I-NEXT: and a2, a0, s1
+; RV32I-NEXT: srli a0, a0, 2
+; RV32I-NEXT: and a0, a0, s1
+; RV32I-NEXT: add a0, a2, a0
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: and a0, a0, a1
+; RV32I-NEXT: slli a2, a0, 8
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: slli a2, a0, 16
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: srli a4, a0, 24
+; RV32I-NEXT: j .LBB0_11
+; RV32I-NEXT: .LBB0_9:
+; RV32I-NEXT: srli a0, t5, 1
+; RV32I-NEXT: or a0, t5, a0
+; RV32I-NEXT: srli a2, a0, 2
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 8
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 16
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: not a0, a0
+; RV32I-NEXT: srli a2, a0, 1
+; RV32I-NEXT: and a2, a2, s7
+; RV32I-NEXT: sub a0, a0, a2
+; RV32I-NEXT: and a2, a0, s1
+; RV32I-NEXT: srli a0, a0, 2
+; RV32I-NEXT: and a0, a0, s1
+; RV32I-NEXT: add a0, a2, a0
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: and a0, a0, a1
+; RV32I-NEXT: slli a2, a0, 8
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: slli a2, a0, 16
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: srli a5, a0, 24
+; RV32I-NEXT: or a6, s8, s9
+; RV32I-NEXT: bnez s9, .LBB0_8
+; RV32I-NEXT: .LBB0_10: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: srli a0, s8, 1
+; RV32I-NEXT: or a0, s8, a0
+; RV32I-NEXT: srli a2, a0, 2
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 8
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 16
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: not a0, a0
+; RV32I-NEXT: srli a2, a0, 1
+; RV32I-NEXT: and a2, a2, s7
+; RV32I-NEXT: sub a0, a0, a2
+; RV32I-NEXT: and a2, a0, s1
+; RV32I-NEXT: srli a0, a0, 2
+; RV32I-NEXT: and a0, a0, s1
+; RV32I-NEXT: add a0, a2, a0
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: and a0, a0, a1
+; RV32I-NEXT: slli a2, a0, 8
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: slli a2, a0, 16
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: srli a0, a0, 24
+; RV32I-NEXT: addi a4, a0, 32
+; RV32I-NEXT: .LBB0_11: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: sw t0, 100(sp) # 4-byte Folded Spill
+; RV32I-NEXT: addi a0, a5, 64
+; RV32I-NEXT: bnez a6, .LBB0_13
+; RV32I-NEXT: # %bb.12: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: mv a4, a0
+; RV32I-NEXT: .LBB0_13: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: snez s0, a6
+; RV32I-NEXT: sw a7, 96(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw t1, 32(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s2, 28(sp) # 4-byte Folded Spill
+; RV32I-NEXT: bnez s5, .LBB0_15
+; RV32I-NEXT: # %bb.14: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: srli a2, s6, 1
+; RV32I-NEXT: or a2, s6, a2
+; RV32I-NEXT: srli a3, a2, 2
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 8
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 16
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: not a2, a2
+; RV32I-NEXT: srli a3, a2, 1
+; RV32I-NEXT: and a3, a3, s7
+; RV32I-NEXT: sub a2, a2, a3
+; RV32I-NEXT: and a3, a2, s1
+; RV32I-NEXT: srli a2, a2, 2
+; RV32I-NEXT: and a2, a2, s1
+; RV32I-NEXT: add a2, a3, a2
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: and a2, a2, a1
+; RV32I-NEXT: slli a3, a2, 8
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: slli a3, a2, 16
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: srli a2, a2, 24
+; RV32I-NEXT: addi a2, a2, 32
+; RV32I-NEXT: j .LBB0_16
+; RV32I-NEXT: .LBB0_15:
+; RV32I-NEXT: srli a2, s5, 1
+; RV32I-NEXT: or a2, s5, a2
+; RV32I-NEXT: srli a3, a2, 2
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 8
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 16
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: not a2, a2
+; RV32I-NEXT: srli a3, a2, 1
+; RV32I-NEXT: and a3, a3, s7
+; RV32I-NEXT: sub a2, a2, a3
+; RV32I-NEXT: and a3, a2, s1
+; RV32I-NEXT: srli a2, a2, 2
+; RV32I-NEXT: and a2, a2, s1
+; RV32I-NEXT: add a2, a3, a2
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: and a2, a2, a1
+; RV32I-NEXT: slli a3, a2, 8
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: slli a3, a2, 16
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: srli a2, a2, 24
+; RV32I-NEXT: .LBB0_16: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: sw s8, 88(sp) # 4-byte Folded Spill
+; RV32I-NEXT: lw a3, 92(sp) # 4-byte Folded Reload
+; RV32I-NEXT: or a6, a3, s8
+; RV32I-NEXT: sw s9, 84(sp) # 4-byte Folded Spill
+; RV32I-NEXT: or a7, t5, s9
+; RV32I-NEXT: or t0, s6, t6
+; RV32I-NEXT: or t1, s5, s4
+; RV32I-NEXT: sltu a5, a0, a5
+; RV32I-NEXT: addi s0, s0, -1
+; RV32I-NEXT: addi a0, a2, 64
+; RV32I-NEXT: or s2, t6, s4
+; RV32I-NEXT: sltu s8, a0, a2
+; RV32I-NEXT: snez s9, s2
+; RV32I-NEXT: addi s9, s9, -1
+; RV32I-NEXT: bnez s4, .LBB0_18
+; RV32I-NEXT: # %bb.17: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: srli a2, t6, 1
+; RV32I-NEXT: or a2, t6, a2
+; RV32I-NEXT: srli a3, a2, 2
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 8
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 16
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: not a2, a2
+; RV32I-NEXT: srli a3, a2, 1
+; RV32I-NEXT: and a3, a3, s7
+; RV32I-NEXT: sub a2, a2, a3
+; RV32I-NEXT: and a3, a2, s1
+; RV32I-NEXT: srli a2, a2, 2
+; RV32I-NEXT: and a2, a2, s1
+; RV32I-NEXT: add a2, a3, a2
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: and a1, a2, a1
+; RV32I-NEXT: slli a2, a1, 8
+; RV32I-NEXT: add a1, a1, a2
+; RV32I-NEXT: slli a2, a1, 16
+; RV32I-NEXT: add a1, a1, a2
+; RV32I-NEXT: srli a1, a1, 24
+; RV32I-NEXT: addi a2, a1, 32
+; RV32I-NEXT: j .LBB0_19
+; RV32I-NEXT: .LBB0_18:
+; RV32I-NEXT: srli a2, s4, 1
+; RV32I-NEXT: or a2, s4, a2
+; RV32I-NEXT: srli a3, a2, 2
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 8
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 16
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: not a2, a2
+; RV32I-NEXT: srli a3, a2, 1
+; RV32I-NEXT: and a3, a3, s7
+; RV32I-NEXT: sub a2, a2, a3
+; RV32I-NEXT: and a3, a2, s1
+; RV32I-NEXT: srli a2, a2, 2
+; RV32I-NEXT: and a2, a2, s1
+; RV32I-NEXT: add a2, a3, a2
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: and a1, a2, a1
+; RV32I-NEXT: slli a2, a1, 8
+; RV32I-NEXT: add a1, a1, a2
+; RV32I-NEXT: slli a2, a1, 16
+; RV32I-NEXT: add a1, a1, a2
+; RV32I-NEXT: srli a2, a1, 24
+; RV32I-NEXT: .LBB0_19: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: or a3, a6, a7
+; RV32I-NEXT: or a6, t0, t1
+; RV32I-NEXT: and a5, s0, a5
+; RV32I-NEXT: and a1, s9, s8
+; RV32I-NEXT: bnez s2, .LBB0_21
+; RV32I-NEXT: # %bb.20: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: mv a2, a0
+; RV32I-NEXT: .LBB0_21: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: sw t3, 56(sp) # 4-byte Folded Spill
+; RV32I-NEXT: seqz a0, a3
+; RV32I-NEXT: seqz a3, a6
+; RV32I-NEXT: sltu a7, a4, a2
+; RV32I-NEXT: sub t0, a5, a1
+; RV32I-NEXT: mv a6, a7
+; RV32I-NEXT: lw t1, 100(sp) # 4-byte Folded Reload
+; RV32I-NEXT: beq a5, a1, .LBB0_23
+; RV32I-NEXT: # %bb.22: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: sltu a6, a5, a1
+; RV32I-NEXT: .LBB0_23: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: sub a1, t0, a7
+; RV32I-NEXT: or a3, a0, a3
+; RV32I-NEXT: neg a0, a6
+; RV32I-NEXT: seqz s10, a6
+; RV32I-NEXT: addi s10, s10, -1
+; RV32I-NEXT: sub a2, a4, a2
+; RV32I-NEXT: or a5, a0, s10
+; RV32I-NEXT: xor a4, t1, t4
+; RV32I-NEXT: beqz a5, .LBB0_25
+; RV32I-NEXT: # %bb.24: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: snez a5, a5
+; RV32I-NEXT: j .LBB0_26
+; RV32I-NEXT: .LBB0_25:
+; RV32I-NEXT: snez a5, a1
+; RV32I-NEXT: sltiu a6, a2, 128
+; RV32I-NEXT: xori a6, a6, 1
+; RV32I-NEXT: or a5, a6, a5
+; RV32I-NEXT: .LBB0_26: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: srai s2, a4, 31
+; RV32I-NEXT: or a5, a3, a5
+; RV32I-NEXT: addi a4, a5, -1
+; RV32I-NEXT: and s8, a4, s4
+; RV32I-NEXT: and s7, a4, t6
+; RV32I-NEXT: and a3, a4, s5
+; RV32I-NEXT: and a4, a4, s6
+; RV32I-NEXT: sw t4, 60(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s2, 64(sp) # 4-byte Folded Spill
+; RV32I-NEXT: bnez a5, .LBB0_37
+; RV32I-NEXT: # %bb.27: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: xori a5, a2, 127
+; RV32I-NEXT: or a5, a5, a0
+; RV32I-NEXT: or a6, a1, s10
+; RV32I-NEXT: or a5, a5, a6
+; RV32I-NEXT: beqz a5, .LBB0_37
+; RV32I-NEXT: # %bb.28: # %udiv-bb15
+; RV32I-NEXT: sw ra, 44(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s11, 68(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s3, 72(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw t2, 76(sp) # 4-byte Folded Spill
+; RV32I-NEXT: addi s7, a2, 1
+; RV32I-NEXT: li a4, 127
+; RV32I-NEXT: sub a4, a4, a2
+; RV32I-NEXT: sw zero, 200(sp)
+; RV32I-NEXT: sw zero, 204(sp)
+; RV32I-NEXT: sw zero, 208(sp)
+; RV32I-NEXT: sw zero, 212(sp)
+; RV32I-NEXT: sw s6, 216(sp)
+; RV32I-NEXT: sw s5, 220(sp)
+; RV32I-NEXT: sw t6, 224(sp)
+; RV32I-NEXT: sw s4, 228(sp)
+; RV32I-NEXT: addi a2, sp, 216
+; RV32I-NEXT: seqz s8, s7
+; RV32I-NEXT: srli a3, a4, 3
+; RV32I-NEXT: andi a5, a4, 31
+; RV32I-NEXT: add s8, a1, s8
+; RV32I-NEXT: andi a3, a3, 12
+; RV32I-NEXT: xori a5, a5, 31
+; RV32I-NEXT: or a1, s7, s8
+; RV32I-NEXT: sub a2, a2, a3
+; RV32I-NEXT: seqz a1, a1
+; RV32I-NEXT: lw a3, 0(a2)
+; RV32I-NEXT: lw a6, 4(a2)
+; RV32I-NEXT: lw a7, 8(a2)
+; RV32I-NEXT: lw a2, 12(a2)
+; RV32I-NEXT: add a1, a0, a1
+; RV32I-NEXT: sltu a0, a1, a0
+; RV32I-NEXT: or t0, s7, a1
+; RV32I-NEXT: add s10, s10, a0
+; RV32I-NEXT: or a0, s8, s10
+; RV32I-NEXT: srli t1, a7, 1
+; RV32I-NEXT: srli t2, a6, 1
+; RV32I-NEXT: or a0, t0, a0
+; RV32I-NEXT: srli t0, a3, 1
+; RV32I-NEXT: srl t1, t1, a5
+; RV32I-NEXT: srl t2, t2, a5
+; RV32I-NEXT: srl a5, t0, a5
+; RV32I-NEXT: sll a2, a2, a4
+; RV32I-NEXT: or t0, a2, t1
+; RV32I-NEXT: sll a2, a7, a4
+; RV32I-NEXT: sll a6, a6, a4
+; RV32I-NEXT: or t2, a2, t2
+; RV32I-NEXT: or a6, a6, a5
+; RV32I-NEXT: sll s9, a3, a4
+; RV32I-NEXT: li ra, 0
+; RV32I-NEXT: beqz a0, .LBB0_36
+; RV32I-NEXT: # %bb.29: # %udiv-preheader4
+; RV32I-NEXT: li t1, 0
+; RV32I-NEXT: li a4, 0
+; RV32I-NEXT: li a7, 0
+; RV32I-NEXT: sw zero, 184(sp)
+; RV32I-NEXT: sw zero, 188(sp)
+; RV32I-NEXT: sw zero, 192(sp)
+; RV32I-NEXT: sw zero, 196(sp)
+; RV32I-NEXT: sw s6, 168(sp)
+; RV32I-NEXT: sw s5, 172(sp)
+; RV32I-NEXT: sw t6, 176(sp)
+; RV32I-NEXT: sw s4, 180(sp)
+; RV32I-NEXT: srli a0, s7, 3
+; RV32I-NEXT: addi a2, sp, 168
+; RV32I-NEXT: andi a0, a0, 12
+; RV32I-NEXT: add a0, a2, a0
+; RV32I-NEXT: lw a2, 4(a0)
+; RV32I-NEXT: lw a3, 8(a0)
+; RV32I-NEXT: lw a5, 12(a0)
+; RV32I-NEXT: lw t3, 0(a0)
+; RV32I-NEXT: andi a0, s7, 31
+; RV32I-NEXT: xori a0, a0, 31
+; RV32I-NEXT: slli t4, a5, 1
+; RV32I-NEXT: slli t6, a3, 1
+; RV32I-NEXT: slli s0, a2, 1
+; RV32I-NEXT: sll t4, t4, a0
+; RV32I-NEXT: sll s1, t6, a0
+; RV32I-NEXT: sll s2, s0, a0
+; RV32I-NEXT: lw s3, 92(sp) # 4-byte Folded Reload
+; RV32I-NEXT: seqz a0, s3
+; RV32I-NEXT: srl a3, a3, s7
+; RV32I-NEXT: or s0, a3, t4
+; RV32I-NEXT: or a3, s3, t5
+; RV32I-NEXT: sub t6, t5, a0
+; RV32I-NEXT: seqz a3, a3
+; RV32I-NEXT: srl a0, a2, s7
+; RV32I-NEXT: or a0, a0, s1
+; RV32I-NEXT: lw a2, 88(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sub s4, a2, a3
+; RV32I-NEXT: sltu a2, a2, a3
+; RV32I-NEXT: lw a3, 84(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sub s5, a3, a2
+; RV32I-NEXT: srl a2, t3, s7
+; RV32I-NEXT: srl s1, a5, s7
+; RV32I-NEXT: or s2, a2, s2
+; RV32I-NEXT: addi s3, s3, -1
+; RV32I-NEXT: sw s3, 80(sp) # 4-byte Folded Spill
+; RV32I-NEXT: j .LBB0_31
+; RV32I-NEXT: .LBB0_30: # %udiv-do-while3
+; RV32I-NEXT: # in Loop: Header=BB0_31 Depth=1
+; RV32I-NEXT: srli a5, t2, 31
+; RV32I-NEXT: slli t0, t0, 1
+; RV32I-NEXT: sub a3, s3, a3
+; RV32I-NEXT: srli s3, a6, 31
+; RV32I-NEXT: slli t2, t2, 1
+; RV32I-NEXT: or a5, t0, a5
+; RV32I-NEXT: srli t0, s9, 31
+; RV32I-NEXT: slli a6, a6, 1
+; RV32I-NEXT: slli s9, s9, 1
+; RV32I-NEXT: or t2, t2, s3
+; RV32I-NEXT: lw t3, 84(sp) # 4-byte Folded Reload
+; RV32I-NEXT: and s3, s0, t3
+; RV32I-NEXT: or a6, a6, t0
+; RV32I-NEXT: lw t0, 88(sp) # 4-byte Folded Reload
+; RV32I-NEXT: and t0, s0, t0
+; RV32I-NEXT: or s9, ra, s9
+; RV32I-NEXT: sub t3, a2, t0
+; RV32I-NEXT: sltu a2, a2, t0
+; RV32I-NEXT: or t0, s7, s8
+; RV32I-NEXT: sub s3, a0, s3
+; RV32I-NEXT: seqz t4, s7
+; RV32I-NEXT: addi s7, s7, -1
+; RV32I-NEXT: andi ra, s0, 1
+; RV32I-NEXT: sub a0, a3, s6
+; RV32I-NEXT: seqz a3, t0
+; RV32I-NEXT: sub s8, s8, t4
+; RV32I-NEXT: or a6, t1, a6
+; RV32I-NEXT: or t2, a4, t2
+; RV32I-NEXT: or t0, a7, a5
+; RV32I-NEXT: sub s0, t3, s1
+; RV32I-NEXT: sltu a4, t3, s1
+; RV32I-NEXT: sub s1, s3, a2
+; RV32I-NEXT: sltu a2, a1, a3
+; RV32I-NEXT: sub a1, a1, a3
+; RV32I-NEXT: sub s1, s1, a4
+; RV32I-NEXT: sub s10, s10, a2
+; RV32I-NEXT: or a2, s8, s10
+; RV32I-NEXT: or a3, s7, a1
+; RV32I-NEXT: or a2, a3, a2
+; RV32I-NEXT: sub s2, s11, s2
+; RV32I-NEXT: li t1, 0
+; RV32I-NEXT: li a4, 0
+; RV32I-NEXT: li a7, 0
+; RV32I-NEXT: beqz a2, .LBB0_36
+; RV32I-NEXT: .LBB0_31: # %udiv-do-while3
+; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
+; RV32I-NEXT: srli a2, s2, 31
+; RV32I-NEXT: slli a3, a0, 1
+; RV32I-NEXT: slli s2, s2, 1
+; RV32I-NEXT: or s3, a3, a2
+; RV32I-NEXT: srli a2, t0, 31
+; RV32I-NEXT: or s11, s2, a2
+; RV32I-NEXT: beq t6, s3, .LBB0_33
+; RV32I-NEXT: # %bb.32: # %udiv-do-while3
+; RV32I-NEXT: # in Loop: Header=BB0_31 Depth=1
+; RV32I-NEXT: sltu a3, t6, s3
+; RV32I-NEXT: j .LBB0_34
+; RV32I-NEXT: .LBB0_33: # in Loop: Header=BB0_31 Depth=1
+; RV32I-NEXT: lw a2, 80(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sltu a3, a2, s11
+; RV32I-NEXT: .LBB0_34: # %udiv-do-while3
+; RV32I-NEXT: # in Loop: Header=BB0_31 Depth=1
+; RV32I-NEXT: srli a2, s0, 31
+; RV32I-NEXT: slli s1, s1, 1
+; RV32I-NEXT: srli s2, a0, 31
+; RV32I-NEXT: slli s0, s0, 1
+; RV32I-NEXT: or a0, s1, a2
+; RV32I-NEXT: or a2, s0, s2
+; RV32I-NEXT: sub s0, s4, a2
+; RV32I-NEXT: sltu s1, s4, a2
+; RV32I-NEXT: sub s2, s5, a0
+; RV32I-NEXT: sltu a3, s0, a3
+; RV32I-NEXT: sub s0, s2, s1
+; RV32I-NEXT: sub s0, s0, a3
+; RV32I-NEXT: srai s0, s0, 31
+; RV32I-NEXT: lw a3, 92(sp) # 4-byte Folded Reload
+; RV32I-NEXT: and s2, s0, a3
+; RV32I-NEXT: and a3, s0, t5
+; RV32I-NEXT: sltu s6, s11, s2
+; RV32I-NEXT: mv s1, s6
+; RV32I-NEXT: beq s3, a3, .LBB0_30
+; RV32I-NEXT: # %bb.35: # %udiv-do-while3
+; RV32I-NEXT: # in Loop: Header=BB0_31 Depth=1
+; RV32I-NEXT: sltu s1, s3, a3
+; RV32I-NEXT: j .LBB0_30
+; RV32I-NEXT: .LBB0_36: # %udiv-loop-exit2
+; RV32I-NEXT: srli a0, s9, 31
+; RV32I-NEXT: slli a3, a6, 1
+; RV32I-NEXT: srli a1, a6, 31
+; RV32I-NEXT: or a3, a3, a0
+; RV32I-NEXT: slli a0, t2, 1
+; RV32I-NEXT: srli a5, t2, 31
+; RV32I-NEXT: slli t0, t0, 1
+; RV32I-NEXT: slli s9, s9, 1
+; RV32I-NEXT: or s7, a0, a1
+; RV32I-NEXT: or s8, t0, a5
+; RV32I-NEXT: or a4, ra, s9
+; RV32I-NEXT: lw t2, 76(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s3, 72(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s11, 68(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw ra, 44(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw t4, 60(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw t1, 100(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s2, 64(sp) # 4-byte Folded Reload
+; RV32I-NEXT: .LBB0_37: # %udiv-end1
+; RV32I-NEXT: xor a0, a4, s2
+; RV32I-NEXT: sw a0, 44(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sltu a0, a0, s2
+; RV32I-NEXT: xor a1, a3, s2
+; RV32I-NEXT: sw a0, 40(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw a0, 84(sp) # 4-byte Folded Spill
+; RV32I-NEXT: lw s9, 96(sp) # 4-byte Folded Reload
+; RV32I-NEXT: beqz a3, .LBB0_39
+; RV32I-NEXT: # %bb.38: # %udiv-end1
+; RV32I-NEXT: sltu a0, a1, s2
+; RV32I-NEXT: sw a0, 84(sp) # 4-byte Folded Spill
+; RV32I-NEXT: .LBB0_39: # %udiv-end1
+; RV32I-NEXT: lw s10, 56(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw a1, 36(sp) # 4-byte Folded Spill
+; RV32I-NEXT: bltz t4, .LBB0_41
+; RV32I-NEXT: # %bb.40: # %udiv-end1
+; RV32I-NEXT: mv s4, t4
+; RV32I-NEXT: bltz t1, .LBB0_42
+; RV32I-NEXT: j .LBB0_43
+; RV32I-NEXT: .LBB0_41:
+; RV32I-NEXT: neg a0, s11
+; RV32I-NEXT: lw a1, 24(sp) # 4-byte Folded Reload
+; RV32I-NEXT: neg a1, a1
+; RV32I-NEXT: lw a2, 28(sp) # 4-byte Folded Reload
+; RV32I-NEXT: add a2, s3, a2
+; RV32I-NEXT: lw a4, 32(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sltu a3, a0, a4
+; RV32I-NEXT: sub s11, a0, a4
+; RV32I-NEXT: neg s3, a2
+; RV32I-NEXT: sub s4, a1, a3
+; RV32I-NEXT: neg t2, t2
+; RV32I-NEXT: bgez t1, .LBB0_43
+; RV32I-NEXT: .LBB0_42:
+; RV32I-NEXT: neg a0, s9
+; RV32I-NEXT: lw a1, 12(sp) # 4-byte Folded Reload
+; RV32I-NEXT: neg a1, a1
+; RV32I-NEXT: lw a2, 16(sp) # 4-byte Folded Reload
+; RV32I-NEXT: add a2, s10, a2
+; RV32I-NEXT: lw a4, 20(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sltu a3, a0, a4
+; RV32I-NEXT: sub s9, a0, a4
+; RV32I-NEXT: neg s10, a2
+; RV32I-NEXT: sub t1, a1, a3
+; RV32I-NEXT: neg ra, ra
+; RV32I-NEXT: .LBB0_43: # %udiv-end1
+; RV32I-NEXT: lui a0, 349525
+; RV32I-NEXT: lui a2, 209715
+; RV32I-NEXT: lui a3, 61681
+; RV32I-NEXT: addi a1, a0, 1365
+; RV32I-NEXT: addi a5, a2, 819
+; RV32I-NEXT: addi a4, a3, -241
+; RV32I-NEXT: bnez s10, .LBB0_46
+; RV32I-NEXT: # %bb.44: # %udiv-end1
+; RV32I-NEXT: srli a0, ra, 1
+; RV32I-NEXT: or a0, ra, a0
+; RV32I-NEXT: srli a2, a0, 2
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 8
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 16
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: not a0, a0
+; RV32I-NEXT: srli a2, a0, 1
+; RV32I-NEXT: and a2, a2, a1
+; RV32I-NEXT: sub a0, a0, a2
+; RV32I-NEXT: and a2, a0, a5
+; RV32I-NEXT: srli a0, a0, 2
+; RV32I-NEXT: and a0, a0, a5
+; RV32I-NEXT: add a0, a2, a0
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: and a0, a0, a4
+; RV32I-NEXT: slli a2, a0, 8
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: slli a2, a0, 16
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: srli a0, a0, 24
+; RV32I-NEXT: addi a7, a0, 32
+; RV32I-NEXT: or t0, s9, t1
+; RV32I-NEXT: beqz t1, .LBB0_47
+; RV32I-NEXT: .LBB0_45:
+; RV32I-NEXT: srli a0, t1, 1
+; RV32I-NEXT: or a0, t1, a0
+; RV32I-NEXT: srli a2, a0, 2
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 8
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 16
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: not a0, a0
+; RV32I-NEXT: srli a2, a0, 1
+; RV32I-NEXT: and a2, a2, a1
+; RV32I-NEXT: sub a0, a0, a2
+; RV32I-NEXT: and a2, a0, a5
+; RV32I-NEXT: srli a0, a0, 2
+; RV32I-NEXT: and a0, a0, a5
+; RV32I-NEXT: add a0, a2, a0
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: and a0, a0, a4
+; RV32I-NEXT: slli a2, a0, 8
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: slli a2, a0, 16
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: srli a6, a0, 24
+; RV32I-NEXT: addi a0, a7, 64
+; RV32I-NEXT: beqz t0, .LBB0_48
+; RV32I-NEXT: j .LBB0_49
+; RV32I-NEXT: .LBB0_46:
+; RV32I-NEXT: srli a0, s10, 1
+; RV32I-NEXT: or a0, s10, a0
+; RV32I-NEXT: srli a2, a0, 2
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 8
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 16
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: not a0, a0
+; RV32I-NEXT: srli a2, a0, 1
+; RV32I-NEXT: and a2, a2, a1
+; RV32I-NEXT: sub a0, a0, a2
+; RV32I-NEXT: and a2, a0, a5
+; RV32I-NEXT: srli a0, a0, 2
+; RV32I-NEXT: and a0, a0, a5
+; RV32I-NEXT: add a0, a2, a0
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: and a0, a0, a4
+; RV32I-NEXT: slli a2, a0, 8
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: slli a2, a0, 16
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: srli a7, a0, 24
+; RV32I-NEXT: or t0, s9, t1
+; RV32I-NEXT: bnez t1, .LBB0_45
+; RV32I-NEXT: .LBB0_47: # %udiv-end1
+; RV32I-NEXT: srli a0, s9, 1
+; RV32I-NEXT: or a0, s9, a0
+; RV32I-NEXT: srli a2, a0, 2
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 8
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: srli a2, a0, 16
+; RV32I-NEXT: or a0, a0, a2
+; RV32I-NEXT: not a0, a0
+; RV32I-NEXT: srli a2, a0, 1
+; RV32I-NEXT: and a2, a2, a1
+; RV32I-NEXT: sub a0, a0, a2
+; RV32I-NEXT: and a2, a0, a5
+; RV32I-NEXT: srli a0, a0, 2
+; RV32I-NEXT: and a0, a0, a5
+; RV32I-NEXT: add a0, a2, a0
+; RV32I-NEXT: srli a2, a0, 4
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: and a0, a0, a4
+; RV32I-NEXT: slli a2, a0, 8
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: slli a2, a0, 16
+; RV32I-NEXT: add a0, a0, a2
+; RV32I-NEXT: srli a0, a0, 24
+; RV32I-NEXT: addi a6, a0, 32
+; RV32I-NEXT: addi a0, a7, 64
+; RV32I-NEXT: bnez t0, .LBB0_49
+; RV32I-NEXT: .LBB0_48: # %udiv-end1
+; RV32I-NEXT: mv a6, a0
+; RV32I-NEXT: .LBB0_49: # %udiv-end1
+; RV32I-NEXT: snez t5, t0
+; RV32I-NEXT: bnez s3, .LBB0_51
+; RV32I-NEXT: # %bb.50: # %udiv-end1
+; RV32I-NEXT: srli a2, t2, 1
+; RV32I-NEXT: or a2, t2, a2
+; RV32I-NEXT: srli a3, a2, 2
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 8
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 16
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: not a2, a2
+; RV32I-NEXT: srli a3, a2, 1
+; RV32I-NEXT: and a3, a3, a1
+; RV32I-NEXT: sub a2, a2, a3
+; RV32I-NEXT: and a3, a2, a5
+; RV32I-NEXT: srli a2, a2, 2
+; RV32I-NEXT: and a2, a2, a5
+; RV32I-NEXT: add a2, a3, a2
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: and a2, a2, a4
+; RV32I-NEXT: slli a3, a2, 8
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: slli a3, a2, 16
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: srli a2, a2, 24
+; RV32I-NEXT: addi a2, a2, 32
+; RV32I-NEXT: j .LBB0_52
+; RV32I-NEXT: .LBB0_51:
+; RV32I-NEXT: srli a2, s3, 1
+; RV32I-NEXT: or a2, s3, a2
+; RV32I-NEXT: srli a3, a2, 2
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 8
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 16
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: not a2, a2
+; RV32I-NEXT: srli a3, a2, 1
+; RV32I-NEXT: and a3, a3, a1
+; RV32I-NEXT: sub a2, a2, a3
+; RV32I-NEXT: and a3, a2, a5
+; RV32I-NEXT: srli a2, a2, 2
+; RV32I-NEXT: and a2, a2, a5
+; RV32I-NEXT: add a2, a3, a2
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: and a2, a2, a4
+; RV32I-NEXT: slli a3, a2, 8
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: slli a3, a2, 16
+; RV32I-NEXT: add a2, a2, a3
+; RV32I-NEXT: srli a2, a2, 24
+; RV32I-NEXT: .LBB0_52: # %udiv-end1
+; RV32I-NEXT: or t0, ra, s9
+; RV32I-NEXT: sw t1, 100(sp) # 4-byte Folded Spill
+; RV32I-NEXT: or t1, s10, t1
+; RV32I-NEXT: or t3, t2, s11
+; RV32I-NEXT: or t4, s3, s4
+; RV32I-NEXT: sltu a7, a0, a7
+; RV32I-NEXT: addi t5, t5, -1
+; RV32I-NEXT: addi a0, a2, 64
+; RV32I-NEXT: or t6, s11, s4
+; RV32I-NEXT: sltu s0, a0, a2
+; RV32I-NEXT: snez s1, t6
+; RV32I-NEXT: addi s1, s1, -1
+; RV32I-NEXT: bnez s4, .LBB0_54
+; RV32I-NEXT: # %bb.53: # %udiv-end1
+; RV32I-NEXT: srli a2, s11, 1
+; RV32I-NEXT: or a2, s11, a2
+; RV32I-NEXT: srli a3, a2, 2
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 8
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 16
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: not a2, a2
+; RV32I-NEXT: srli a3, a2, 1
+; RV32I-NEXT: and a1, a3, a1
+; RV32I-NEXT: sub a2, a2, a1
+; RV32I-NEXT: and a1, a2, a5
+; RV32I-NEXT: srli a2, a2, 2
+; RV32I-NEXT: and a2, a2, a5
+; RV32I-NEXT: add a1, a1, a2
+; RV32I-NEXT: srli a2, a1, 4
+; RV32I-NEXT: add a1, a1, a2
+; RV32I-NEXT: and a1, a1, a4
+; RV32I-NEXT: slli a2, a1, 8
+; RV32I-NEXT: add a1, a1, a2
+; RV32I-NEXT: slli a2, a1, 16
+; RV32I-NEXT: add a1, a1, a2
+; RV32I-NEXT: srli a1, a1, 24
+; RV32I-NEXT: addi a2, a1, 32
+; RV32I-NEXT: j .LBB0_55
+; RV32I-NEXT: .LBB0_54:
+; RV32I-NEXT: srli a2, s4, 1
+; RV32I-NEXT: or a2, s4, a2
+; RV32I-NEXT: srli a3, a2, 2
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 4
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 8
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: srli a3, a2, 16
+; RV32I-NEXT: or a2, a2, a3
+; RV32I-NEXT: not a2, a2
+; RV32I-NEXT: srli a3, a2, 1
+; RV32I-NEXT: and a1, a3, a1
+; RV32I-NEXT: sub a2, a2, a1
+; RV32I-NEXT: and a1, a2, a5
+; RV32I-NEXT: srli a2, a2, 2
+; RV32I-NEXT: and a2, a2, a5
+; RV32I-NEXT: add a1, a1, a2
+; RV32I-NEXT: srli a2, a1, 4
+; RV32I-NEXT: add a1, a1, a2
+; RV32I-NEXT: and a1, a1, a4
+; RV32I-NEXT: slli a2, a1, 8
+; RV32I-NEXT: add a1, a1, a2
+; RV32I-NEXT: slli a2, a1, 16
+; RV32I-NEXT: add a1, a1, a2
+; RV32I-NEXT: srli a2, a1, 24
+; RV32I-NEXT: .LBB0_55: # %udiv-end1
+; RV32I-NEXT: or a3, t0, t1
+; RV32I-NEXT: or a4, t3, t4
+; RV32I-NEXT: and a1, t5, a7
+; RV32I-NEXT: and s0, s1, s0
+; RV32I-NEXT: bnez t6, .LBB0_57
+; RV32I-NEXT: # %bb.56: # %udiv-end1
+; RV32I-NEXT: mv a2, a0
+; RV32I-NEXT: .LBB0_57: # %udiv-end1
+; RV32I-NEXT: seqz a0, a3
+; RV32I-NEXT: seqz a5, a4
+; RV32I-NEXT: sltu a7, a6, a2
+; RV32I-NEXT: sub t1, a1, s0
+; RV32I-NEXT: mv t0, a7
+; RV32I-NEXT: beq a1, s0, .LBB0_59
+; RV32I-NEXT: # %bb.58: # %udiv-end1
+; RV32I-NEXT: sltu t0, a1, s0
+; RV32I-NEXT: .LBB0_59: # %udiv-end1
+; RV32I-NEXT: xor a3, s8, s2
+; RV32I-NEXT: xor a4, s7, s2
+; RV32I-NEXT: sub a1, t1, a7
+; RV32I-NEXT: or a7, a0, a5
+; RV32I-NEXT: neg a0, t0
+; RV32I-NEXT: seqz t0, t0
+; RV32I-NEXT: addi t0, t0, -1
+; RV32I-NEXT: or a5, a0, t0
+; RV32I-NEXT: sub a2, a6, a2
+; RV32I-NEXT: beqz a5, .LBB0_61
+; RV32I-NEXT: # %bb.60: # %udiv-end1
+; RV32I-NEXT: snez a6, a5
+; RV32I-NEXT: j .LBB0_62
+; RV32I-NEXT: .LBB0_61:
+; RV32I-NEXT: snez a5, a1
+; RV32I-NEXT: sltiu a6, a2, 128
+; RV32I-NEXT: xori a6, a6, 1
+; RV32I-NEXT: or a6, a6, a5
+; RV32I-NEXT: .LBB0_62: # %udiv-end1
+; RV32I-NEXT: sub a5, a4, s2
+; RV32I-NEXT: sw a5, 80(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sltu a4, a4, s2
+; RV32I-NEXT: sub a5, a3, s2
+; RV32I-NEXT: or a3, a7, a6
+; RV32I-NEXT: addi a6, a3, -1
+; RV32I-NEXT: sw s4, 56(sp) # 4-byte Folded Spill
+; RV32I-NEXT: and s5, a6, s4
+; RV32I-NEXT: and s7, a6, s11
+; RV32I-NEXT: and s4, a6, s3
+; RV32I-NEXT: and s6, a6, t2
+; RV32I-NEXT: sw t2, 76(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s3, 72(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s11, 68(sp) # 4-byte Folded Spill
+; RV32I-NEXT: bnez a3, .LBB0_73
+; RV32I-NEXT: # %bb.63: # %udiv-end1
+; RV32I-NEXT: xori a3, a2, 127
+; RV32I-NEXT: or a3, a3, a0
+; RV32I-NEXT: or a6, a1, t0
+; RV32I-NEXT: or a3, a3, a6
+; RV32I-NEXT: beqz a3, .LBB0_73
+; RV32I-NEXT: # %bb.64: # %udiv-bb1
+; RV32I-NEXT: sw a5, 28(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw a4, 32(sp) # 4-byte Folded Spill
+; RV32I-NEXT: addi a6, a2, 1
+; RV32I-NEXT: li a3, 127
+; RV32I-NEXT: sub a7, a3, a2
+; RV32I-NEXT: sw zero, 136(sp)
+; RV32I-NEXT: sw zero, 140(sp)
+; RV32I-NEXT: sw zero, 144(sp)
+; RV32I-NEXT: sw zero, 148(sp)
+; RV32I-NEXT: lw s0, 76(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw s0, 152(sp)
+; RV32I-NEXT: lw s1, 72(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw s1, 156(sp)
+; RV32I-NEXT: lw s2, 68(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw s2, 160(sp)
+; RV32I-NEXT: lw s3, 56(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw s3, 164(sp)
+; RV32I-NEXT: addi a2, sp, 152
+; RV32I-NEXT: seqz a3, a6
+; RV32I-NEXT: srli a4, a7, 3
+; RV32I-NEXT: andi a5, a7, 31
+; RV32I-NEXT: add a1, a1, a3
+; RV32I-NEXT: andi a4, a4, 12
+; RV32I-NEXT: xori a3, a5, 31
+; RV32I-NEXT: or a5, a6, a1
+; RV32I-NEXT: sub a2, a2, a4
+; RV32I-NEXT: seqz t3, a5
+; RV32I-NEXT: lw a4, 0(a2)
+; RV32I-NEXT: lw a5, 4(a2)
+; RV32I-NEXT: lw t1, 8(a2)
+; RV32I-NEXT: lw a2, 12(a2)
+; RV32I-NEXT: add t3, a0, t3
+; RV32I-NEXT: sltu a0, t3, a0
+; RV32I-NEXT: or t2, a6, t3
+; RV32I-NEXT: add t0, t0, a0
+; RV32I-NEXT: or a0, a1, t0
+; RV32I-NEXT: srli t4, t1, 1
+; RV32I-NEXT: srli t5, a5, 1
+; RV32I-NEXT: or a0, t2, a0
+; RV32I-NEXT: srli t2, a4, 1
+; RV32I-NEXT: srl t4, t4, a3
+; RV32I-NEXT: srl t5, t5, a3
+; RV32I-NEXT: srl a3, t2, a3
+; RV32I-NEXT: sll a2, a2, a7
+; RV32I-NEXT: or t6, a2, t4
+; RV32I-NEXT: sll a2, t1, a7
+; RV32I-NEXT: sll a5, a5, a7
+; RV32I-NEXT: or t4, a2, t5
+; RV32I-NEXT: or t5, a5, a3
+; RV32I-NEXT: sll a7, a4, a7
+; RV32I-NEXT: sw s9, 96(sp) # 4-byte Folded Spill
+; RV32I-NEXT: li t1, 0
+; RV32I-NEXT: beqz a0, .LBB0_72
+; RV32I-NEXT: # %bb.65: # %udiv-preheader
+; RV32I-NEXT: li s4, 0
+; RV32I-NEXT: li s5, 0
+; RV32I-NEXT: li s6, 0
+; RV32I-NEXT: sw zero, 120(sp)
+; RV32I-NEXT: sw zero, 124(sp)
+; RV32I-NEXT: sw zero, 128(sp)
+; RV32I-NEXT: sw zero, 132(sp)
+; RV32I-NEXT: sw s0, 104(sp)
+; RV32I-NEXT: sw s1, 108(sp)
+; RV32I-NEXT: sw s2, 112(sp)
+; RV32I-NEXT: sw s3, 116(sp)
+; RV32I-NEXT: srli a0, a6, 3
+; RV32I-NEXT: addi a2, sp, 104
+; RV32I-NEXT: andi a0, a0, 12
+; RV32I-NEXT: add a0, a2, a0
+; RV32I-NEXT: lw a2, 4(a0)
+; RV32I-NEXT: lw a3, 8(a0)
+; RV32I-NEXT: lw a4, 12(a0)
+; RV32I-NEXT: lw a5, 0(a0)
+; RV32I-NEXT: andi a0, a6, 31
+; RV32I-NEXT: xori a0, a0, 31
+; RV32I-NEXT: slli t2, a4, 1
+; RV32I-NEXT: slli s0, a3, 1
+; RV32I-NEXT: slli s1, a2, 1
+; RV32I-NEXT: sll t2, t2, a0
+; RV32I-NEXT: sll s2, s0, a0
+; RV32I-NEXT: sll s3, s1, a0
+; RV32I-NEXT: seqz a0, ra
+; RV32I-NEXT: srl a3, a3, a6
+; RV32I-NEXT: or s0, a3, t2
+; RV32I-NEXT: or a3, ra, s10
+; RV32I-NEXT: sub s7, s10, a0
+; RV32I-NEXT: seqz a3, a3
+; RV32I-NEXT: srl a0, a2, a6
+; RV32I-NEXT: or a0, a0, s2
+; RV32I-NEXT: sub s8, s9, a3
+; RV32I-NEXT: sltu a2, s9, a3
+; RV32I-NEXT: lw a3, 100(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sub a3, a3, a2
+; RV32I-NEXT: sw a3, 92(sp) # 4-byte Folded Spill
+; RV32I-NEXT: srl a2, a5, a6
+; RV32I-NEXT: srl s1, a4, a6
+; RV32I-NEXT: or s2, a2, s3
+; RV32I-NEXT: addi a2, ra, -1
+; RV32I-NEXT: sw a2, 88(sp) # 4-byte Folded Spill
+; RV32I-NEXT: j .LBB0_67
+; RV32I-NEXT: .LBB0_66: # %udiv-do-while
+; RV32I-NEXT: # in Loop: Header=BB0_67 Depth=1
+; RV32I-NEXT: srli t2, t4, 31
+; RV32I-NEXT: slli t6, t6, 1
+; RV32I-NEXT: sub s3, s3, s10
+; RV32I-NEXT: srli s10, t5, 31
+; RV32I-NEXT: slli t4, t4, 1
+; RV32I-NEXT: or t2, t6, t2
+; RV32I-NEXT: srli t6, a7, 31
+; RV32I-NEXT: slli t5, t5, 1
+; RV32I-NEXT: slli a7, a7, 1
+; RV32I-NEXT: or t4, t4, s10
+; RV32I-NEXT: lw a4, 100(sp) # 4-byte Folded Reload
+; RV32I-NEXT: and s10, s0, a4
+; RV32I-NEXT: or t5, t5, t6
+; RV32I-NEXT: lw a4, 96(sp) # 4-byte Folded Reload
+; RV32I-NEXT: and t6, s0, a4
+; RV32I-NEXT: or a7, t1, a7
+; RV32I-NEXT: sub a4, a3, t6
+; RV32I-NEXT: sltu a3, a3, t6
+; RV32I-NEXT: or t6, a6, a1
+; RV32I-NEXT: sub s10, a0, s10
+; RV32I-NEXT: seqz a5, a6
+; RV32I-NEXT: addi a6, a6, -1
+; RV32I-NEXT: andi t1, s0, 1
+; RV32I-NEXT: sub a0, s3, a2
+; RV32I-NEXT: seqz a2, t6
+; RV32I-NEXT: sub a1, a1, a5
+; RV32I-NEXT: or t5, s4, t5
+; RV32I-NEXT: or t4, s5, t4
+; RV32I-NEXT: or t6, s6, t2
+; RV32I-NEXT: sub s0, a4, s1
+; RV32I-NEXT: sltu a4, a4, s1
+; RV32I-NEXT: sub s1, s10, a3
+; RV32I-NEXT: sltu a3, t3, a2
+; RV32I-NEXT: sub t3, t3, a2
+; RV32I-NEXT: sub s1, s1, a4
+; RV32I-NEXT: sub t0, t0, a3
+; RV32I-NEXT: or a2, a1, t0
+; RV32I-NEXT: or a3, a6, t3
+; RV32I-NEXT: or a2, a3, a2
+; RV32I-NEXT: sub s2, s11, s2
+; RV32I-NEXT: li s4, 0
+; RV32I-NEXT: li s5, 0
+; RV32I-NEXT: li s6, 0
+; RV32I-NEXT: mv s10, ra
+; RV32I-NEXT: mv ra, s9
+; RV32I-NEXT: beqz a2, .LBB0_72
+; RV32I-NEXT: .LBB0_67: # %udiv-do-while
+; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
+; RV32I-NEXT: srli a2, s2, 31
+; RV32I-NEXT: slli a3, a0, 1
+; RV32I-NEXT: slli s2, s2, 1
+; RV32I-NEXT: or s3, a3, a2
+; RV32I-NEXT: srli a2, t6, 31
+; RV32I-NEXT: or s11, s2, a2
+; RV32I-NEXT: beq s7, s3, .LBB0_69
+; RV32I-NEXT: # %bb.68: # %udiv-do-while
+; RV32I-NEXT: # in Loop: Header=BB0_67 Depth=1
+; RV32I-NEXT: sltu a2, s7, s3
+; RV32I-NEXT: j .LBB0_70
+; RV32I-NEXT: .LBB0_69: # in Loop: Header=BB0_67 Depth=1
+; RV32I-NEXT: lw a2, 88(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sltu a2, a2, s11
+; RV32I-NEXT: .LBB0_70: # %udiv-do-while
+; RV32I-NEXT: # in Loop: Header=BB0_67 Depth=1
+; RV32I-NEXT: srli a3, s0, 31
+; RV32I-NEXT: slli s1, s1, 1
+; RV32I-NEXT: srli s2, a0, 31
+; RV32I-NEXT: slli s0, s0, 1
+; RV32I-NEXT: or a0, s1, a3
+; RV32I-NEXT: or a3, s0, s2
+; RV32I-NEXT: sub s0, s8, a3
+; RV32I-NEXT: sltu s1, s8, a3
+; RV32I-NEXT: lw a4, 92(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sub s2, a4, a0
+; RV32I-NEXT: sltu a2, s0, a2
+; RV32I-NEXT: sub s0, s2, s1
+; RV32I-NEXT: sub s0, s0, a2
+; RV32I-NEXT: srai s0, s0, 31
+; RV32I-NEXT: mv s9, ra
+; RV32I-NEXT: and s2, s0, ra
+; RV32I-NEXT: mv ra, s10
+; RV32I-NEXT: and s10, s0, s10
+; RV32I-NEXT: sltu a2, s11, s2
+; RV32I-NEXT: mv s1, a2
+; RV32I-NEXT: beq s3, s10, .LBB0_66
+; RV32I-NEXT: # %bb.71: # %udiv-do-while
+; RV32I-NEXT: # in Loop: Header=BB0_67 Depth=1
+; RV32I-NEXT: sltu s1, s3, s10
+; RV32I-NEXT: j .LBB0_66
+; RV32I-NEXT: .LBB0_72: # %udiv-loop-exit
+; RV32I-NEXT: srli a0, a7, 31
+; RV32I-NEXT: slli a1, t5, 1
+; RV32I-NEXT: srli a2, t5, 31
+; RV32I-NEXT: or s4, a1, a0
+; RV32I-NEXT: slli a0, t4, 1
+; RV32I-NEXT: srli a1, t4, 31
+; RV32I-NEXT: slli t6, t6, 1
+; RV32I-NEXT: slli a7, a7, 1
+; RV32I-NEXT: or s7, a0, a2
+; RV32I-NEXT: or s5, t6, a1
+; RV32I-NEXT: or s6, t1, a7
+; RV32I-NEXT: lw s9, 96(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw a4, 32(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw a5, 28(sp) # 4-byte Folded Reload
+; RV32I-NEXT: .LBB0_73: # %udiv-end
+; RV32I-NEXT: lw a0, 84(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw a1, 80(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sltu a0, a1, a0
+; RV32I-NEXT: sw a0, 92(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sub a5, a5, a4
+; RV32I-NEXT: sw a5, 88(sp) # 4-byte Folded Spill
+; RV32I-NEXT: mv s11, s10
+; RV32I-NEXT: lw a0, 64(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw a1, 36(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sub s10, a1, a0
+; RV32I-NEXT: lw s0, 60(sp) # 4-byte Folded Reload
+; RV32I-NEXT: srai s0, s0, 31
+; RV32I-NEXT: mv a0, s6
+; RV32I-NEXT: mv a1, s4
+; RV32I-NEXT: mv a2, s9
+; RV32I-NEXT: lw a3, 100(sp) # 4-byte Folded Reload
+; RV32I-NEXT: mv s1, ra
+; RV32I-NEXT: call __muldi3
+; RV32I-NEXT: mv s8, a0
+; RV32I-NEXT: mv s9, a1
+; RV32I-NEXT: mv a0, s7
+; RV32I-NEXT: mv a1, s5
+; RV32I-NEXT: mv a2, s1
+; RV32I-NEXT: mv a3, s11
+; RV32I-NEXT: call __muldi3
+; RV32I-NEXT: add a1, a1, s9
+; RV32I-NEXT: add s8, a0, s8
+; RV32I-NEXT: sltu s2, s8, a0
+; RV32I-NEXT: add s2, a1, s2
+; RV32I-NEXT: mv a0, s1
+; RV32I-NEXT: li a1, 0
+; RV32I-NEXT: mv a2, s6
+; RV32I-NEXT: li a3, 0
+; RV32I-NEXT: call __muldi3
+; RV32I-NEXT: mv s5, a0
+; RV32I-NEXT: mv s7, a1
+; RV32I-NEXT: mv a0, s11
+; RV32I-NEXT: li a1, 0
+; RV32I-NEXT: mv a2, s6
+; RV32I-NEXT: li a3, 0
+; RV32I-NEXT: call __muldi3
+; RV32I-NEXT: add s3, a0, s7
+; RV32I-NEXT: sltu a0, s3, a0
+; RV32I-NEXT: add s6, a1, a0
+; RV32I-NEXT: mv a0, s1
+; RV32I-NEXT: li a1, 0
+; RV32I-NEXT: mv a2, s4
+; RV32I-NEXT: li a3, 0
+; RV32I-NEXT: call __muldi3
+; RV32I-NEXT: add s3, a0, s3
+; RV32I-NEXT: sltu a0, s3, a0
+; RV32I-NEXT: add a0, a1, a0
+; RV32I-NEXT: add s7, s6, a0
+; RV32I-NEXT: mv a0, s11
+; RV32I-NEXT: li a1, 0
+; RV32I-NEXT: mv a2, s4
+; RV32I-NEXT: li a3, 0
+; RV32I-NEXT: call __muldi3
+; RV32I-NEXT: add a2, a0, s7
+; RV32I-NEXT: sltu a3, s7, s6
+; RV32I-NEXT: lw t1, 76(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sltu a4, t1, s5
+; RV32I-NEXT: sltu a0, a2, a0
+; RV32I-NEXT: add a1, a1, a3
+; RV32I-NEXT: add s8, a2, s8
+; RV32I-NEXT: add a0, a1, a0
+; RV32I-NEXT: sltu a1, s8, a2
+; RV32I-NEXT: lw a3, 68(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sltu a2, a3, s8
+; RV32I-NEXT: add a0, a0, s2
+; RV32I-NEXT: lw a5, 56(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sub a1, a5, a1
+; RV32I-NEXT: sub a1, a1, a0
+; RV32I-NEXT: sub a5, a1, a2
+; RV32I-NEXT: sub a6, a3, s8
+; RV32I-NEXT: mv a7, a4
+; RV32I-NEXT: lw t2, 72(sp) # 4-byte Folded Reload
+; RV32I-NEXT: beq t2, s3, .LBB0_75
+; RV32I-NEXT: # %bb.74: # %udiv-end
+; RV32I-NEXT: sltu a7, t2, s3
+; RV32I-NEXT: .LBB0_75: # %udiv-end
+; RV32I-NEXT: lw a0, 92(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw a1, 88(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sub a0, a1, a0
+; RV32I-NEXT: lw a1, 40(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sub a1, s10, a1
+; RV32I-NEXT: lw a2, 84(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw a3, 80(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sub a2, a3, a2
+; RV32I-NEXT: lw a3, 64(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw t0, 44(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sub a3, t0, a3
+; RV32I-NEXT: sltu t0, a6, a7
+; RV32I-NEXT: sub a6, a6, a7
+; RV32I-NEXT: sub a7, t2, s3
+; RV32I-NEXT: sub t1, t1, s5
+; RV32I-NEXT: sub a5, a5, t0
+; RV32I-NEXT: sub t2, a7, a4
+; RV32I-NEXT: xor t0, a6, s0
+; RV32I-NEXT: xor a4, t1, s0
+; RV32I-NEXT: xor a6, a5, s0
+; RV32I-NEXT: xor a7, t2, s0
+; RV32I-NEXT: sltu t1, t0, s0
+; RV32I-NEXT: sltu a5, a4, s0
+; RV32I-NEXT: add t1, s0, t1
+; RV32I-NEXT: sub a6, a6, t1
+; RV32I-NEXT: sub t0, t0, s0
+; RV32I-NEXT: mv t1, a5
+; RV32I-NEXT: beqz t2, .LBB0_77
+; RV32I-NEXT: # %bb.76: # %udiv-end
+; RV32I-NEXT: sltu t1, a7, s0
+; RV32I-NEXT: .LBB0_77: # %udiv-end
+; RV32I-NEXT: sltu t2, t0, t1
+; RV32I-NEXT: sub t0, t0, t1
+; RV32I-NEXT: sub a7, a7, s0
+; RV32I-NEXT: sub a4, a4, s0
+; RV32I-NEXT: lw t1, 48(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw a3, 0(t1)
+; RV32I-NEXT: sw a1, 4(t1)
+; RV32I-NEXT: sw a2, 8(t1)
+; RV32I-NEXT: sw a0, 12(t1)
+; RV32I-NEXT: sub a0, a6, t2
+; RV32I-NEXT: sub a1, a7, a5
+; RV32I-NEXT: lw a2, 52(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw a4, 0(a2)
+; RV32I-NEXT: sw a1, 4(a2)
+; RV32I-NEXT: sw t0, 8(a2)
+; RV32I-NEXT: sw a0, 12(a2)
+; RV32I-NEXT: lw ra, 284(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s0, 280(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s1, 276(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s2, 272(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s3, 268(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s4, 264(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s5, 260(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s6, 256(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s7, 252(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s8, 248(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s9, 244(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s10, 240(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s11, 236(sp) # 4-byte Folded Reload
+; RV32I-NEXT: .cfi_restore ra
+; RV32I-NEXT: .cfi_restore s0
+; RV32I-NEXT: .cfi_restore s1
+; RV32I-NEXT: .cfi_restore s2
+; RV32I-NEXT: .cfi_restore s3
+; RV32I-NEXT: .cfi_restore s4
+; RV32I-NEXT: .cfi_restore s5
+; RV32I-NEXT: .cfi_restore s6
+; RV32I-NEXT: .cfi_restore s7
+; RV32I-NEXT: .cfi_restore s8
+; RV32I-NEXT: .cfi_restore s9
+; RV32I-NEXT: .cfi_restore s10
+; RV32I-NEXT: .cfi_restore s11
+; RV32I-NEXT: addi sp, sp, 288
+; RV32I-NEXT: .cfi_def_cfa_offset 0
+; RV32I-NEXT: ret
+;
+; RV32M-LABEL: sdivrem_i128:
+; RV32M: # %bb.0: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: addi sp, sp, -272
+; RV32M-NEXT: .cfi_def_cfa_offset 272
+; RV32M-NEXT: sw ra, 268(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s0, 264(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s1, 260(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s2, 256(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s3, 252(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s4, 248(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s5, 244(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s6, 240(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s7, 236(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s8, 232(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s9, 228(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s10, 224(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s11, 220(sp) # 4-byte Folded Spill
+; RV32M-NEXT: .cfi_offset ra, -4
+; RV32M-NEXT: .cfi_offset s0, -8
+; RV32M-NEXT: .cfi_offset s1, -12
+; RV32M-NEXT: .cfi_offset s2, -16
+; RV32M-NEXT: .cfi_offset s3, -20
+; RV32M-NEXT: .cfi_offset s4, -24
+; RV32M-NEXT: .cfi_offset s5, -28
+; RV32M-NEXT: .cfi_offset s6, -32
+; RV32M-NEXT: .cfi_offset s7, -36
+; RV32M-NEXT: .cfi_offset s8, -40
+; RV32M-NEXT: .cfi_offset s9, -44
+; RV32M-NEXT: .cfi_offset s10, -48
+; RV32M-NEXT: .cfi_offset s11, -52
+; RV32M-NEXT: sw a1, 32(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw a0, 28(sp) # 4-byte Folded Spill
+; RV32M-NEXT: lw a4, 0(a2)
+; RV32M-NEXT: lw s9, 4(a2)
+; RV32M-NEXT: lw s7, 8(a2)
+; RV32M-NEXT: lw a5, 0(a3)
+; RV32M-NEXT: lw t4, 4(a3)
+; RV32M-NEXT: lw a6, 8(a3)
+; RV32M-NEXT: lw t3, 12(a3)
+; RV32M-NEXT: lw t5, 12(a2)
+; RV32M-NEXT: or a0, a4, s9
+; RV32M-NEXT: snez a1, s7
+; RV32M-NEXT: snez a7, a0
+; RV32M-NEXT: add a1, t5, a1
+; RV32M-NEXT: snez t0, a4
+; RV32M-NEXT: sw s9, 52(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s7, 48(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw a1, 12(sp) # 4-byte Folded Spill
+; RV32M-NEXT: bltz t5, .LBB0_2
+; RV32M-NEXT: # %bb.1: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: mv s8, t5
+; RV32M-NEXT: mv s10, a4
+; RV32M-NEXT: j .LBB0_3
+; RV32M-NEXT: .LBB0_2:
+; RV32M-NEXT: neg a0, s7
+; RV32M-NEXT: neg a1, a1
+; RV32M-NEXT: neg a2, s9
+; RV32M-NEXT: sltu a3, a0, a7
+; RV32M-NEXT: sub s7, a0, a7
+; RV32M-NEXT: sub s9, a2, t0
+; RV32M-NEXT: sub s8, a1, a3
+; RV32M-NEXT: neg s10, a4
+; RV32M-NEXT: .LBB0_3: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: sw a4, 56(sp) # 4-byte Folded Spill
+; RV32M-NEXT: or a0, a5, t4
+; RV32M-NEXT: snez a1, a6
+; RV32M-NEXT: snez a4, a0
+; RV32M-NEXT: add a1, t3, a1
+; RV32M-NEXT: snez t1, a5
+; RV32M-NEXT: sw a7, 20(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw t0, 16(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw a4, 8(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw t1, 4(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw a1, 0(sp) # 4-byte Folded Spill
+; RV32M-NEXT: bltz t3, .LBB0_5
+; RV32M-NEXT: # %bb.4: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: mv s6, t3
+; RV32M-NEXT: mv s5, a6
+; RV32M-NEXT: mv a7, t4
+; RV32M-NEXT: sw a5, 72(sp) # 4-byte Folded Spill
+; RV32M-NEXT: j .LBB0_6
+; RV32M-NEXT: .LBB0_5:
+; RV32M-NEXT: neg a0, a6
+; RV32M-NEXT: neg a1, a1
+; RV32M-NEXT: neg a2, t4
+; RV32M-NEXT: sltu a3, a0, a4
+; RV32M-NEXT: sub s5, a0, a4
+; RV32M-NEXT: sub a7, a2, t1
+; RV32M-NEXT: sub s6, a1, a3
+; RV32M-NEXT: neg a0, a5
+; RV32M-NEXT: sw a0, 72(sp) # 4-byte Folded Spill
+; RV32M-NEXT: .LBB0_6: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: lui a0, 349525
+; RV32M-NEXT: lui a1, 209715
+; RV32M-NEXT: lui a2, 61681
+; RV32M-NEXT: lui a3, 4112
+; RV32M-NEXT: addi s1, a0, 1365
+; RV32M-NEXT: addi s0, a1, 819
+; RV32M-NEXT: addi t6, a2, -241
+; RV32M-NEXT: addi t2, a3, 257
+; RV32M-NEXT: bnez a7, .LBB0_9
+; RV32M-NEXT: # %bb.7: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: lw a1, 72(sp) # 4-byte Folded Reload
+; RV32M-NEXT: srli a0, a1, 1
+; RV32M-NEXT: or a0, a1, a0
+; RV32M-NEXT: srli a1, a0, 2
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 8
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 16
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a1, a0, 1
+; RV32M-NEXT: and a1, a1, s1
+; RV32M-NEXT: sub a0, a0, a1
+; RV32M-NEXT: and a1, a0, s0
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, s0
+; RV32M-NEXT: add a0, a1, a0
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: add a0, a0, a1
+; RV32M-NEXT: and a0, a0, t6
+; RV32M-NEXT: mul a0, a0, t2
+; RV32M-NEXT: srli a0, a0, 24
+; RV32M-NEXT: addi a1, a0, 32
+; RV32M-NEXT: or a2, s5, s6
+; RV32M-NEXT: beqz s6, .LBB0_10
+; RV32M-NEXT: .LBB0_8:
+; RV32M-NEXT: srli a0, s6, 1
+; RV32M-NEXT: or a0, s6, a0
+; RV32M-NEXT: srli a3, a0, 2
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: srli a3, a0, 4
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: srli a3, a0, 8
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: srli a3, a0, 16
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a3, a0, 1
+; RV32M-NEXT: and a3, a3, s1
+; RV32M-NEXT: sub a0, a0, a3
+; RV32M-NEXT: and a3, a0, s0
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, s0
+; RV32M-NEXT: add a0, a3, a0
+; RV32M-NEXT: srli a3, a0, 4
+; RV32M-NEXT: add a0, a0, a3
+; RV32M-NEXT: and a0, a0, t6
+; RV32M-NEXT: mul a0, a0, t2
+; RV32M-NEXT: srli a0, a0, 24
+; RV32M-NEXT: addi a4, a1, 64
+; RV32M-NEXT: beqz a2, .LBB0_11
+; RV32M-NEXT: j .LBB0_12
+; RV32M-NEXT: .LBB0_9:
+; RV32M-NEXT: srli a0, a7, 1
+; RV32M-NEXT: or a0, a7, a0
+; RV32M-NEXT: srli a1, a0, 2
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 8
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 16
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a1, a0, 1
+; RV32M-NEXT: and a1, a1, s1
+; RV32M-NEXT: sub a0, a0, a1
+; RV32M-NEXT: and a1, a0, s0
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, s0
+; RV32M-NEXT: add a0, a1, a0
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: add a0, a0, a1
+; RV32M-NEXT: and a0, a0, t6
+; RV32M-NEXT: mul a1, a0, t2
+; RV32M-NEXT: srli a1, a1, 24
+; RV32M-NEXT: or a2, s5, s6
+; RV32M-NEXT: bnez s6, .LBB0_8
+; RV32M-NEXT: .LBB0_10: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: srli a0, s5, 1
+; RV32M-NEXT: or a0, s5, a0
+; RV32M-NEXT: srli a3, a0, 2
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: srli a3, a0, 4
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: srli a3, a0, 8
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: srli a3, a0, 16
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a3, a0, 1
+; RV32M-NEXT: and a3, a3, s1
+; RV32M-NEXT: sub a0, a0, a3
+; RV32M-NEXT: and a3, a0, s0
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, s0
+; RV32M-NEXT: add a0, a3, a0
+; RV32M-NEXT: srli a3, a0, 4
+; RV32M-NEXT: add a0, a0, a3
+; RV32M-NEXT: and a0, a0, t6
+; RV32M-NEXT: mul a0, a0, t2
+; RV32M-NEXT: srli a0, a0, 24
+; RV32M-NEXT: addi a0, a0, 32
+; RV32M-NEXT: addi a4, a1, 64
+; RV32M-NEXT: bnez a2, .LBB0_12
+; RV32M-NEXT: .LBB0_11: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: mv a0, a4
+; RV32M-NEXT: .LBB0_12: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: snez s2, a2
+; RV32M-NEXT: sw a5, 36(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw a6, 84(sp) # 4-byte Folded Spill
+; RV32M-NEXT: bnez s9, .LBB0_14
+; RV32M-NEXT: # %bb.13: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: srli a2, s10, 1
+; RV32M-NEXT: or a2, s10, a2
+; RV32M-NEXT: srli a3, a2, 2
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: srli a3, a2, 4
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: srli a3, a2, 8
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: srli a3, a2, 16
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: not a2, a2
+; RV32M-NEXT: srli a3, a2, 1
+; RV32M-NEXT: and a3, a3, s1
+; RV32M-NEXT: sub a2, a2, a3
+; RV32M-NEXT: and a3, a2, s0
+; RV32M-NEXT: srli a2, a2, 2
+; RV32M-NEXT: and a2, a2, s0
+; RV32M-NEXT: add a2, a3, a2
+; RV32M-NEXT: srli a3, a2, 4
+; RV32M-NEXT: add a2, a2, a3
+; RV32M-NEXT: and a2, a2, t6
+; RV32M-NEXT: mul a2, a2, t2
+; RV32M-NEXT: srli a2, a2, 24
+; RV32M-NEXT: addi a3, a2, 32
+; RV32M-NEXT: j .LBB0_15
+; RV32M-NEXT: .LBB0_14:
+; RV32M-NEXT: srli a2, s9, 1
+; RV32M-NEXT: or a2, s9, a2
+; RV32M-NEXT: srli a3, a2, 2
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: srli a3, a2, 4
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: srli a3, a2, 8
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: srli a3, a2, 16
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: not a2, a2
+; RV32M-NEXT: srli a3, a2, 1
+; RV32M-NEXT: and a3, a3, s1
+; RV32M-NEXT: sub a2, a2, a3
+; RV32M-NEXT: and a3, a2, s0
+; RV32M-NEXT: srli a2, a2, 2
+; RV32M-NEXT: and a2, a2, s0
+; RV32M-NEXT: add a2, a3, a2
+; RV32M-NEXT: srli a3, a2, 4
+; RV32M-NEXT: add a2, a2, a3
+; RV32M-NEXT: and a2, a2, t6
+; RV32M-NEXT: mul a3, a2, t2
+; RV32M-NEXT: srli a3, a3, 24
+; RV32M-NEXT: .LBB0_15: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: lw a2, 72(sp) # 4-byte Folded Reload
+; RV32M-NEXT: or a2, a2, s5
+; RV32M-NEXT: sw a7, 64(sp) # 4-byte Folded Spill
+; RV32M-NEXT: or a5, a7, s6
+; RV32M-NEXT: or a6, s10, s7
+; RV32M-NEXT: or a7, s9, s8
+; RV32M-NEXT: sltu a4, a4, a1
+; RV32M-NEXT: addi s2, s2, -1
+; RV32M-NEXT: addi a1, a3, 64
+; RV32M-NEXT: or s3, s7, s8
+; RV32M-NEXT: sltu t0, a1, a3
+; RV32M-NEXT: snez a3, s3
+; RV32M-NEXT: addi a3, a3, -1
+; RV32M-NEXT: bnez s8, .LBB0_17
+; RV32M-NEXT: # %bb.16: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: srli t1, s7, 1
+; RV32M-NEXT: or t1, s7, t1
+; RV32M-NEXT: srli s4, t1, 2
+; RV32M-NEXT: or t1, t1, s4
+; RV32M-NEXT: srli s4, t1, 4
+; RV32M-NEXT: or t1, t1, s4
+; RV32M-NEXT: srli s4, t1, 8
+; RV32M-NEXT: or t1, t1, s4
+; RV32M-NEXT: srli s4, t1, 16
+; RV32M-NEXT: or t1, t1, s4
+; RV32M-NEXT: not t1, t1
+; RV32M-NEXT: srli s4, t1, 1
+; RV32M-NEXT: and s1, s4, s1
+; RV32M-NEXT: sub t1, t1, s1
+; RV32M-NEXT: and s1, t1, s0
+; RV32M-NEXT: srli t1, t1, 2
+; RV32M-NEXT: and t1, t1, s0
+; RV32M-NEXT: add t1, s1, t1
+; RV32M-NEXT: srli s0, t1, 4
+; RV32M-NEXT: add t1, t1, s0
+; RV32M-NEXT: and t1, t1, t6
+; RV32M-NEXT: mul t1, t1, t2
+; RV32M-NEXT: srli t1, t1, 24
+; RV32M-NEXT: addi t1, t1, 32
+; RV32M-NEXT: j .LBB0_18
+; RV32M-NEXT: .LBB0_17:
+; RV32M-NEXT: srli t1, s8, 1
+; RV32M-NEXT: or t1, s8, t1
+; RV32M-NEXT: srli s4, t1, 2
+; RV32M-NEXT: or t1, t1, s4
+; RV32M-NEXT: srli s4, t1, 4
+; RV32M-NEXT: or t1, t1, s4
+; RV32M-NEXT: srli s4, t1, 8
+; RV32M-NEXT: or t1, t1, s4
+; RV32M-NEXT: srli s4, t1, 16
+; RV32M-NEXT: or t1, t1, s4
+; RV32M-NEXT: not t1, t1
+; RV32M-NEXT: srli s4, t1, 1
+; RV32M-NEXT: and s1, s4, s1
+; RV32M-NEXT: sub t1, t1, s1
+; RV32M-NEXT: and s1, t1, s0
+; RV32M-NEXT: srli t1, t1, 2
+; RV32M-NEXT: and t1, t1, s0
+; RV32M-NEXT: add t1, s1, t1
+; RV32M-NEXT: srli s0, t1, 4
+; RV32M-NEXT: add t1, t1, s0
+; RV32M-NEXT: and t1, t1, t6
+; RV32M-NEXT: mul t1, t1, t2
+; RV32M-NEXT: srli t1, t1, 24
+; RV32M-NEXT: .LBB0_18: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: or a5, a2, a5
+; RV32M-NEXT: or a6, a6, a7
+; RV32M-NEXT: and a2, s2, a4
+; RV32M-NEXT: and a3, a3, t0
+; RV32M-NEXT: bnez s3, .LBB0_20
+; RV32M-NEXT: # %bb.19: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: mv t1, a1
+; RV32M-NEXT: .LBB0_20: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: seqz a1, a5
+; RV32M-NEXT: seqz a4, a6
+; RV32M-NEXT: sltu a6, a0, t1
+; RV32M-NEXT: sub a7, a2, a3
+; RV32M-NEXT: mv a5, a6
+; RV32M-NEXT: beq a2, a3, .LBB0_22
+; RV32M-NEXT: # %bb.21: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: sltu a5, a2, a3
+; RV32M-NEXT: .LBB0_22: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: sub a2, a7, a6
+; RV32M-NEXT: or a3, a1, a4
+; RV32M-NEXT: neg a1, a5
+; RV32M-NEXT: seqz s1, a5
+; RV32M-NEXT: addi s1, s1, -1
+; RV32M-NEXT: sub a0, a0, t1
+; RV32M-NEXT: or a5, a1, s1
+; RV32M-NEXT: xor a4, t3, t5
+; RV32M-NEXT: lw s3, 36(sp) # 4-byte Folded Reload
+; RV32M-NEXT: beqz a5, .LBB0_24
+; RV32M-NEXT: # %bb.23: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: snez a5, a5
+; RV32M-NEXT: j .LBB0_25
+; RV32M-NEXT: .LBB0_24:
+; RV32M-NEXT: snez a5, a2
+; RV32M-NEXT: sltiu a6, a0, 128
+; RV32M-NEXT: xori a6, a6, 1
+; RV32M-NEXT: or a5, a6, a5
+; RV32M-NEXT: .LBB0_25: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: sw t5, 44(sp) # 4-byte Folded Spill
+; RV32M-NEXT: srai a4, a4, 31
+; RV32M-NEXT: sw a4, 40(sp) # 4-byte Folded Spill
+; RV32M-NEXT: or a5, a3, a5
+; RV32M-NEXT: addi a4, a5, -1
+; RV32M-NEXT: and ra, a4, s8
+; RV32M-NEXT: and s11, a4, s7
+; RV32M-NEXT: and a3, a4, s9
+; RV32M-NEXT: and a4, a4, s10
+; RV32M-NEXT: sw t4, 76(sp) # 4-byte Folded Spill
+; RV32M-NEXT: bnez a5, .LBB0_36
+; RV32M-NEXT: # %bb.26: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: sw s5, 68(sp) # 4-byte Folded Spill
+; RV32M-NEXT: xori a5, a0, 127
+; RV32M-NEXT: or a5, a5, a1
+; RV32M-NEXT: or a6, a2, s1
+; RV32M-NEXT: or a5, a5, a6
+; RV32M-NEXT: beqz a5, .LBB0_36
+; RV32M-NEXT: # %bb.27: # %udiv-bb15
+; RV32M-NEXT: sw t3, 80(sp) # 4-byte Folded Spill
+; RV32M-NEXT: addi s11, a0, 1
+; RV32M-NEXT: li a3, 127
+; RV32M-NEXT: sub a0, a3, a0
+; RV32M-NEXT: sw zero, 184(sp)
+; RV32M-NEXT: sw zero, 188(sp)
+; RV32M-NEXT: sw zero, 192(sp)
+; RV32M-NEXT: sw zero, 196(sp)
+; RV32M-NEXT: sw s10, 200(sp)
+; RV32M-NEXT: sw s9, 204(sp)
+; RV32M-NEXT: sw s7, 208(sp)
+; RV32M-NEXT: sw s8, 212(sp)
+; RV32M-NEXT: addi a3, sp, 200
+; RV32M-NEXT: seqz ra, s11
+; RV32M-NEXT: srli a4, a0, 3
+; RV32M-NEXT: andi a5, a0, 31
+; RV32M-NEXT: add ra, a2, ra
+; RV32M-NEXT: andi a4, a4, 12
+; RV32M-NEXT: xori a2, a5, 31
+; RV32M-NEXT: or a5, s11, ra
+; RV32M-NEXT: sub a3, a3, a4
+; RV32M-NEXT: seqz s4, a5
+; RV32M-NEXT: lw a4, 0(a3)
+; RV32M-NEXT: lw a5, 4(a3)
+; RV32M-NEXT: lw a6, 8(a3)
+; RV32M-NEXT: lw a3, 12(a3)
+; RV32M-NEXT: add s4, a1, s4
+; RV32M-NEXT: sltu a1, s4, a1
+; RV32M-NEXT: or a7, s11, s4
+; RV32M-NEXT: add s1, s1, a1
+; RV32M-NEXT: or a1, ra, s1
+; RV32M-NEXT: srli t0, a6, 1
+; RV32M-NEXT: srli t1, a5, 1
+; RV32M-NEXT: or a7, a7, a1
+; RV32M-NEXT: srli a1, a4, 1
+; RV32M-NEXT: srl t0, t0, a2
+; RV32M-NEXT: srl t1, t1, a2
+; RV32M-NEXT: srl a2, a1, a2
+; RV32M-NEXT: sll a1, a3, a0
+; RV32M-NEXT: or a1, a1, t0
+; RV32M-NEXT: sll a3, a6, a0
+; RV32M-NEXT: sll a5, a5, a0
+; RV32M-NEXT: or s5, a3, t1
+; RV32M-NEXT: or t6, a5, a2
+; RV32M-NEXT: sll s0, a4, a0
+; RV32M-NEXT: li s2, 0
+; RV32M-NEXT: beqz a7, .LBB0_35
+; RV32M-NEXT: # %bb.28: # %udiv-preheader4
+; RV32M-NEXT: li a0, 0
+; RV32M-NEXT: li s3, 0
+; RV32M-NEXT: li a2, 0
+; RV32M-NEXT: sw zero, 168(sp)
+; RV32M-NEXT: sw zero, 172(sp)
+; RV32M-NEXT: sw zero, 176(sp)
+; RV32M-NEXT: sw zero, 180(sp)
+; RV32M-NEXT: sw s10, 152(sp)
+; RV32M-NEXT: sw s9, 156(sp)
+; RV32M-NEXT: sw s7, 160(sp)
+; RV32M-NEXT: sw s8, 164(sp)
+; RV32M-NEXT: srli a3, s11, 3
+; RV32M-NEXT: addi a4, sp, 152
+; RV32M-NEXT: andi a3, a3, 12
+; RV32M-NEXT: add a3, a4, a3
+; RV32M-NEXT: lw a4, 4(a3)
+; RV32M-NEXT: lw a5, 8(a3)
+; RV32M-NEXT: lw t0, 12(a3)
+; RV32M-NEXT: lw a3, 0(a3)
+; RV32M-NEXT: andi a6, s11, 31
+; RV32M-NEXT: xori a6, a6, 31
+; RV32M-NEXT: slli a7, t0, 1
+; RV32M-NEXT: slli t1, a5, 1
+; RV32M-NEXT: slli t2, a4, 1
+; RV32M-NEXT: sll a7, a7, a6
+; RV32M-NEXT: sll t1, t1, a6
+; RV32M-NEXT: sll t3, t2, a6
+; RV32M-NEXT: lw t4, 72(sp) # 4-byte Folded Reload
+; RV32M-NEXT: seqz a6, t4
+; RV32M-NEXT: srl a5, a5, s11
+; RV32M-NEXT: or a7, a5, a7
+; RV32M-NEXT: lw t2, 64(sp) # 4-byte Folded Reload
+; RV32M-NEXT: or a5, t4, t2
+; RV32M-NEXT: sub s7, t2, a6
+; RV32M-NEXT: seqz a5, a5
+; RV32M-NEXT: srl a4, a4, s11
+; RV32M-NEXT: or a6, a4, t1
+; RV32M-NEXT: lw a4, 68(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sub s8, a4, a5
+; RV32M-NEXT: sltu a4, a4, a5
+; RV32M-NEXT: sub s9, s6, a4
+; RV32M-NEXT: srl a3, a3, s11
+; RV32M-NEXT: srl t2, t0, s11
+; RV32M-NEXT: or a5, a3, t3
+; RV32M-NEXT: addi t4, t4, -1
+; RV32M-NEXT: sw t4, 60(sp) # 4-byte Folded Spill
+; RV32M-NEXT: j .LBB0_30
+; RV32M-NEXT: .LBB0_29: # %udiv-do-while3
+; RV32M-NEXT: # in Loop: Header=BB0_30 Depth=1
+; RV32M-NEXT: srli t3, s5, 31
+; RV32M-NEXT: slli a1, a1, 1
+; RV32M-NEXT: sub t0, t0, s10
+; RV32M-NEXT: srli s10, t6, 31
+; RV32M-NEXT: slli s5, s5, 1
+; RV32M-NEXT: or a1, a1, t3
+; RV32M-NEXT: srli t3, s0, 31
+; RV32M-NEXT: slli t6, t6, 1
+; RV32M-NEXT: slli s0, s0, 1
+; RV32M-NEXT: or s5, s5, s10
+; RV32M-NEXT: and s10, a7, s6
+; RV32M-NEXT: or t3, t6, t3
+; RV32M-NEXT: lw t4, 68(sp) # 4-byte Folded Reload
+; RV32M-NEXT: and t6, a7, t4
+; RV32M-NEXT: or s0, s2, s0
+; RV32M-NEXT: sub t4, t1, t6
+; RV32M-NEXT: sltu t1, t1, t6
+; RV32M-NEXT: or t6, s11, ra
+; RV32M-NEXT: sub s10, a6, s10
+; RV32M-NEXT: seqz t5, s11
+; RV32M-NEXT: addi s11, s11, -1
+; RV32M-NEXT: andi s2, a7, 1
+; RV32M-NEXT: sub a6, t0, a3
+; RV32M-NEXT: seqz a3, t6
+; RV32M-NEXT: sub ra, ra, t5
+; RV32M-NEXT: or t6, a0, t3
+; RV32M-NEXT: or s5, s3, s5
+; RV32M-NEXT: or a1, a2, a1
+; RV32M-NEXT: sub a7, t4, t2
+; RV32M-NEXT: sltu a0, t4, t2
+; RV32M-NEXT: sub a2, s10, t1
+; RV32M-NEXT: sltu t0, s4, a3
+; RV32M-NEXT: sub s4, s4, a3
+; RV32M-NEXT: sub t2, a2, a0
+; RV32M-NEXT: sub s1, s1, t0
+; RV32M-NEXT: or a0, ra, s1
+; RV32M-NEXT: or a2, s11, s4
+; RV32M-NEXT: or a3, a2, a0
+; RV32M-NEXT: sub a5, a5, a4
+; RV32M-NEXT: li a0, 0
+; RV32M-NEXT: li s3, 0
+; RV32M-NEXT: li a2, 0
+; RV32M-NEXT: beqz a3, .LBB0_35
+; RV32M-NEXT: .LBB0_30: # %udiv-do-while3
+; RV32M-NEXT: # =>This Inner Loop Header: Depth=1
+; RV32M-NEXT: srli a3, a5, 31
+; RV32M-NEXT: slli a4, a6, 1
+; RV32M-NEXT: slli a5, a5, 1
+; RV32M-NEXT: or t0, a4, a3
+; RV32M-NEXT: srli a3, a1, 31
+; RV32M-NEXT: or a5, a5, a3
+; RV32M-NEXT: beq s7, t0, .LBB0_32
+; RV32M-NEXT: # %bb.31: # %udiv-do-while3
+; RV32M-NEXT: # in Loop: Header=BB0_30 Depth=1
+; RV32M-NEXT: sltu a3, s7, t0
+; RV32M-NEXT: j .LBB0_33
+; RV32M-NEXT: .LBB0_32: # in Loop: Header=BB0_30 Depth=1
+; RV32M-NEXT: lw a3, 60(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sltu a3, a3, a5
+; RV32M-NEXT: .LBB0_33: # %udiv-do-while3
+; RV32M-NEXT: # in Loop: Header=BB0_30 Depth=1
+; RV32M-NEXT: srli a4, a7, 31
+; RV32M-NEXT: slli t2, t2, 1
+; RV32M-NEXT: srli t1, a6, 31
+; RV32M-NEXT: slli a7, a7, 1
+; RV32M-NEXT: or a6, t2, a4
+; RV32M-NEXT: or t1, a7, t1
+; RV32M-NEXT: sub a4, s8, t1
+; RV32M-NEXT: sltu a7, s8, t1
+; RV32M-NEXT: sub t2, s9, a6
+; RV32M-NEXT: sltu a3, a4, a3
+; RV32M-NEXT: sub a4, t2, a7
+; RV32M-NEXT: sub a4, a4, a3
+; RV32M-NEXT: srai a7, a4, 31
+; RV32M-NEXT: lw a3, 72(sp) # 4-byte Folded Reload
+; RV32M-NEXT: and a4, a7, a3
+; RV32M-NEXT: lw a3, 64(sp) # 4-byte Folded Reload
+; RV32M-NEXT: and s10, a7, a3
+; RV32M-NEXT: sltu a3, a5, a4
+; RV32M-NEXT: mv t2, a3
+; RV32M-NEXT: beq t0, s10, .LBB0_29
+; RV32M-NEXT: # %bb.34: # %udiv-do-while3
+; RV32M-NEXT: # in Loop: Header=BB0_30 Depth=1
+; RV32M-NEXT: sltu t2, t0, s10
+; RV32M-NEXT: j .LBB0_29
+; RV32M-NEXT: .LBB0_35: # %udiv-loop-exit2
+; RV32M-NEXT: srli a0, s0, 31
+; RV32M-NEXT: slli a3, t6, 1
+; RV32M-NEXT: srli a2, t6, 31
+; RV32M-NEXT: or a3, a3, a0
+; RV32M-NEXT: slli a0, s5, 1
+; RV32M-NEXT: srli a4, s5, 31
+; RV32M-NEXT: slli a1, a1, 1
+; RV32M-NEXT: slli s0, s0, 1
+; RV32M-NEXT: or s11, a0, a2
+; RV32M-NEXT: or ra, a1, a4
+; RV32M-NEXT: or a4, s2, s0
+; RV32M-NEXT: lw s3, 36(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw t3, 80(sp) # 4-byte Folded Reload
+; RV32M-NEXT: .LBB0_36: # %udiv-end1
+; RV32M-NEXT: lw s4, 40(sp) # 4-byte Folded Reload
+; RV32M-NEXT: xor a0, a4, s4
+; RV32M-NEXT: sw a0, 64(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sltu s5, a0, s4
+; RV32M-NEXT: xor a1, a3, s4
+; RV32M-NEXT: sw s5, 60(sp) # 4-byte Folded Spill
+; RV32M-NEXT: lw a6, 84(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw t6, 76(sp) # 4-byte Folded Reload
+; RV32M-NEXT: beqz a3, .LBB0_38
+; RV32M-NEXT: # %bb.37: # %udiv-end1
+; RV32M-NEXT: sltu s5, a1, s4
+; RV32M-NEXT: .LBB0_38: # %udiv-end1
+; RV32M-NEXT: lw s6, 56(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s8, 52(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s10, 48(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw a0, 44(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sw a1, 24(sp) # 4-byte Folded Spill
+; RV32M-NEXT: bltz a0, .LBB0_40
+; RV32M-NEXT: # %bb.39: # %udiv-end1
+; RV32M-NEXT: mv s9, a0
+; RV32M-NEXT: bltz t3, .LBB0_41
+; RV32M-NEXT: j .LBB0_42
+; RV32M-NEXT: .LBB0_40:
+; RV32M-NEXT: neg a0, s10
+; RV32M-NEXT: lw a1, 12(sp) # 4-byte Folded Reload
+; RV32M-NEXT: neg a1, a1
+; RV32M-NEXT: lw a2, 16(sp) # 4-byte Folded Reload
+; RV32M-NEXT: add a2, s8, a2
+; RV32M-NEXT: lw a4, 20(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sltu a3, a0, a4
+; RV32M-NEXT: sub s10, a0, a4
+; RV32M-NEXT: neg s8, a2
+; RV32M-NEXT: sub s9, a1, a3
+; RV32M-NEXT: neg s6, s6
+; RV32M-NEXT: bgez t3, .LBB0_42
+; RV32M-NEXT: .LBB0_41:
+; RV32M-NEXT: neg a0, a6
+; RV32M-NEXT: lw a1, 0(sp) # 4-byte Folded Reload
+; RV32M-NEXT: neg a1, a1
+; RV32M-NEXT: lw a2, 4(sp) # 4-byte Folded Reload
+; RV32M-NEXT: add a2, t6, a2
+; RV32M-NEXT: lw a4, 8(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sltu a3, a0, a4
+; RV32M-NEXT: sub a6, a0, a4
+; RV32M-NEXT: neg t6, a2
+; RV32M-NEXT: sub t3, a1, a3
+; RV32M-NEXT: neg s3, s3
+; RV32M-NEXT: .LBB0_42: # %udiv-end1
+; RV32M-NEXT: lui a0, 349525
+; RV32M-NEXT: lui a1, 209715
+; RV32M-NEXT: lui a2, 61681
+; RV32M-NEXT: lui a3, 4112
+; RV32M-NEXT: addi s2, a0, 1365
+; RV32M-NEXT: addi s1, a1, 819
+; RV32M-NEXT: addi s0, a2, -241
+; RV32M-NEXT: addi a1, a3, 257
+; RV32M-NEXT: bnez t6, .LBB0_45
+; RV32M-NEXT: # %bb.43: # %udiv-end1
+; RV32M-NEXT: srli a0, s3, 1
+; RV32M-NEXT: or a0, s3, a0
+; RV32M-NEXT: srli a2, a0, 2
+; RV32M-NEXT: or a0, a0, a2
+; RV32M-NEXT: srli a2, a0, 4
+; RV32M-NEXT: or a0, a0, a2
+; RV32M-NEXT: srli a2, a0, 8
+; RV32M-NEXT: or a0, a0, a2
+; RV32M-NEXT: srli a2, a0, 16
+; RV32M-NEXT: or a0, a0, a2
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a2, a0, 1
+; RV32M-NEXT: and a2, a2, s2
+; RV32M-NEXT: sub a0, a0, a2
+; RV32M-NEXT: and a2, a0, s1
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, s1
+; RV32M-NEXT: add a0, a2, a0
+; RV32M-NEXT: srli a2, a0, 4
+; RV32M-NEXT: add a0, a0, a2
+; RV32M-NEXT: and a0, a0, s0
+; RV32M-NEXT: mul a0, a0, a1
+; RV32M-NEXT: srli a0, a0, 24
+; RV32M-NEXT: addi a2, a0, 32
+; RV32M-NEXT: or a4, a6, t3
+; RV32M-NEXT: beqz t3, .LBB0_46
+; RV32M-NEXT: .LBB0_44:
+; RV32M-NEXT: srli a0, t3, 1
+; RV32M-NEXT: or a0, t3, a0
+; RV32M-NEXT: srli a3, a0, 2
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: srli a3, a0, 4
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: srli a3, a0, 8
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: srli a3, a0, 16
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a3, a0, 1
+; RV32M-NEXT: and a3, a3, s2
+; RV32M-NEXT: sub a0, a0, a3
+; RV32M-NEXT: and a3, a0, s1
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, s1
+; RV32M-NEXT: add a0, a3, a0
+; RV32M-NEXT: srli a3, a0, 4
+; RV32M-NEXT: add a0, a0, a3
+; RV32M-NEXT: and a0, a0, s0
+; RV32M-NEXT: mul a0, a0, a1
+; RV32M-NEXT: srli a0, a0, 24
+; RV32M-NEXT: addi a5, a2, 64
+; RV32M-NEXT: beqz a4, .LBB0_47
+; RV32M-NEXT: j .LBB0_48
+; RV32M-NEXT: .LBB0_45:
+; RV32M-NEXT: srli a0, t6, 1
+; RV32M-NEXT: or a0, t6, a0
+; RV32M-NEXT: srli a2, a0, 2
+; RV32M-NEXT: or a0, a0, a2
+; RV32M-NEXT: srli a2, a0, 4
+; RV32M-NEXT: or a0, a0, a2
+; RV32M-NEXT: srli a2, a0, 8
+; RV32M-NEXT: or a0, a0, a2
+; RV32M-NEXT: srli a2, a0, 16
+; RV32M-NEXT: or a0, a0, a2
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a2, a0, 1
+; RV32M-NEXT: and a2, a2, s2
+; RV32M-NEXT: sub a0, a0, a2
+; RV32M-NEXT: and a2, a0, s1
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, s1
+; RV32M-NEXT: add a0, a2, a0
+; RV32M-NEXT: srli a2, a0, 4
+; RV32M-NEXT: add a0, a0, a2
+; RV32M-NEXT: and a0, a0, s0
+; RV32M-NEXT: mul a2, a0, a1
+; RV32M-NEXT: srli a2, a2, 24
+; RV32M-NEXT: or a4, a6, t3
+; RV32M-NEXT: bnez t3, .LBB0_44
+; RV32M-NEXT: .LBB0_46: # %udiv-end1
+; RV32M-NEXT: srli a0, a6, 1
+; RV32M-NEXT: or a0, a6, a0
+; RV32M-NEXT: srli a3, a0, 2
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: srli a3, a0, 4
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: srli a3, a0, 8
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: srli a3, a0, 16
+; RV32M-NEXT: or a0, a0, a3
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a3, a0, 1
+; RV32M-NEXT: and a3, a3, s2
+; RV32M-NEXT: sub a0, a0, a3
+; RV32M-NEXT: and a3, a0, s1
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, s1
+; RV32M-NEXT: add a0, a3, a0
+; RV32M-NEXT: srli a3, a0, 4
+; RV32M-NEXT: add a0, a0, a3
+; RV32M-NEXT: and a0, a0, s0
+; RV32M-NEXT: mul a0, a0, a1
+; RV32M-NEXT: srli a0, a0, 24
+; RV32M-NEXT: addi a0, a0, 32
+; RV32M-NEXT: addi a5, a2, 64
+; RV32M-NEXT: bnez a4, .LBB0_48
+; RV32M-NEXT: .LBB0_47: # %udiv-end1
+; RV32M-NEXT: mv a0, a5
+; RV32M-NEXT: .LBB0_48: # %udiv-end1
+; RV32M-NEXT: snez t0, a4
+; RV32M-NEXT: bnez s8, .LBB0_50
+; RV32M-NEXT: # %bb.49: # %udiv-end1
+; RV32M-NEXT: srli a3, s6, 1
+; RV32M-NEXT: or a3, s6, a3
+; RV32M-NEXT: srli a4, a3, 2
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: srli a4, a3, 4
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: srli a4, a3, 8
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: srli a4, a3, 16
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: not a3, a3
+; RV32M-NEXT: srli a4, a3, 1
+; RV32M-NEXT: and a4, a4, s2
+; RV32M-NEXT: sub a3, a3, a4
+; RV32M-NEXT: and a4, a3, s1
+; RV32M-NEXT: srli a3, a3, 2
+; RV32M-NEXT: and a3, a3, s1
+; RV32M-NEXT: add a3, a4, a3
+; RV32M-NEXT: srli a4, a3, 4
+; RV32M-NEXT: add a3, a3, a4
+; RV32M-NEXT: and a3, a3, s0
+; RV32M-NEXT: mul a3, a3, a1
+; RV32M-NEXT: srli a3, a3, 24
+; RV32M-NEXT: addi a3, a3, 32
+; RV32M-NEXT: j .LBB0_51
+; RV32M-NEXT: .LBB0_50:
+; RV32M-NEXT: srli a3, s8, 1
+; RV32M-NEXT: or a3, s8, a3
+; RV32M-NEXT: srli a4, a3, 2
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: srli a4, a3, 4
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: srli a4, a3, 8
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: srli a4, a3, 16
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: not a3, a3
+; RV32M-NEXT: srli a4, a3, 1
+; RV32M-NEXT: and a4, a4, s2
+; RV32M-NEXT: sub a3, a3, a4
+; RV32M-NEXT: and a4, a3, s1
+; RV32M-NEXT: srli a3, a3, 2
+; RV32M-NEXT: and a3, a3, s1
+; RV32M-NEXT: add a3, a4, a3
+; RV32M-NEXT: srli a4, a3, 4
+; RV32M-NEXT: add a3, a3, a4
+; RV32M-NEXT: and a3, a3, s0
+; RV32M-NEXT: mul a3, a3, a1
+; RV32M-NEXT: srli a3, a3, 24
+; RV32M-NEXT: .LBB0_51: # %udiv-end1
+; RV32M-NEXT: sw a6, 84(sp) # 4-byte Folded Spill
+; RV32M-NEXT: or a4, s3, a6
+; RV32M-NEXT: sw t3, 80(sp) # 4-byte Folded Spill
+; RV32M-NEXT: or a6, t6, t3
+; RV32M-NEXT: or a7, s6, s10
+; RV32M-NEXT: or t2, s8, s9
+; RV32M-NEXT: sltu a5, a5, a2
+; RV32M-NEXT: addi t0, t0, -1
+; RV32M-NEXT: addi a2, a3, 64
+; RV32M-NEXT: or t3, s10, s9
+; RV32M-NEXT: sltu t4, a2, a3
+; RV32M-NEXT: snez a3, t3
+; RV32M-NEXT: addi a3, a3, -1
+; RV32M-NEXT: bnez s9, .LBB0_53
+; RV32M-NEXT: # %bb.52: # %udiv-end1
+; RV32M-NEXT: srli t1, s10, 1
+; RV32M-NEXT: or t1, s10, t1
+; RV32M-NEXT: srli t5, t1, 2
+; RV32M-NEXT: or t1, t1, t5
+; RV32M-NEXT: srli t5, t1, 4
+; RV32M-NEXT: or t1, t1, t5
+; RV32M-NEXT: srli t5, t1, 8
+; RV32M-NEXT: or t1, t1, t5
+; RV32M-NEXT: srli t5, t1, 16
+; RV32M-NEXT: or t1, t1, t5
+; RV32M-NEXT: not t1, t1
+; RV32M-NEXT: srli t5, t1, 1
+; RV32M-NEXT: and t5, t5, s2
+; RV32M-NEXT: sub t1, t1, t5
+; RV32M-NEXT: and t5, t1, s1
+; RV32M-NEXT: srli t1, t1, 2
+; RV32M-NEXT: and t1, t1, s1
+; RV32M-NEXT: add t1, t5, t1
+; RV32M-NEXT: srli t5, t1, 4
+; RV32M-NEXT: add t1, t1, t5
+; RV32M-NEXT: and t1, t1, s0
+; RV32M-NEXT: mul a1, t1, a1
+; RV32M-NEXT: srli a1, a1, 24
+; RV32M-NEXT: addi t1, a1, 32
+; RV32M-NEXT: j .LBB0_54
+; RV32M-NEXT: .LBB0_53:
+; RV32M-NEXT: srli t1, s9, 1
+; RV32M-NEXT: or t1, s9, t1
+; RV32M-NEXT: srli t5, t1, 2
+; RV32M-NEXT: or t1, t1, t5
+; RV32M-NEXT: srli t5, t1, 4
+; RV32M-NEXT: or t1, t1, t5
+; RV32M-NEXT: srli t5, t1, 8
+; RV32M-NEXT: or t1, t1, t5
+; RV32M-NEXT: srli t5, t1, 16
+; RV32M-NEXT: or t1, t1, t5
+; RV32M-NEXT: not t1, t1
+; RV32M-NEXT: srli t5, t1, 1
+; RV32M-NEXT: and t5, t5, s2
+; RV32M-NEXT: sub t1, t1, t5
+; RV32M-NEXT: and t5, t1, s1
+; RV32M-NEXT: srli t1, t1, 2
+; RV32M-NEXT: and t1, t1, s1
+; RV32M-NEXT: add t1, t5, t1
+; RV32M-NEXT: srli t5, t1, 4
+; RV32M-NEXT: add t1, t1, t5
+; RV32M-NEXT: and t1, t1, s0
+; RV32M-NEXT: mul a1, t1, a1
+; RV32M-NEXT: srli t1, a1, 24
+; RV32M-NEXT: .LBB0_54: # %udiv-end1
+; RV32M-NEXT: or a4, a4, a6
+; RV32M-NEXT: or a6, a7, t2
+; RV32M-NEXT: and a1, t0, a5
+; RV32M-NEXT: and a3, a3, t4
+; RV32M-NEXT: bnez t3, .LBB0_56
+; RV32M-NEXT: # %bb.55: # %udiv-end1
+; RV32M-NEXT: mv t1, a2
+; RV32M-NEXT: .LBB0_56: # %udiv-end1
+; RV32M-NEXT: seqz a4, a4
+; RV32M-NEXT: seqz a5, a6
+; RV32M-NEXT: sltu a6, a0, t1
+; RV32M-NEXT: sub t0, a1, a3
+; RV32M-NEXT: mv a7, a6
+; RV32M-NEXT: beq a1, a3, .LBB0_58
+; RV32M-NEXT: # %bb.57: # %udiv-end1
+; RV32M-NEXT: sltu a7, a1, a3
+; RV32M-NEXT: .LBB0_58: # %udiv-end1
+; RV32M-NEXT: xor a2, ra, s4
+; RV32M-NEXT: xor a3, s11, s4
+; RV32M-NEXT: sub s0, t0, a6
+; RV32M-NEXT: or a4, a4, a5
+; RV32M-NEXT: neg a1, a7
+; RV32M-NEXT: seqz s7, a7
+; RV32M-NEXT: addi s7, s7, -1
+; RV32M-NEXT: or a5, a1, s7
+; RV32M-NEXT: sub a0, a0, t1
+; RV32M-NEXT: beqz a5, .LBB0_60
+; RV32M-NEXT: # %bb.59: # %udiv-end1
+; RV32M-NEXT: snez a5, a5
+; RV32M-NEXT: j .LBB0_61
+; RV32M-NEXT: .LBB0_60:
+; RV32M-NEXT: snez a5, s0
+; RV32M-NEXT: sltiu a6, a0, 128
+; RV32M-NEXT: xori a6, a6, 1
+; RV32M-NEXT: or a5, a6, a5
+; RV32M-NEXT: .LBB0_61: # %udiv-end1
+; RV32M-NEXT: sub s11, a3, s4
+; RV32M-NEXT: sltu t1, a3, s4
+; RV32M-NEXT: sub t2, a2, s4
+; RV32M-NEXT: or a5, a4, a5
+; RV32M-NEXT: addi a2, a5, -1
+; RV32M-NEXT: and a7, a2, s9
+; RV32M-NEXT: and t0, a2, s10
+; RV32M-NEXT: and a4, a2, s8
+; RV32M-NEXT: and a6, a2, s6
+; RV32M-NEXT: sw t6, 76(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s9, 68(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s5, 36(sp) # 4-byte Folded Spill
+; RV32M-NEXT: bnez a5, .LBB0_73
+; RV32M-NEXT: # %bb.62: # %udiv-end1
+; RV32M-NEXT: xori a2, a0, 127
+; RV32M-NEXT: or a2, a2, a1
+; RV32M-NEXT: or a3, s0, s7
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: beqz a2, .LBB0_73
+; RV32M-NEXT: # %bb.63: # %udiv-bb1
+; RV32M-NEXT: sw t2, 12(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw t1, 16(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s11, 20(sp) # 4-byte Folded Spill
+; RV32M-NEXT: addi s4, a0, 1
+; RV32M-NEXT: li a2, 127
+; RV32M-NEXT: sub a2, a2, a0
+; RV32M-NEXT: sw zero, 120(sp)
+; RV32M-NEXT: sw zero, 124(sp)
+; RV32M-NEXT: sw zero, 128(sp)
+; RV32M-NEXT: sw zero, 132(sp)
+; RV32M-NEXT: sw s6, 136(sp)
+; RV32M-NEXT: sw s8, 140(sp)
+; RV32M-NEXT: sw s10, 144(sp)
+; RV32M-NEXT: lw t3, 68(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sw t3, 148(sp)
+; RV32M-NEXT: addi a0, sp, 136
+; RV32M-NEXT: seqz a3, s4
+; RV32M-NEXT: srli a4, a2, 3
+; RV32M-NEXT: andi a5, a2, 31
+; RV32M-NEXT: add s0, s0, a3
+; RV32M-NEXT: andi a4, a4, 12
+; RV32M-NEXT: xori a3, a5, 31
+; RV32M-NEXT: or a5, s4, s0
+; RV32M-NEXT: sub a0, a0, a4
+; RV32M-NEXT: seqz s9, a5
+; RV32M-NEXT: lw a4, 0(a0)
+; RV32M-NEXT: lw a5, 4(a0)
+; RV32M-NEXT: lw a6, 8(a0)
+; RV32M-NEXT: lw a0, 12(a0)
+; RV32M-NEXT: add s9, a1, s9
+; RV32M-NEXT: sltu a1, s9, a1
+; RV32M-NEXT: or a7, s4, s9
+; RV32M-NEXT: add s7, s7, a1
+; RV32M-NEXT: or a1, s0, s7
+; RV32M-NEXT: srli t0, a6, 1
+; RV32M-NEXT: srli t1, a5, 1
+; RV32M-NEXT: or a7, a7, a1
+; RV32M-NEXT: srli a1, a4, 1
+; RV32M-NEXT: srl t0, t0, a3
+; RV32M-NEXT: srl t1, t1, a3
+; RV32M-NEXT: srl a1, a1, a3
+; RV32M-NEXT: sll a0, a0, a2
+; RV32M-NEXT: or a0, a0, t0
+; RV32M-NEXT: sll a3, a6, a2
+; RV32M-NEXT: sll a5, a5, a2
+; RV32M-NEXT: mv a6, s10
+; RV32M-NEXT: or s10, a3, t1
+; RV32M-NEXT: or a1, a5, a1
+; RV32M-NEXT: sll s5, a4, a2
+; RV32M-NEXT: sw s6, 56(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s8, 52(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw a6, 48(sp) # 4-byte Folded Spill
+; RV32M-NEXT: beqz a7, .LBB0_71
+; RV32M-NEXT: # %bb.64: # %udiv-preheader
+; RV32M-NEXT: mv t2, s8
+; RV32M-NEXT: li s8, 0
+; RV32M-NEXT: li s11, 0
+; RV32M-NEXT: li ra, 0
+; RV32M-NEXT: li a2, 0
+; RV32M-NEXT: sw zero, 104(sp)
+; RV32M-NEXT: sw zero, 108(sp)
+; RV32M-NEXT: sw zero, 112(sp)
+; RV32M-NEXT: sw zero, 116(sp)
+; RV32M-NEXT: sw s6, 88(sp)
+; RV32M-NEXT: sw t2, 92(sp)
+; RV32M-NEXT: sw a6, 96(sp)
+; RV32M-NEXT: sw t3, 100(sp)
+; RV32M-NEXT: srli a3, s4, 3
+; RV32M-NEXT: addi a4, sp, 88
+; RV32M-NEXT: andi a3, a3, 12
+; RV32M-NEXT: add a3, a4, a3
+; RV32M-NEXT: lw a4, 4(a3)
+; RV32M-NEXT: lw a5, 8(a3)
+; RV32M-NEXT: lw a7, 12(a3)
+; RV32M-NEXT: lw a3, 0(a3)
+; RV32M-NEXT: andi a6, s4, 31
+; RV32M-NEXT: xori a6, a6, 31
+; RV32M-NEXT: slli t0, a7, 1
+; RV32M-NEXT: slli t1, a5, 1
+; RV32M-NEXT: slli t2, a4, 1
+; RV32M-NEXT: sll t0, t0, a6
+; RV32M-NEXT: sll t1, t1, a6
+; RV32M-NEXT: sll t6, t2, a6
+; RV32M-NEXT: seqz a6, s3
+; RV32M-NEXT: srl a5, a5, s4
+; RV32M-NEXT: or t5, a5, t0
+; RV32M-NEXT: lw t0, 76(sp) # 4-byte Folded Reload
+; RV32M-NEXT: or a5, s3, t0
+; RV32M-NEXT: sub s6, t0, a6
+; RV32M-NEXT: seqz a5, a5
+; RV32M-NEXT: srl a4, a4, s4
+; RV32M-NEXT: or a6, a4, t1
+; RV32M-NEXT: lw a4, 84(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sub t3, a4, a5
+; RV32M-NEXT: sltu a4, a4, a5
+; RV32M-NEXT: lw a5, 80(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sub t4, a5, a4
+; RV32M-NEXT: srl a3, a3, s4
+; RV32M-NEXT: srl t2, a7, s4
+; RV32M-NEXT: or a5, a3, t6
+; RV32M-NEXT: addi a3, s3, -1
+; RV32M-NEXT: sw a3, 72(sp) # 4-byte Folded Spill
+; RV32M-NEXT: j .LBB0_66
+; RV32M-NEXT: .LBB0_65: # %udiv-do-while
+; RV32M-NEXT: # in Loop: Header=BB0_66 Depth=1
+; RV32M-NEXT: srli s3, s10, 31
+; RV32M-NEXT: slli a0, a0, 1
+; RV32M-NEXT: sub t0, t0, s2
+; RV32M-NEXT: srli s2, a1, 31
+; RV32M-NEXT: slli s10, s10, 1
+; RV32M-NEXT: or a0, a0, s3
+; RV32M-NEXT: srli s3, s5, 31
+; RV32M-NEXT: slli a1, a1, 1
+; RV32M-NEXT: slli s5, s5, 1
+; RV32M-NEXT: or s2, s10, s2
+; RV32M-NEXT: lw t6, 80(sp) # 4-byte Folded Reload
+; RV32M-NEXT: and s10, t5, t6
+; RV32M-NEXT: or a1, a1, s3
+; RV32M-NEXT: lw t6, 84(sp) # 4-byte Folded Reload
+; RV32M-NEXT: and s3, t5, t6
+; RV32M-NEXT: or s5, s8, s5
+; RV32M-NEXT: sub s1, t1, s3
+; RV32M-NEXT: sltu t1, t1, s3
+; RV32M-NEXT: or s3, s4, s0
+; RV32M-NEXT: sub t6, a6, s10
+; RV32M-NEXT: seqz s10, s4
+; RV32M-NEXT: addi s4, s4, -1
+; RV32M-NEXT: andi s8, t5, 1
+; RV32M-NEXT: sub a6, t0, a3
+; RV32M-NEXT: seqz a3, s3
+; RV32M-NEXT: sub s0, s0, s10
+; RV32M-NEXT: or a1, s11, a1
+; RV32M-NEXT: or s10, ra, s2
+; RV32M-NEXT: or a0, a2, a0
+; RV32M-NEXT: sub t5, s1, t2
+; RV32M-NEXT: sltu a2, s1, t2
+; RV32M-NEXT: sub t0, t6, t1
+; RV32M-NEXT: sltu t1, s9, a3
+; RV32M-NEXT: sub s9, s9, a3
+; RV32M-NEXT: sub t2, t0, a2
+; RV32M-NEXT: sub s7, s7, t1
+; RV32M-NEXT: or a2, s0, s7
+; RV32M-NEXT: or a3, s4, s9
+; RV32M-NEXT: or a3, a3, a2
+; RV32M-NEXT: sub a5, a5, a4
+; RV32M-NEXT: li s11, 0
+; RV32M-NEXT: li ra, 0
+; RV32M-NEXT: li a2, 0
+; RV32M-NEXT: mv s3, a7
+; RV32M-NEXT: beqz a3, .LBB0_72
+; RV32M-NEXT: .LBB0_66: # %udiv-do-while
+; RV32M-NEXT: # =>This Inner Loop Header: Depth=1
+; RV32M-NEXT: srli a3, a5, 31
+; RV32M-NEXT: slli a4, a6, 1
+; RV32M-NEXT: slli a5, a5, 1
+; RV32M-NEXT: or t0, a4, a3
+; RV32M-NEXT: srli a3, a0, 31
+; RV32M-NEXT: or a5, a5, a3
+; RV32M-NEXT: beq s6, t0, .LBB0_68
+; RV32M-NEXT: # %bb.67: # %udiv-do-while
+; RV32M-NEXT: # in Loop: Header=BB0_66 Depth=1
+; RV32M-NEXT: sltu a3, s6, t0
+; RV32M-NEXT: j .LBB0_69
+; RV32M-NEXT: .LBB0_68: # in Loop: Header=BB0_66 Depth=1
+; RV32M-NEXT: lw a3, 72(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sltu a3, a3, a5
+; RV32M-NEXT: .LBB0_69: # %udiv-do-while
+; RV32M-NEXT: # in Loop: Header=BB0_66 Depth=1
+; RV32M-NEXT: srli a4, t5, 31
+; RV32M-NEXT: slli t2, t2, 1
+; RV32M-NEXT: srli t1, a6, 31
+; RV32M-NEXT: slli t5, t5, 1
+; RV32M-NEXT: or a6, t2, a4
+; RV32M-NEXT: or t1, t5, t1
+; RV32M-NEXT: sub a4, t3, t1
+; RV32M-NEXT: sltu t2, t3, t1
+; RV32M-NEXT: sub t5, t4, a6
+; RV32M-NEXT: sltu a3, a4, a3
+; RV32M-NEXT: sub a4, t5, t2
+; RV32M-NEXT: sub a4, a4, a3
+; RV32M-NEXT: srai t5, a4, 31
+; RV32M-NEXT: mv a7, s3
+; RV32M-NEXT: and a4, t5, s3
+; RV32M-NEXT: lw a3, 76(sp) # 4-byte Folded Reload
+; RV32M-NEXT: and s2, t5, a3
+; RV32M-NEXT: sltu a3, a5, a4
+; RV32M-NEXT: mv t2, a3
+; RV32M-NEXT: beq t0, s2, .LBB0_65
+; RV32M-NEXT: # %bb.70: # %udiv-do-while
+; RV32M-NEXT: # in Loop: Header=BB0_66 Depth=1
+; RV32M-NEXT: sltu t2, t0, s2
+; RV32M-NEXT: j .LBB0_65
+; RV32M-NEXT: .LBB0_71:
+; RV32M-NEXT: li s8, 0
+; RV32M-NEXT: .LBB0_72: # %udiv-loop-exit
+; RV32M-NEXT: srli a2, s5, 31
+; RV32M-NEXT: slli a4, a1, 1
+; RV32M-NEXT: srli a1, a1, 31
+; RV32M-NEXT: or a4, a4, a2
+; RV32M-NEXT: slli a2, s10, 1
+; RV32M-NEXT: srli a3, s10, 31
+; RV32M-NEXT: slli a0, a0, 1
+; RV32M-NEXT: slli s5, s5, 1
+; RV32M-NEXT: or t0, a2, a1
+; RV32M-NEXT: or a7, a0, a3
+; RV32M-NEXT: or a6, s8, s5
+; RV32M-NEXT: lw s6, 56(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s8, 52(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s10, 48(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s11, 20(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw t1, 16(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw t2, 12(sp) # 4-byte Folded Reload
+; RV32M-NEXT: .LBB0_73: # %udiv-end
+; RV32M-NEXT: lw s9, 36(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sltu a1, s11, s9
+; RV32M-NEXT: sub a2, t2, t1
+; RV32M-NEXT: lw s7, 40(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw a0, 24(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sub a5, a0, s7
+; RV32M-NEXT: lw a0, 44(sp) # 4-byte Folded Reload
+; RV32M-NEXT: srai a0, a0, 31
+; RV32M-NEXT: mulhu t1, s3, a6
+; RV32M-NEXT: lw s5, 76(sp) # 4-byte Folded Reload
+; RV32M-NEXT: mul t2, s5, a6
+; RV32M-NEXT: mulhu t3, s5, a6
+; RV32M-NEXT: mul t4, s3, a4
+; RV32M-NEXT: mulhu t5, s3, a4
+; RV32M-NEXT: mul t6, s5, a4
+; RV32M-NEXT: lw s4, 84(sp) # 4-byte Folded Reload
+; RV32M-NEXT: mul s0, a6, s4
+; RV32M-NEXT: mul s1, t0, s3
+; RV32M-NEXT: mulhu s2, s5, a4
+; RV32M-NEXT: mv a3, s3
+; RV32M-NEXT: mul s3, t0, s5
+; RV32M-NEXT: mulhu t0, t0, a3
+; RV32M-NEXT: mul a7, a7, a3
+; RV32M-NEXT: mul a4, a4, s4
+; RV32M-NEXT: mulhu s4, a6, s4
+; RV32M-NEXT: lw s5, 80(sp) # 4-byte Folded Reload
+; RV32M-NEXT: mul s5, a6, s5
+; RV32M-NEXT: mul a3, a3, a6
+; RV32M-NEXT: add a6, t2, t1
+; RV32M-NEXT: add s0, s1, s0
+; RV32M-NEXT: add t0, t0, s3
+; RV32M-NEXT: add s4, s4, s5
+; RV32M-NEXT: sltu t1, a6, t2
+; RV32M-NEXT: add a6, t4, a6
+; RV32M-NEXT: add a7, t0, a7
+; RV32M-NEXT: add a4, s4, a4
+; RV32M-NEXT: sltu t0, s0, s1
+; RV32M-NEXT: add t1, t3, t1
+; RV32M-NEXT: sltu t2, a6, t4
+; RV32M-NEXT: add a4, a7, a4
+; RV32M-NEXT: add t2, t5, t2
+; RV32M-NEXT: add a4, a4, t0
+; RV32M-NEXT: add t2, t1, t2
+; RV32M-NEXT: add a7, t6, t2
+; RV32M-NEXT: sltu t1, t2, t1
+; RV32M-NEXT: add t0, a7, s0
+; RV32M-NEXT: sltu t2, a7, t6
+; RV32M-NEXT: add t1, s2, t1
+; RV32M-NEXT: sltu a7, t0, a7
+; RV32M-NEXT: add t1, t1, t2
+; RV32M-NEXT: sltu t2, s10, t0
+; RV32M-NEXT: add a4, t1, a4
+; RV32M-NEXT: lw t1, 68(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sub a7, t1, a7
+; RV32M-NEXT: sub a4, a7, a4
+; RV32M-NEXT: sltu t1, s6, a3
+; RV32M-NEXT: sub a7, a4, t2
+; RV32M-NEXT: mv t2, t1
+; RV32M-NEXT: beq s8, a6, .LBB0_75
+; RV32M-NEXT: # %bb.74: # %udiv-end
+; RV32M-NEXT: sltu t2, s8, a6
+; RV32M-NEXT: .LBB0_75: # %udiv-end
+; RV32M-NEXT: sub a2, a2, a1
+; RV32M-NEXT: lw a1, 60(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sub a1, a5, a1
+; RV32M-NEXT: sub a4, s11, s9
+; RV32M-NEXT: lw a5, 64(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sub a5, a5, s7
+; RV32M-NEXT: sub t0, s10, t0
+; RV32M-NEXT: sub a6, s8, a6
+; RV32M-NEXT: sub a3, s6, a3
+; RV32M-NEXT: sltu t3, t0, t2
+; RV32M-NEXT: sub t0, t0, t2
+; RV32M-NEXT: sub t4, a6, t1
+; RV32M-NEXT: xor a3, a3, a0
+; RV32M-NEXT: sub t1, a7, t3
+; RV32M-NEXT: xor t2, t0, a0
+; RV32M-NEXT: xor a7, t4, a0
+; RV32M-NEXT: sltu a6, a3, a0
+; RV32M-NEXT: xor t0, t1, a0
+; RV32M-NEXT: sltu t1, t2, a0
+; RV32M-NEXT: add t1, a0, t1
+; RV32M-NEXT: sub t0, t0, t1
+; RV32M-NEXT: sub t1, t2, a0
+; RV32M-NEXT: mv t2, a6
+; RV32M-NEXT: beqz t4, .LBB0_77
+; RV32M-NEXT: # %bb.76: # %udiv-end
+; RV32M-NEXT: sltu t2, a7, a0
+; RV32M-NEXT: .LBB0_77: # %udiv-end
+; RV32M-NEXT: sltu t3, t1, t2
+; RV32M-NEXT: sub t1, t1, t2
+; RV32M-NEXT: sub a7, a7, a0
+; RV32M-NEXT: sub a3, a3, a0
+; RV32M-NEXT: lw a0, 28(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sw a5, 0(a0)
+; RV32M-NEXT: sw a1, 4(a0)
+; RV32M-NEXT: sw a4, 8(a0)
+; RV32M-NEXT: sw a2, 12(a0)
+; RV32M-NEXT: sub a0, t0, t3
+; RV32M-NEXT: sub a1, a7, a6
+; RV32M-NEXT: lw a2, 32(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sw a3, 0(a2)
+; RV32M-NEXT: sw a1, 4(a2)
+; RV32M-NEXT: sw t1, 8(a2)
+; RV32M-NEXT: sw a0, 12(a2)
+; RV32M-NEXT: lw ra, 268(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s0, 264(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s1, 260(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s2, 256(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s3, 252(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s4, 248(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s5, 244(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s6, 240(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s7, 236(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s8, 232(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s9, 228(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s10, 224(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s11, 220(sp) # 4-byte Folded Reload
+; RV32M-NEXT: .cfi_restore ra
+; RV32M-NEXT: .cfi_restore s0
+; RV32M-NEXT: .cfi_restore s1
+; RV32M-NEXT: .cfi_restore s2
+; RV32M-NEXT: .cfi_restore s3
+; RV32M-NEXT: .cfi_restore s4
+; RV32M-NEXT: .cfi_restore s5
+; RV32M-NEXT: .cfi_restore s6
+; RV32M-NEXT: .cfi_restore s7
+; RV32M-NEXT: .cfi_restore s8
+; RV32M-NEXT: .cfi_restore s9
+; RV32M-NEXT: .cfi_restore s10
+; RV32M-NEXT: .cfi_restore s11
+; RV32M-NEXT: addi sp, sp, 272
+; RV32M-NEXT: .cfi_def_cfa_offset 0
+; RV32M-NEXT: ret
+ %q = sdiv i128 %n, %d
+ %r = srem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
+
+define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; RV32I-LABEL: udivrem_i128:
+; RV32I: # %bb.0: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: addi sp, sp, -240
+; RV32I-NEXT: .cfi_def_cfa_offset 240
+; RV32I-NEXT: sw ra, 236(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s0, 232(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s1, 228(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s2, 224(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s3, 220(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s4, 216(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s5, 212(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s6, 208(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s7, 204(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s8, 200(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s9, 196(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s10, 192(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s11, 188(sp) # 4-byte Folded Spill
+; RV32I-NEXT: .cfi_offset ra, -4
+; RV32I-NEXT: .cfi_offset s0, -8
+; RV32I-NEXT: .cfi_offset s1, -12
+; RV32I-NEXT: .cfi_offset s2, -16
+; RV32I-NEXT: .cfi_offset s3, -20
+; RV32I-NEXT: .cfi_offset s4, -24
+; RV32I-NEXT: .cfi_offset s5, -28
+; RV32I-NEXT: .cfi_offset s6, -32
+; RV32I-NEXT: .cfi_offset s7, -36
+; RV32I-NEXT: .cfi_offset s8, -40
+; RV32I-NEXT: .cfi_offset s9, -44
+; RV32I-NEXT: .cfi_offset s10, -48
+; RV32I-NEXT: .cfi_offset s11, -52
+; RV32I-NEXT: mv a4, a2
+; RV32I-NEXT: sw a1, 24(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw a0, 20(sp) # 4-byte Folded Spill
+; RV32I-NEXT: lw s11, 0(a3)
+; RV32I-NEXT: lw s10, 4(a3)
+; RV32I-NEXT: lw s9, 8(a3)
+; RV32I-NEXT: lw ra, 12(a3)
+; RV32I-NEXT: lui a5, 349525
+; RV32I-NEXT: addi a5, a5, 1365
+; RV32I-NEXT: lui a1, 209715
+; RV32I-NEXT: addi a1, a1, 819
+; RV32I-NEXT: lui a0, 61681
+; RV32I-NEXT: addi a0, a0, -241
+; RV32I-NEXT: bnez s10, .LBB1_2
+; RV32I-NEXT: # %bb.1: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: srli a6, s11, 1
+; RV32I-NEXT: or a6, s11, a6
+; RV32I-NEXT: srli a7, a6, 2
+; RV32I-NEXT: or a6, a6, a7
+; RV32I-NEXT: srli a7, a6, 4
+; RV32I-NEXT: or a6, a6, a7
+; RV32I-NEXT: srli a7, a6, 8
+; RV32I-NEXT: or a6, a6, a7
+; RV32I-NEXT: srli a7, a6, 16
+; RV32I-NEXT: or a6, a6, a7
+; RV32I-NEXT: not a6, a6
+; RV32I-NEXT: srli a7, a6, 1
+; RV32I-NEXT: and a7, a7, a5
+; RV32I-NEXT: sub a6, a6, a7
+; RV32I-NEXT: and a7, a6, a1
+; RV32I-NEXT: srli a6, a6, 2
+; RV32I-NEXT: and a6, a6, a1
+; RV32I-NEXT: add a6, a7, a6
+; RV32I-NEXT: srli a7, a6, 4
+; RV32I-NEXT: add a6, a6, a7
+; RV32I-NEXT: and a6, a6, a0
+; RV32I-NEXT: slli a7, a6, 8
+; RV32I-NEXT: add a6, a6, a7
+; RV32I-NEXT: slli a7, a6, 16
+; RV32I-NEXT: add a6, a6, a7
+; RV32I-NEXT: srli a6, a6, 24
+; RV32I-NEXT: addi a7, a6, 32
+; RV32I-NEXT: j .LBB1_3
+; RV32I-NEXT: .LBB1_2:
+; RV32I-NEXT: srli a6, s10, 1
+; RV32I-NEXT: or a6, s10, a6
+; RV32I-NEXT: srli a7, a6, 2
+; RV32I-NEXT: or a6, a6, a7
+; RV32I-NEXT: srli a7, a6, 4
+; RV32I-NEXT: or a6, a6, a7
+; RV32I-NEXT: srli a7, a6, 8
+; RV32I-NEXT: or a6, a6, a7
+; RV32I-NEXT: srli a7, a6, 16
+; RV32I-NEXT: or a6, a6, a7
+; RV32I-NEXT: not a6, a6
+; RV32I-NEXT: srli a7, a6, 1
+; RV32I-NEXT: and a7, a7, a5
+; RV32I-NEXT: sub a6, a6, a7
+; RV32I-NEXT: and a7, a6, a1
+; RV32I-NEXT: srli a6, a6, 2
+; RV32I-NEXT: and a6, a6, a1
+; RV32I-NEXT: add a6, a7, a6
+; RV32I-NEXT: srli a7, a6, 4
+; RV32I-NEXT: add a6, a6, a7
+; RV32I-NEXT: and a6, a6, a0
+; RV32I-NEXT: slli a7, a6, 8
+; RV32I-NEXT: add a6, a6, a7
+; RV32I-NEXT: slli a7, a6, 16
+; RV32I-NEXT: add a6, a6, a7
+; RV32I-NEXT: srli a7, a6, 24
+; RV32I-NEXT: .LBB1_3: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: lw s3, 4(a4)
+; RV32I-NEXT: or t1, s9, ra
+; RV32I-NEXT: bnez ra, .LBB1_5
+; RV32I-NEXT: # %bb.4: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: srli a6, s9, 1
+; RV32I-NEXT: or a6, s9, a6
+; RV32I-NEXT: srli t0, a6, 2
+; RV32I-NEXT: or a6, a6, t0
+; RV32I-NEXT: srli t0, a6, 4
+; RV32I-NEXT: or a6, a6, t0
+; RV32I-NEXT: srli t0, a6, 8
+; RV32I-NEXT: or a6, a6, t0
+; RV32I-NEXT: srli t0, a6, 16
+; RV32I-NEXT: or a6, a6, t0
+; RV32I-NEXT: not a6, a6
+; RV32I-NEXT: srli t0, a6, 1
+; RV32I-NEXT: and t0, t0, a5
+; RV32I-NEXT: sub a6, a6, t0
+; RV32I-NEXT: and t0, a6, a1
+; RV32I-NEXT: srli a6, a6, 2
+; RV32I-NEXT: and a6, a6, a1
+; RV32I-NEXT: add a6, t0, a6
+; RV32I-NEXT: srli t0, a6, 4
+; RV32I-NEXT: add a6, a6, t0
+; RV32I-NEXT: and a6, a6, a0
+; RV32I-NEXT: slli t0, a6, 8
+; RV32I-NEXT: add a6, a6, t0
+; RV32I-NEXT: slli t0, a6, 16
+; RV32I-NEXT: add a6, a6, t0
+; RV32I-NEXT: srli a6, a6, 24
+; RV32I-NEXT: addi a6, a6, 32
+; RV32I-NEXT: j .LBB1_6
+; RV32I-NEXT: .LBB1_5:
+; RV32I-NEXT: srli a6, ra, 1
+; RV32I-NEXT: or a6, ra, a6
+; RV32I-NEXT: srli t0, a6, 2
+; RV32I-NEXT: or a6, a6, t0
+; RV32I-NEXT: srli t0, a6, 4
+; RV32I-NEXT: or a6, a6, t0
+; RV32I-NEXT: srli t0, a6, 8
+; RV32I-NEXT: or a6, a6, t0
+; RV32I-NEXT: srli t0, a6, 16
+; RV32I-NEXT: or a6, a6, t0
+; RV32I-NEXT: not a6, a6
+; RV32I-NEXT: srli t0, a6, 1
+; RV32I-NEXT: and t0, t0, a5
+; RV32I-NEXT: sub a6, a6, t0
+; RV32I-NEXT: and t0, a6, a1
+; RV32I-NEXT: srli a6, a6, 2
+; RV32I-NEXT: and a6, a6, a1
+; RV32I-NEXT: add a6, t0, a6
+; RV32I-NEXT: srli t0, a6, 4
+; RV32I-NEXT: add a6, a6, t0
+; RV32I-NEXT: and a6, a6, a0
+; RV32I-NEXT: slli t0, a6, 8
+; RV32I-NEXT: add a6, a6, t0
+; RV32I-NEXT: slli t0, a6, 16
+; RV32I-NEXT: add a6, a6, t0
+; RV32I-NEXT: srli a6, a6, 24
+; RV32I-NEXT: .LBB1_6: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: lw s5, 12(a4)
+; RV32I-NEXT: addi t0, a7, 64
+; RV32I-NEXT: bnez t1, .LBB1_8
+; RV32I-NEXT: # %bb.7: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: mv a6, t0
+; RV32I-NEXT: .LBB1_8: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: lw s2, 0(a4)
+; RV32I-NEXT: lw s6, 8(a4)
+; RV32I-NEXT: snez a4, t1
+; RV32I-NEXT: bnez s3, .LBB1_10
+; RV32I-NEXT: # %bb.9: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: srli t1, s2, 1
+; RV32I-NEXT: or t1, s2, t1
+; RV32I-NEXT: srli t2, t1, 2
+; RV32I-NEXT: or t1, t1, t2
+; RV32I-NEXT: srli t2, t1, 4
+; RV32I-NEXT: or t1, t1, t2
+; RV32I-NEXT: srli t2, t1, 8
+; RV32I-NEXT: or t1, t1, t2
+; RV32I-NEXT: srli t2, t1, 16
+; RV32I-NEXT: or t1, t1, t2
+; RV32I-NEXT: not t1, t1
+; RV32I-NEXT: srli t2, t1, 1
+; RV32I-NEXT: and t2, t2, a5
+; RV32I-NEXT: sub t1, t1, t2
+; RV32I-NEXT: and t2, t1, a1
+; RV32I-NEXT: srli t1, t1, 2
+; RV32I-NEXT: and t1, t1, a1
+; RV32I-NEXT: add t1, t2, t1
+; RV32I-NEXT: srli t2, t1, 4
+; RV32I-NEXT: add t1, t1, t2
+; RV32I-NEXT: and t1, t1, a0
+; RV32I-NEXT: slli t2, t1, 8
+; RV32I-NEXT: add t1, t1, t2
+; RV32I-NEXT: slli t2, t1, 16
+; RV32I-NEXT: add t1, t1, t2
+; RV32I-NEXT: srli t1, t1, 24
+; RV32I-NEXT: addi t6, t1, 32
+; RV32I-NEXT: j .LBB1_11
+; RV32I-NEXT: .LBB1_10:
+; RV32I-NEXT: srli t1, s3, 1
+; RV32I-NEXT: or t1, s3, t1
+; RV32I-NEXT: srli t2, t1, 2
+; RV32I-NEXT: or t1, t1, t2
+; RV32I-NEXT: srli t2, t1, 4
+; RV32I-NEXT: or t1, t1, t2
+; RV32I-NEXT: srli t2, t1, 8
+; RV32I-NEXT: or t1, t1, t2
+; RV32I-NEXT: srli t2, t1, 16
+; RV32I-NEXT: or t1, t1, t2
+; RV32I-NEXT: not t1, t1
+; RV32I-NEXT: srli t2, t1, 1
+; RV32I-NEXT: and t2, t2, a5
+; RV32I-NEXT: sub t1, t1, t2
+; RV32I-NEXT: and t2, t1, a1
+; RV32I-NEXT: srli t1, t1, 2
+; RV32I-NEXT: and t1, t1, a1
+; RV32I-NEXT: add t1, t2, t1
+; RV32I-NEXT: srli t2, t1, 4
+; RV32I-NEXT: add t1, t1, t2
+; RV32I-NEXT: and t1, t1, a0
+; RV32I-NEXT: slli t2, t1, 8
+; RV32I-NEXT: add t1, t1, t2
+; RV32I-NEXT: slli t2, t1, 16
+; RV32I-NEXT: add t1, t1, t2
+; RV32I-NEXT: srli t6, t1, 24
+; RV32I-NEXT: .LBB1_11: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: or t1, s10, ra
+; RV32I-NEXT: or t2, s11, s9
+; RV32I-NEXT: or t3, s3, s5
+; RV32I-NEXT: or t4, s2, s6
+; RV32I-NEXT: sltu a7, t0, a7
+; RV32I-NEXT: addi t0, a4, -1
+; RV32I-NEXT: addi a4, t6, 64
+; RV32I-NEXT: or t5, s6, s5
+; RV32I-NEXT: sltu t6, a4, t6
+; RV32I-NEXT: snez s4, t5
+; RV32I-NEXT: addi s4, s4, -1
+; RV32I-NEXT: bnez s5, .LBB1_13
+; RV32I-NEXT: # %bb.12: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: srli s0, s6, 1
+; RV32I-NEXT: or s0, s6, s0
+; RV32I-NEXT: srli s1, s0, 2
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: srli s1, s0, 4
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: srli s1, s0, 8
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: srli s1, s0, 16
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: not s0, s0
+; RV32I-NEXT: srli s1, s0, 1
+; RV32I-NEXT: and a5, s1, a5
+; RV32I-NEXT: sub s0, s0, a5
+; RV32I-NEXT: and a5, s0, a1
+; RV32I-NEXT: srli s0, s0, 2
+; RV32I-NEXT: and a1, s0, a1
+; RV32I-NEXT: add a1, a5, a1
+; RV32I-NEXT: srli a5, a1, 4
+; RV32I-NEXT: add a1, a1, a5
+; RV32I-NEXT: and a0, a1, a0
+; RV32I-NEXT: slli a1, a0, 8
+; RV32I-NEXT: add a0, a0, a1
+; RV32I-NEXT: slli a1, a0, 16
+; RV32I-NEXT: add a0, a0, a1
+; RV32I-NEXT: srli a0, a0, 24
+; RV32I-NEXT: addi a0, a0, 32
+; RV32I-NEXT: j .LBB1_14
+; RV32I-NEXT: .LBB1_13:
+; RV32I-NEXT: srli s0, s5, 1
+; RV32I-NEXT: or s0, s5, s0
+; RV32I-NEXT: srli s1, s0, 2
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: srli s1, s0, 4
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: srli s1, s0, 8
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: srli s1, s0, 16
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: not s0, s0
+; RV32I-NEXT: srli s1, s0, 1
+; RV32I-NEXT: and a5, s1, a5
+; RV32I-NEXT: sub s0, s0, a5
+; RV32I-NEXT: and a5, s0, a1
+; RV32I-NEXT: srli s0, s0, 2
+; RV32I-NEXT: and a1, s0, a1
+; RV32I-NEXT: add a1, a5, a1
+; RV32I-NEXT: srli a5, a1, 4
+; RV32I-NEXT: add a1, a1, a5
+; RV32I-NEXT: and a0, a1, a0
+; RV32I-NEXT: slli a1, a0, 8
+; RV32I-NEXT: add a0, a0, a1
+; RV32I-NEXT: slli a1, a0, 16
+; RV32I-NEXT: add a0, a0, a1
+; RV32I-NEXT: srli a0, a0, 24
+; RV32I-NEXT: .LBB1_14: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: or t1, t2, t1
+; RV32I-NEXT: or t2, t4, t3
+; RV32I-NEXT: and a1, t0, a7
+; RV32I-NEXT: and a5, s4, t6
+; RV32I-NEXT: bnez t5, .LBB1_16
+; RV32I-NEXT: # %bb.15: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: mv a0, a4
+; RV32I-NEXT: .LBB1_16: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: seqz a7, t1
+; RV32I-NEXT: seqz t0, t2
+; RV32I-NEXT: sltu a4, a6, a0
+; RV32I-NEXT: sub t2, a1, a5
+; RV32I-NEXT: mv t1, a4
+; RV32I-NEXT: beq a1, a5, .LBB1_18
+; RV32I-NEXT: # %bb.17: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: sltu t1, a1, a5
+; RV32I-NEXT: .LBB1_18: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: sub a4, t2, a4
+; RV32I-NEXT: or a1, a7, t0
+; RV32I-NEXT: neg a5, t1
+; RV32I-NEXT: seqz a7, t1
+; RV32I-NEXT: addi a7, a7, -1
+; RV32I-NEXT: or t0, a5, a7
+; RV32I-NEXT: sub a0, a6, a0
+; RV32I-NEXT: beqz t0, .LBB1_20
+; RV32I-NEXT: # %bb.19: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: snez a6, t0
+; RV32I-NEXT: j .LBB1_21
+; RV32I-NEXT: .LBB1_20:
+; RV32I-NEXT: snez a6, a4
+; RV32I-NEXT: sltiu t0, a0, 128
+; RV32I-NEXT: xori t0, t0, 1
+; RV32I-NEXT: or a6, t0, a6
+; RV32I-NEXT: .LBB1_21: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: li s8, 127
+; RV32I-NEXT: or a1, a1, a6
+; RV32I-NEXT: addi a6, a1, -1
+; RV32I-NEXT: and t1, a6, s5
+; RV32I-NEXT: and t2, a6, s6
+; RV32I-NEXT: and t0, a6, s3
+; RV32I-NEXT: and t3, a6, s2
+; RV32I-NEXT: sw s10, 52(sp) # 4-byte Folded Spill
+; RV32I-NEXT: mv a2, s11
+; RV32I-NEXT: sw s3, 28(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw ra, 48(sp) # 4-byte Folded Spill
+; RV32I-NEXT: mv a3, s9
+; RV32I-NEXT: sw s2, 40(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s5, 36(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw s6, 32(sp) # 4-byte Folded Spill
+; RV32I-NEXT: bnez a1, .LBB1_32
+; RV32I-NEXT: # %bb.22: # %_udiv-special-cases_udiv-special-cases
+; RV32I-NEXT: xori a1, a0, 127
+; RV32I-NEXT: or a1, a1, a5
+; RV32I-NEXT: or a6, a4, a7
+; RV32I-NEXT: or a1, a1, a6
+; RV32I-NEXT: beqz a1, .LBB1_32
+; RV32I-NEXT: # %bb.23: # %udiv-bb15
+; RV32I-NEXT: addi a1, a0, 1
+; RV32I-NEXT: sub a0, s8, a0
+; RV32I-NEXT: sw zero, 152(sp)
+; RV32I-NEXT: sw zero, 156(sp)
+; RV32I-NEXT: sw zero, 160(sp)
+; RV32I-NEXT: sw zero, 164(sp)
+; RV32I-NEXT: sw s2, 168(sp)
+; RV32I-NEXT: sw s3, 172(sp)
+; RV32I-NEXT: sw s6, 176(sp)
+; RV32I-NEXT: sw s5, 180(sp)
+; RV32I-NEXT: addi a6, sp, 168
+; RV32I-NEXT: seqz t0, a1
+; RV32I-NEXT: srli t1, a0, 3
+; RV32I-NEXT: andi t2, a0, 31
+; RV32I-NEXT: add a4, a4, t0
+; RV32I-NEXT: andi t0, t1, 12
+; RV32I-NEXT: xori t1, t2, 31
+; RV32I-NEXT: or t2, a1, a4
+; RV32I-NEXT: sub a6, a6, t0
+; RV32I-NEXT: seqz t0, t2
+; RV32I-NEXT: lw t4, 0(a6)
+; RV32I-NEXT: lw t2, 4(a6)
+; RV32I-NEXT: lw t5, 8(a6)
+; RV32I-NEXT: lw t3, 12(a6)
+; RV32I-NEXT: add t0, a5, t0
+; RV32I-NEXT: sltu a6, t0, a5
+; RV32I-NEXT: or a5, a1, t0
+; RV32I-NEXT: add a6, a7, a6
+; RV32I-NEXT: or a7, a4, a6
+; RV32I-NEXT: srli t6, t5, 1
+; RV32I-NEXT: srli s0, t2, 1
+; RV32I-NEXT: or a7, a5, a7
+; RV32I-NEXT: srli a5, t4, 1
+; RV32I-NEXT: srl t6, t6, t1
+; RV32I-NEXT: srl s0, s0, t1
+; RV32I-NEXT: srl a5, a5, t1
+; RV32I-NEXT: sll t1, t3, a0
+; RV32I-NEXT: or t3, t1, t6
+; RV32I-NEXT: sll t1, t5, a0
+; RV32I-NEXT: sll t2, t2, a0
+; RV32I-NEXT: or t1, t1, s0
+; RV32I-NEXT: or t2, t2, a5
+; RV32I-NEXT: sll a5, t4, a0
+; RV32I-NEXT: beqz a7, .LBB1_31
+; RV32I-NEXT: # %bb.24: # %udiv-preheader4
+; RV32I-NEXT: li a7, 0
+; RV32I-NEXT: li t4, 0
+; RV32I-NEXT: li t5, 0
+; RV32I-NEXT: li t6, 0
+; RV32I-NEXT: sw zero, 136(sp)
+; RV32I-NEXT: sw zero, 140(sp)
+; RV32I-NEXT: sw zero, 144(sp)
+; RV32I-NEXT: sw zero, 148(sp)
+; RV32I-NEXT: sw s2, 120(sp)
+; RV32I-NEXT: sw s3, 124(sp)
+; RV32I-NEXT: sw s6, 128(sp)
+; RV32I-NEXT: sw s5, 132(sp)
+; RV32I-NEXT: srli a0, a1, 3
+; RV32I-NEXT: addi s0, sp, 120
+; RV32I-NEXT: andi a0, a0, 12
+; RV32I-NEXT: add a0, s0, a0
+; RV32I-NEXT: lw s0, 4(a0)
+; RV32I-NEXT: lw s1, 8(a0)
+; RV32I-NEXT: lw s2, 12(a0)
+; RV32I-NEXT: lw a0, 0(a0)
+; RV32I-NEXT: andi s3, a1, 31
+; RV32I-NEXT: xori s3, s3, 31
+; RV32I-NEXT: slli s4, s2, 1
+; RV32I-NEXT: slli s5, s1, 1
+; RV32I-NEXT: slli s6, s0, 1
+; RV32I-NEXT: sll s4, s4, s3
+; RV32I-NEXT: sll s5, s5, s3
+; RV32I-NEXT: sll s3, s6, s3
+; RV32I-NEXT: seqz s6, s11
+; RV32I-NEXT: srl s1, s1, a1
+; RV32I-NEXT: or s8, s1, s4
+; RV32I-NEXT: or s1, s11, s10
+; RV32I-NEXT: sub s4, s10, s6
+; RV32I-NEXT: seqz s1, s1
+; RV32I-NEXT: srl s0, s0, a1
+; RV32I-NEXT: or s9, s0, s5
+; RV32I-NEXT: sub s5, a3, s1
+; RV32I-NEXT: sltu s0, a3, s1
+; RV32I-NEXT: sub s6, ra, s0
+; RV32I-NEXT: srl s0, a0, a1
+; RV32I-NEXT: srl a0, s2, a1
+; RV32I-NEXT: mv s1, s11
+; RV32I-NEXT: or s11, s0, s3
+; RV32I-NEXT: addi s1, s1, -1
+; RV32I-NEXT: sw s1, 44(sp) # 4-byte Folded Spill
+; RV32I-NEXT: j .LBB1_26
+; RV32I-NEXT: .LBB1_25: # %udiv-do-while3
+; RV32I-NEXT: # in Loop: Header=BB1_26 Depth=1
+; RV32I-NEXT: srli s2, t1, 31
+; RV32I-NEXT: slli t3, t3, 1
+; RV32I-NEXT: sub s7, s10, s7
+; RV32I-NEXT: srli s10, t2, 31
+; RV32I-NEXT: slli t1, t1, 1
+; RV32I-NEXT: or t3, t3, s2
+; RV32I-NEXT: srli s2, a5, 31
+; RV32I-NEXT: slli t2, t2, 1
+; RV32I-NEXT: slli a5, a5, 1
+; RV32I-NEXT: or t1, t1, s10
+; RV32I-NEXT: lw s3, 48(sp) # 4-byte Folded Reload
+; RV32I-NEXT: and s10, s9, s3
+; RV32I-NEXT: or t2, t2, s2
+; RV32I-NEXT: and s2, s9, a3
+; RV32I-NEXT: or a5, a7, a5
+; RV32I-NEXT: sub s3, s0, s2
+; RV32I-NEXT: sltu s0, s0, s2
+; RV32I-NEXT: or s2, a1, a4
+; RV32I-NEXT: sub s10, s8, s10
+; RV32I-NEXT: seqz s8, a1
+; RV32I-NEXT: addi a1, a1, -1
+; RV32I-NEXT: andi a7, s9, 1
+; RV32I-NEXT: sub s9, s7, s1
+; RV32I-NEXT: seqz s1, s2
+; RV32I-NEXT: sub a4, a4, s8
+; RV32I-NEXT: or t2, t4, t2
+; RV32I-NEXT: or t1, t5, t1
+; RV32I-NEXT: or t3, t6, t3
+; RV32I-NEXT: sub s8, s3, a0
+; RV32I-NEXT: sltu a0, s3, a0
+; RV32I-NEXT: sub t4, s10, s0
+; RV32I-NEXT: sltu t5, t0, s1
+; RV32I-NEXT: sub t0, t0, s1
+; RV32I-NEXT: sub a0, t4, a0
+; RV32I-NEXT: sub a6, a6, t5
+; RV32I-NEXT: or t4, a4, a6
+; RV32I-NEXT: or t5, a1, t0
+; RV32I-NEXT: or s0, t5, t4
+; RV32I-NEXT: sub s11, ra, s11
+; RV32I-NEXT: li t4, 0
+; RV32I-NEXT: li t5, 0
+; RV32I-NEXT: li t6, 0
+; RV32I-NEXT: beqz s0, .LBB1_31
+; RV32I-NEXT: .LBB1_26: # %udiv-do-while3
+; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
+; RV32I-NEXT: srli s0, s11, 31
+; RV32I-NEXT: slli s1, s9, 1
+; RV32I-NEXT: slli s11, s11, 1
+; RV32I-NEXT: or s10, s1, s0
+; RV32I-NEXT: srli s0, t3, 31
+; RV32I-NEXT: or ra, s11, s0
+; RV32I-NEXT: beq s4, s10, .LBB1_28
+; RV32I-NEXT: # %bb.27: # %udiv-do-while3
+; RV32I-NEXT: # in Loop: Header=BB1_26 Depth=1
+; RV32I-NEXT: sltu s1, s4, s10
+; RV32I-NEXT: j .LBB1_29
+; RV32I-NEXT: .LBB1_28: # in Loop: Header=BB1_26 Depth=1
+; RV32I-NEXT: lw s0, 44(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sltu s1, s0, ra
+; RV32I-NEXT: .LBB1_29: # %udiv-do-while3
+; RV32I-NEXT: # in Loop: Header=BB1_26 Depth=1
+; RV32I-NEXT: srli s0, s8, 31
+; RV32I-NEXT: slli a0, a0, 1
+; RV32I-NEXT: srli s7, s9, 31
+; RV32I-NEXT: slli s9, s8, 1
+; RV32I-NEXT: or s8, a0, s0
+; RV32I-NEXT: or s0, s9, s7
+; RV32I-NEXT: sub a0, s5, s0
+; RV32I-NEXT: sltu s7, s5, s0
+; RV32I-NEXT: sub s9, s6, s8
+; RV32I-NEXT: sltu a0, a0, s1
+; RV32I-NEXT: sub s1, s9, s7
+; RV32I-NEXT: sub s1, s1, a0
+; RV32I-NEXT: srai s9, s1, 31
+; RV32I-NEXT: and s11, s9, a2
+; RV32I-NEXT: lw a0, 52(sp) # 4-byte Folded Reload
+; RV32I-NEXT: and s7, s9, a0
+; RV32I-NEXT: sltu s1, ra, s11
+; RV32I-NEXT: mv a0, s1
+; RV32I-NEXT: beq s10, s7, .LBB1_25
+; RV32I-NEXT: # %bb.30: # %udiv-do-while3
+; RV32I-NEXT: # in Loop: Header=BB1_26 Depth=1
+; RV32I-NEXT: sltu a0, s10, s7
+; RV32I-NEXT: j .LBB1_25
+; RV32I-NEXT: .LBB1_31: # %udiv-loop-exit2
+; RV32I-NEXT: srli a0, a5, 31
+; RV32I-NEXT: slli a1, t2, 1
+; RV32I-NEXT: srli a4, t2, 31
+; RV32I-NEXT: or t0, a1, a0
+; RV32I-NEXT: slli a0, t1, 1
+; RV32I-NEXT: srli a1, t1, 31
+; RV32I-NEXT: slli t3, t3, 1
+; RV32I-NEXT: slli a5, a5, 1
+; RV32I-NEXT: or t2, a0, a4
+; RV32I-NEXT: or t1, t3, a1
+; RV32I-NEXT: or t3, a7, a5
+; RV32I-NEXT: lw s10, 52(sp) # 4-byte Folded Reload
+; RV32I-NEXT: mv s11, a2
+; RV32I-NEXT: lw s3, 28(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw ra, 48(sp) # 4-byte Folded Reload
+; RV32I-NEXT: mv s9, a3
+; RV32I-NEXT: lw s2, 40(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s5, 36(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s6, 32(sp) # 4-byte Folded Reload
+; RV32I-NEXT: li s8, 127
+; RV32I-NEXT: .LBB1_32: # %udiv-end1
+; RV32I-NEXT: lui a0, 349525
+; RV32I-NEXT: lui a1, 209715
+; RV32I-NEXT: lui a6, 61681
+; RV32I-NEXT: addi a5, a0, 1365
+; RV32I-NEXT: addi a4, a1, 819
+; RV32I-NEXT: addi a1, a6, -241
+; RV32I-NEXT: sw t0, 16(sp) # 4-byte Folded Spill
+; RV32I-NEXT: bnez s10, .LBB1_35
+; RV32I-NEXT: # %bb.33: # %udiv-end1
+; RV32I-NEXT: srli a0, s11, 1
+; RV32I-NEXT: or a0, s11, a0
+; RV32I-NEXT: srli a6, a0, 2
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 4
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 8
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 16
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: not a0, a0
+; RV32I-NEXT: srli a6, a0, 1
+; RV32I-NEXT: and a6, a6, a5
+; RV32I-NEXT: sub a0, a0, a6
+; RV32I-NEXT: and a6, a0, a4
+; RV32I-NEXT: srli a0, a0, 2
+; RV32I-NEXT: and a0, a0, a4
+; RV32I-NEXT: add a0, a6, a0
+; RV32I-NEXT: srli a6, a0, 4
+; RV32I-NEXT: add a0, a0, a6
+; RV32I-NEXT: and a0, a0, a1
+; RV32I-NEXT: slli a6, a0, 8
+; RV32I-NEXT: add a0, a0, a6
+; RV32I-NEXT: slli a6, a0, 16
+; RV32I-NEXT: add a0, a0, a6
+; RV32I-NEXT: srli a0, a0, 24
+; RV32I-NEXT: addi a7, a0, 32
+; RV32I-NEXT: or t0, s9, ra
+; RV32I-NEXT: beqz ra, .LBB1_36
+; RV32I-NEXT: .LBB1_34:
+; RV32I-NEXT: srli a0, ra, 1
+; RV32I-NEXT: or a0, ra, a0
+; RV32I-NEXT: srli a6, a0, 2
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 4
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 8
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 16
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: not a0, a0
+; RV32I-NEXT: srli a6, a0, 1
+; RV32I-NEXT: and a6, a6, a5
+; RV32I-NEXT: sub a0, a0, a6
+; RV32I-NEXT: and a6, a0, a4
+; RV32I-NEXT: srli a0, a0, 2
+; RV32I-NEXT: and a0, a0, a4
+; RV32I-NEXT: add a0, a6, a0
+; RV32I-NEXT: srli a6, a0, 4
+; RV32I-NEXT: add a0, a0, a6
+; RV32I-NEXT: and a0, a0, a1
+; RV32I-NEXT: slli a6, a0, 8
+; RV32I-NEXT: add a0, a0, a6
+; RV32I-NEXT: slli a6, a0, 16
+; RV32I-NEXT: add a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 24
+; RV32I-NEXT: addi a0, a7, 64
+; RV32I-NEXT: beqz t0, .LBB1_37
+; RV32I-NEXT: j .LBB1_38
+; RV32I-NEXT: .LBB1_35:
+; RV32I-NEXT: srli a0, s10, 1
+; RV32I-NEXT: or a0, s10, a0
+; RV32I-NEXT: srli a6, a0, 2
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 4
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 8
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 16
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: not a0, a0
+; RV32I-NEXT: srli a6, a0, 1
+; RV32I-NEXT: and a6, a6, a5
+; RV32I-NEXT: sub a0, a0, a6
+; RV32I-NEXT: and a6, a0, a4
+; RV32I-NEXT: srli a0, a0, 2
+; RV32I-NEXT: and a0, a0, a4
+; RV32I-NEXT: add a0, a6, a0
+; RV32I-NEXT: srli a6, a0, 4
+; RV32I-NEXT: add a0, a0, a6
+; RV32I-NEXT: and a0, a0, a1
+; RV32I-NEXT: slli a6, a0, 8
+; RV32I-NEXT: add a0, a0, a6
+; RV32I-NEXT: slli a6, a0, 16
+; RV32I-NEXT: add a0, a0, a6
+; RV32I-NEXT: srli a7, a0, 24
+; RV32I-NEXT: or t0, s9, ra
+; RV32I-NEXT: bnez ra, .LBB1_34
+; RV32I-NEXT: .LBB1_36: # %udiv-end1
+; RV32I-NEXT: srli a0, s9, 1
+; RV32I-NEXT: or a0, s9, a0
+; RV32I-NEXT: srli a6, a0, 2
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 4
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 8
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: srli a6, a0, 16
+; RV32I-NEXT: or a0, a0, a6
+; RV32I-NEXT: not a0, a0
+; RV32I-NEXT: srli a6, a0, 1
+; RV32I-NEXT: and a6, a6, a5
+; RV32I-NEXT: sub a0, a0, a6
+; RV32I-NEXT: and a6, a0, a4
+; RV32I-NEXT: srli a0, a0, 2
+; RV32I-NEXT: and a0, a0, a4
+; RV32I-NEXT: add a0, a6, a0
+; RV32I-NEXT: srli a6, a0, 4
+; RV32I-NEXT: add a0, a0, a6
+; RV32I-NEXT: and a0, a0, a1
+; RV32I-NEXT: slli a6, a0, 8
+; RV32I-NEXT: add a0, a0, a6
+; RV32I-NEXT: slli a6, a0, 16
+; RV32I-NEXT: add a0, a0, a6
+; RV32I-NEXT: srli a0, a0, 24
+; RV32I-NEXT: addi a6, a0, 32
+; RV32I-NEXT: addi a0, a7, 64
+; RV32I-NEXT: bnez t0, .LBB1_38
+; RV32I-NEXT: .LBB1_37: # %udiv-end1
+; RV32I-NEXT: mv a6, a0
+; RV32I-NEXT: .LBB1_38: # %udiv-end1
+; RV32I-NEXT: sw t1, 12(sp) # 4-byte Folded Spill
+; RV32I-NEXT: snez t4, t0
+; RV32I-NEXT: sw t2, 8(sp) # 4-byte Folded Spill
+; RV32I-NEXT: sw t3, 4(sp) # 4-byte Folded Spill
+; RV32I-NEXT: bnez s3, .LBB1_40
+; RV32I-NEXT: # %bb.39: # %udiv-end1
+; RV32I-NEXT: srli t0, s2, 1
+; RV32I-NEXT: or t0, s2, t0
+; RV32I-NEXT: srli t1, t0, 2
+; RV32I-NEXT: or t0, t0, t1
+; RV32I-NEXT: srli t1, t0, 4
+; RV32I-NEXT: or t0, t0, t1
+; RV32I-NEXT: srli t1, t0, 8
+; RV32I-NEXT: or t0, t0, t1
+; RV32I-NEXT: srli t1, t0, 16
+; RV32I-NEXT: or t0, t0, t1
+; RV32I-NEXT: not t0, t0
+; RV32I-NEXT: srli t1, t0, 1
+; RV32I-NEXT: and t1, t1, a5
+; RV32I-NEXT: sub t0, t0, t1
+; RV32I-NEXT: and t1, t0, a4
+; RV32I-NEXT: srli t0, t0, 2
+; RV32I-NEXT: and t0, t0, a4
+; RV32I-NEXT: add t0, t1, t0
+; RV32I-NEXT: srli t1, t0, 4
+; RV32I-NEXT: add t0, t0, t1
+; RV32I-NEXT: and t0, t0, a1
+; RV32I-NEXT: slli t1, t0, 8
+; RV32I-NEXT: add t0, t0, t1
+; RV32I-NEXT: slli t1, t0, 16
+; RV32I-NEXT: add t0, t0, t1
+; RV32I-NEXT: srli t0, t0, 24
+; RV32I-NEXT: addi t6, t0, 32
+; RV32I-NEXT: j .LBB1_41
+; RV32I-NEXT: .LBB1_40:
+; RV32I-NEXT: srli t0, s3, 1
+; RV32I-NEXT: or t0, s3, t0
+; RV32I-NEXT: srli t1, t0, 2
+; RV32I-NEXT: or t0, t0, t1
+; RV32I-NEXT: srli t1, t0, 4
+; RV32I-NEXT: or t0, t0, t1
+; RV32I-NEXT: srli t1, t0, 8
+; RV32I-NEXT: or t0, t0, t1
+; RV32I-NEXT: srli t1, t0, 16
+; RV32I-NEXT: or t0, t0, t1
+; RV32I-NEXT: not t0, t0
+; RV32I-NEXT: srli t1, t0, 1
+; RV32I-NEXT: and t1, t1, a5
+; RV32I-NEXT: sub t0, t0, t1
+; RV32I-NEXT: and t1, t0, a4
+; RV32I-NEXT: srli t0, t0, 2
+; RV32I-NEXT: and t0, t0, a4
+; RV32I-NEXT: add t0, t1, t0
+; RV32I-NEXT: srli t1, t0, 4
+; RV32I-NEXT: add t0, t0, t1
+; RV32I-NEXT: and t0, t0, a1
+; RV32I-NEXT: slli t1, t0, 8
+; RV32I-NEXT: add t0, t0, t1
+; RV32I-NEXT: slli t1, t0, 16
+; RV32I-NEXT: add t0, t0, t1
+; RV32I-NEXT: srli t6, t0, 24
+; RV32I-NEXT: .LBB1_41: # %udiv-end1
+; RV32I-NEXT: or t0, s11, s9
+; RV32I-NEXT: or t1, s10, ra
+; RV32I-NEXT: or t2, s2, s6
+; RV32I-NEXT: or t3, s3, s5
+; RV32I-NEXT: sltu a7, a0, a7
+; RV32I-NEXT: addi t4, t4, -1
+; RV32I-NEXT: addi a0, t6, 64
+; RV32I-NEXT: or t5, s6, s5
+; RV32I-NEXT: sltu t6, a0, t6
+; RV32I-NEXT: snez s4, t5
+; RV32I-NEXT: addi s4, s4, -1
+; RV32I-NEXT: bnez s5, .LBB1_43
+; RV32I-NEXT: # %bb.42: # %udiv-end1
+; RV32I-NEXT: srli s0, s6, 1
+; RV32I-NEXT: or s0, s6, s0
+; RV32I-NEXT: srli s1, s0, 2
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: srli s1, s0, 4
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: srli s1, s0, 8
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: srli s1, s0, 16
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: not s0, s0
+; RV32I-NEXT: srli s1, s0, 1
+; RV32I-NEXT: and a5, s1, a5
+; RV32I-NEXT: sub s0, s0, a5
+; RV32I-NEXT: and a5, s0, a4
+; RV32I-NEXT: srli s0, s0, 2
+; RV32I-NEXT: and a4, s0, a4
+; RV32I-NEXT: add a4, a5, a4
+; RV32I-NEXT: srli a5, a4, 4
+; RV32I-NEXT: add a4, a4, a5
+; RV32I-NEXT: and a1, a4, a1
+; RV32I-NEXT: slli a4, a1, 8
+; RV32I-NEXT: add a1, a1, a4
+; RV32I-NEXT: slli a4, a1, 16
+; RV32I-NEXT: add a1, a1, a4
+; RV32I-NEXT: srli a1, a1, 24
+; RV32I-NEXT: addi a1, a1, 32
+; RV32I-NEXT: j .LBB1_44
+; RV32I-NEXT: .LBB1_43:
+; RV32I-NEXT: srli s0, s5, 1
+; RV32I-NEXT: or s0, s5, s0
+; RV32I-NEXT: srli s1, s0, 2
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: srli s1, s0, 4
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: srli s1, s0, 8
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: srli s1, s0, 16
+; RV32I-NEXT: or s0, s0, s1
+; RV32I-NEXT: not s0, s0
+; RV32I-NEXT: srli s1, s0, 1
+; RV32I-NEXT: and a5, s1, a5
+; RV32I-NEXT: sub s0, s0, a5
+; RV32I-NEXT: and a5, s0, a4
+; RV32I-NEXT: srli s0, s0, 2
+; RV32I-NEXT: and a4, s0, a4
+; RV32I-NEXT: add a4, a5, a4
+; RV32I-NEXT: srli a5, a4, 4
+; RV32I-NEXT: add a4, a4, a5
+; RV32I-NEXT: and a1, a4, a1
+; RV32I-NEXT: slli a4, a1, 8
+; RV32I-NEXT: add a1, a1, a4
+; RV32I-NEXT: slli a4, a1, 16
+; RV32I-NEXT: add a1, a1, a4
+; RV32I-NEXT: srli a1, a1, 24
+; RV32I-NEXT: .LBB1_44: # %udiv-end1
+; RV32I-NEXT: or t0, t0, t1
+; RV32I-NEXT: or t1, t2, t3
+; RV32I-NEXT: and a4, t4, a7
+; RV32I-NEXT: and a5, s4, t6
+; RV32I-NEXT: bnez t5, .LBB1_46
+; RV32I-NEXT: # %bb.45: # %udiv-end1
+; RV32I-NEXT: mv a1, a0
+; RV32I-NEXT: .LBB1_46: # %udiv-end1
+; RV32I-NEXT: seqz a0, t0
+; RV32I-NEXT: seqz t0, t1
+; RV32I-NEXT: sltu a7, a6, a1
+; RV32I-NEXT: sub t2, a4, a5
+; RV32I-NEXT: mv t1, a7
+; RV32I-NEXT: beq a4, a5, .LBB1_48
+; RV32I-NEXT: # %bb.47: # %udiv-end1
+; RV32I-NEXT: sltu t1, a4, a5
+; RV32I-NEXT: .LBB1_48: # %udiv-end1
+; RV32I-NEXT: sub a7, t2, a7
+; RV32I-NEXT: or t0, a0, t0
+; RV32I-NEXT: neg a4, t1
+; RV32I-NEXT: seqz a5, t1
+; RV32I-NEXT: addi a5, a5, -1
+; RV32I-NEXT: or t1, a4, a5
+; RV32I-NEXT: sub a0, a6, a1
+; RV32I-NEXT: beqz t1, .LBB1_50
+; RV32I-NEXT: # %bb.49: # %udiv-end1
+; RV32I-NEXT: snez a1, t1
+; RV32I-NEXT: j .LBB1_51
+; RV32I-NEXT: .LBB1_50:
+; RV32I-NEXT: snez a1, a7
+; RV32I-NEXT: sltiu a6, a0, 128
+; RV32I-NEXT: xori a6, a6, 1
+; RV32I-NEXT: or a1, a6, a1
+; RV32I-NEXT: .LBB1_51: # %udiv-end1
+; RV32I-NEXT: or a1, t0, a1
+; RV32I-NEXT: addi a6, a1, -1
+; RV32I-NEXT: and s5, a6, s5
+; RV32I-NEXT: and s7, a6, s6
+; RV32I-NEXT: and s4, a6, s3
+; RV32I-NEXT: and s6, a6, s2
+; RV32I-NEXT: bnez a1, .LBB1_62
+; RV32I-NEXT: # %bb.52: # %udiv-end1
+; RV32I-NEXT: xori a1, a0, 127
+; RV32I-NEXT: or a1, a1, a4
+; RV32I-NEXT: or a6, a7, a5
+; RV32I-NEXT: or a1, a1, a6
+; RV32I-NEXT: beqz a1, .LBB1_62
+; RV32I-NEXT: # %bb.53: # %udiv-bb1
+; RV32I-NEXT: addi a1, a0, 1
+; RV32I-NEXT: sub a6, s8, a0
+; RV32I-NEXT: sw zero, 88(sp)
+; RV32I-NEXT: sw zero, 92(sp)
+; RV32I-NEXT: sw zero, 96(sp)
+; RV32I-NEXT: sw zero, 100(sp)
+; RV32I-NEXT: lw s2, 40(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw s2, 104(sp)
+; RV32I-NEXT: sw s3, 108(sp)
+; RV32I-NEXT: lw s5, 32(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw s5, 112(sp)
+; RV32I-NEXT: lw s4, 36(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw s4, 116(sp)
+; RV32I-NEXT: addi t0, sp, 104
+; RV32I-NEXT: seqz a0, a1
+; RV32I-NEXT: srli t1, a6, 3
+; RV32I-NEXT: andi t2, a6, 31
+; RV32I-NEXT: add a0, a7, a0
+; RV32I-NEXT: andi a7, t1, 12
+; RV32I-NEXT: xori t1, t2, 31
+; RV32I-NEXT: or t2, a1, a0
+; RV32I-NEXT: sub a7, t0, a7
+; RV32I-NEXT: seqz t0, t2
+; RV32I-NEXT: lw t3, 0(a7)
+; RV32I-NEXT: lw t4, 4(a7)
+; RV32I-NEXT: lw t5, 8(a7)
+; RV32I-NEXT: lw t2, 12(a7)
+; RV32I-NEXT: add a7, a4, t0
+; RV32I-NEXT: sltu a4, a7, a4
+; RV32I-NEXT: or t0, a1, a7
+; RV32I-NEXT: add a5, a5, a4
+; RV32I-NEXT: or a4, a0, a5
+; RV32I-NEXT: srli t6, t5, 1
+; RV32I-NEXT: srli s0, t4, 1
+; RV32I-NEXT: or s1, t0, a4
+; RV32I-NEXT: srli a4, t3, 1
+; RV32I-NEXT: srl t0, t6, t1
+; RV32I-NEXT: srl t6, s0, t1
+; RV32I-NEXT: srl a4, a4, t1
+; RV32I-NEXT: sll t1, t2, a6
+; RV32I-NEXT: or t2, t1, t0
+; RV32I-NEXT: sll t0, t5, a6
+; RV32I-NEXT: sll t1, t4, a6
+; RV32I-NEXT: or t0, t0, t6
+; RV32I-NEXT: or t1, t1, a4
+; RV32I-NEXT: sll a4, t3, a6
+; RV32I-NEXT: li a6, 0
+; RV32I-NEXT: beqz s1, .LBB1_61
+; RV32I-NEXT: # %bb.54: # %udiv-preheader
+; RV32I-NEXT: li t3, 0
+; RV32I-NEXT: li t4, 0
+; RV32I-NEXT: li t5, 0
+; RV32I-NEXT: sw zero, 72(sp)
+; RV32I-NEXT: sw zero, 76(sp)
+; RV32I-NEXT: sw zero, 80(sp)
+; RV32I-NEXT: sw zero, 84(sp)
+; RV32I-NEXT: sw s2, 56(sp)
+; RV32I-NEXT: sw s3, 60(sp)
+; RV32I-NEXT: sw s5, 64(sp)
+; RV32I-NEXT: sw s4, 68(sp)
+; RV32I-NEXT: srli t6, a1, 3
+; RV32I-NEXT: addi s0, sp, 56
+; RV32I-NEXT: andi t6, t6, 12
+; RV32I-NEXT: add t6, s0, t6
+; RV32I-NEXT: lw s0, 4(t6)
+; RV32I-NEXT: lw s1, 8(t6)
+; RV32I-NEXT: lw s2, 12(t6)
+; RV32I-NEXT: lw s3, 0(t6)
+; RV32I-NEXT: andi t6, a1, 31
+; RV32I-NEXT: xori t6, t6, 31
+; RV32I-NEXT: slli s4, s2, 1
+; RV32I-NEXT: slli s5, s1, 1
+; RV32I-NEXT: slli s6, s0, 1
+; RV32I-NEXT: sll s4, s4, t6
+; RV32I-NEXT: sll s5, s5, t6
+; RV32I-NEXT: sll s6, s6, t6
+; RV32I-NEXT: seqz t6, s11
+; RV32I-NEXT: srl s1, s1, a1
+; RV32I-NEXT: or s7, s1, s4
+; RV32I-NEXT: or s1, s11, s10
+; RV32I-NEXT: sub t6, s10, t6
+; RV32I-NEXT: seqz s1, s1
+; RV32I-NEXT: srl s0, s0, a1
+; RV32I-NEXT: or s8, s0, s5
+; RV32I-NEXT: sub s4, s9, s1
+; RV32I-NEXT: sltu s0, s9, s1
+; RV32I-NEXT: sub s5, ra, s0
+; RV32I-NEXT: srl s0, s3, a1
+; RV32I-NEXT: srl ra, s2, a1
+; RV32I-NEXT: or s9, s0, s6
+; RV32I-NEXT: addi s0, s11, -1
+; RV32I-NEXT: sw s0, 44(sp) # 4-byte Folded Spill
+; RV32I-NEXT: j .LBB1_56
+; RV32I-NEXT: .LBB1_55: # %udiv-do-while
+; RV32I-NEXT: # in Loop: Header=BB1_56 Depth=1
+; RV32I-NEXT: srli s2, t0, 31
+; RV32I-NEXT: slli t2, t2, 1
+; RV32I-NEXT: sub s3, s10, s6
+; RV32I-NEXT: srli s6, t1, 31
+; RV32I-NEXT: slli t0, t0, 1
+; RV32I-NEXT: or t2, t2, s2
+; RV32I-NEXT: srli s2, a4, 31
+; RV32I-NEXT: slli t1, t1, 1
+; RV32I-NEXT: slli a4, a4, 1
+; RV32I-NEXT: or t0, t0, s6
+; RV32I-NEXT: lw s6, 48(sp) # 4-byte Folded Reload
+; RV32I-NEXT: and s6, s8, s6
+; RV32I-NEXT: or t1, t1, s2
+; RV32I-NEXT: and s2, s8, a3
+; RV32I-NEXT: or a4, a6, a4
+; RV32I-NEXT: sub s10, s0, s2
+; RV32I-NEXT: sltu s0, s0, s2
+; RV32I-NEXT: or s2, a1, a0
+; RV32I-NEXT: sub s6, s7, s6
+; RV32I-NEXT: seqz s7, a1
+; RV32I-NEXT: addi a1, a1, -1
+; RV32I-NEXT: andi a6, s8, 1
+; RV32I-NEXT: sub s8, s3, s1
+; RV32I-NEXT: seqz s1, s2
+; RV32I-NEXT: sub a0, a0, s7
+; RV32I-NEXT: or t1, t3, t1
+; RV32I-NEXT: or t0, t4, t0
+; RV32I-NEXT: or t2, t5, t2
+; RV32I-NEXT: sub s7, s10, ra
+; RV32I-NEXT: sltu t3, s10, ra
+; RV32I-NEXT: sub t4, s6, s0
+; RV32I-NEXT: sltu t5, a7, s1
+; RV32I-NEXT: sub a7, a7, s1
+; RV32I-NEXT: sub ra, t4, t3
+; RV32I-NEXT: sub a5, a5, t5
+; RV32I-NEXT: or t3, a0, a5
+; RV32I-NEXT: or t4, a1, a7
+; RV32I-NEXT: or s0, t4, t3
+; RV32I-NEXT: sub s9, s9, s11
+; RV32I-NEXT: li t3, 0
+; RV32I-NEXT: li t4, 0
+; RV32I-NEXT: li t5, 0
+; RV32I-NEXT: mv s11, a2
+; RV32I-NEXT: beqz s0, .LBB1_61
+; RV32I-NEXT: .LBB1_56: # %udiv-do-while
+; RV32I-NEXT: # =>This Inner Loop Header: Depth=1
+; RV32I-NEXT: srli s0, s9, 31
+; RV32I-NEXT: slli s1, s8, 1
+; RV32I-NEXT: slli s9, s9, 1
+; RV32I-NEXT: or s10, s1, s0
+; RV32I-NEXT: srli s0, t2, 31
+; RV32I-NEXT: or s9, s9, s0
+; RV32I-NEXT: beq t6, s10, .LBB1_58
+; RV32I-NEXT: # %bb.57: # %udiv-do-while
+; RV32I-NEXT: # in Loop: Header=BB1_56 Depth=1
+; RV32I-NEXT: sltu s1, t6, s10
+; RV32I-NEXT: j .LBB1_59
+; RV32I-NEXT: .LBB1_58: # in Loop: Header=BB1_56 Depth=1
+; RV32I-NEXT: lw s0, 44(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sltu s1, s0, s9
+; RV32I-NEXT: .LBB1_59: # %udiv-do-while
+; RV32I-NEXT: # in Loop: Header=BB1_56 Depth=1
+; RV32I-NEXT: srli s0, s7, 31
+; RV32I-NEXT: slli ra, ra, 1
+; RV32I-NEXT: srli s2, s8, 31
+; RV32I-NEXT: slli s3, s7, 1
+; RV32I-NEXT: or s7, ra, s0
+; RV32I-NEXT: or s0, s3, s2
+; RV32I-NEXT: sub s2, s4, s0
+; RV32I-NEXT: sltu s3, s4, s0
+; RV32I-NEXT: sub s6, s5, s7
+; RV32I-NEXT: sltu s1, s2, s1
+; RV32I-NEXT: sub s2, s6, s3
+; RV32I-NEXT: sub s1, s2, s1
+; RV32I-NEXT: srai s8, s1, 31
+; RV32I-NEXT: and s11, s8, s11
+; RV32I-NEXT: lw s1, 52(sp) # 4-byte Folded Reload
+; RV32I-NEXT: and s6, s8, s1
+; RV32I-NEXT: sltu s1, s9, s11
+; RV32I-NEXT: mv ra, s1
+; RV32I-NEXT: beq s10, s6, .LBB1_55
+; RV32I-NEXT: # %bb.60: # %udiv-do-while
+; RV32I-NEXT: # in Loop: Header=BB1_56 Depth=1
+; RV32I-NEXT: sltu ra, s10, s6
+; RV32I-NEXT: j .LBB1_55
+; RV32I-NEXT: .LBB1_61: # %udiv-loop-exit
+; RV32I-NEXT: srli a0, a4, 31
+; RV32I-NEXT: slli a1, t1, 1
+; RV32I-NEXT: srli a5, t1, 31
+; RV32I-NEXT: or s4, a1, a0
+; RV32I-NEXT: slli a0, t0, 1
+; RV32I-NEXT: srli a1, t0, 31
+; RV32I-NEXT: slli t2, t2, 1
+; RV32I-NEXT: slli a4, a4, 1
+; RV32I-NEXT: or s7, a0, a5
+; RV32I-NEXT: or s5, t2, a1
+; RV32I-NEXT: or s6, a6, a4
+; RV32I-NEXT: lw s10, 52(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s3, 28(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw ra, 48(sp) # 4-byte Folded Reload
+; RV32I-NEXT: mv s9, a3
+; RV32I-NEXT: .LBB1_62: # %udiv-end
+; RV32I-NEXT: mv a0, s6
+; RV32I-NEXT: mv a1, s4
+; RV32I-NEXT: mv a2, s9
+; RV32I-NEXT: mv a3, ra
+; RV32I-NEXT: call __muldi3
+; RV32I-NEXT: mv s8, a0
+; RV32I-NEXT: mv s9, a1
+; RV32I-NEXT: mv a0, s7
+; RV32I-NEXT: mv a1, s5
+; RV32I-NEXT: mv a2, s11
+; RV32I-NEXT: mv a3, s10
+; RV32I-NEXT: call __muldi3
+; RV32I-NEXT: add a1, a1, s9
+; RV32I-NEXT: add s9, a0, s8
+; RV32I-NEXT: sltu s8, s9, a0
+; RV32I-NEXT: add s8, a1, s8
+; RV32I-NEXT: mv a0, s11
+; RV32I-NEXT: li a1, 0
+; RV32I-NEXT: mv a2, s6
+; RV32I-NEXT: li a3, 0
+; RV32I-NEXT: call __muldi3
+; RV32I-NEXT: mv s5, a0
+; RV32I-NEXT: mv s7, a1
+; RV32I-NEXT: mv a0, s10
+; RV32I-NEXT: li a1, 0
+; RV32I-NEXT: mv a2, s6
+; RV32I-NEXT: li a3, 0
+; RV32I-NEXT: call __muldi3
+; RV32I-NEXT: add s0, a0, s7
+; RV32I-NEXT: sltu a0, s0, a0
+; RV32I-NEXT: add s1, a1, a0
+; RV32I-NEXT: mv a0, s11
+; RV32I-NEXT: li a1, 0
+; RV32I-NEXT: mv a2, s4
+; RV32I-NEXT: li a3, 0
+; RV32I-NEXT: call __muldi3
+; RV32I-NEXT: add s0, a0, s0
+; RV32I-NEXT: sltu a0, s0, a0
+; RV32I-NEXT: add a0, a1, a0
+; RV32I-NEXT: add s2, s1, a0
+; RV32I-NEXT: mv a0, s10
+; RV32I-NEXT: li a1, 0
+; RV32I-NEXT: mv a2, s4
+; RV32I-NEXT: li a3, 0
+; RV32I-NEXT: call __muldi3
+; RV32I-NEXT: add a3, a0, s2
+; RV32I-NEXT: sltu a4, s2, s1
+; RV32I-NEXT: lw a5, 40(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sltu a2, a5, s5
+; RV32I-NEXT: sltu a0, a3, a0
+; RV32I-NEXT: add a1, a1, a4
+; RV32I-NEXT: add s9, a3, s9
+; RV32I-NEXT: add a0, a1, a0
+; RV32I-NEXT: sltu a1, s9, a3
+; RV32I-NEXT: lw a6, 32(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sltu a3, a6, s9
+; RV32I-NEXT: add a0, a0, s8
+; RV32I-NEXT: lw a4, 36(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sub a1, a4, a1
+; RV32I-NEXT: sub a0, a1, a0
+; RV32I-NEXT: sub a0, a0, a3
+; RV32I-NEXT: sub a1, a6, s9
+; RV32I-NEXT: mv a3, a2
+; RV32I-NEXT: beq s3, s0, .LBB1_64
+; RV32I-NEXT: # %bb.63: # %udiv-end
+; RV32I-NEXT: sltu a3, s3, s0
+; RV32I-NEXT: .LBB1_64: # %udiv-end
+; RV32I-NEXT: sltu a4, a1, a3
+; RV32I-NEXT: sub a1, a1, a3
+; RV32I-NEXT: sub a3, s3, s0
+; RV32I-NEXT: sub a5, a5, s5
+; RV32I-NEXT: lw a6, 20(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw a7, 4(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw a7, 0(a6)
+; RV32I-NEXT: lw a7, 16(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw a7, 4(a6)
+; RV32I-NEXT: lw a7, 8(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw a7, 8(a6)
+; RV32I-NEXT: lw a7, 12(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw a7, 12(a6)
+; RV32I-NEXT: sub a0, a0, a4
+; RV32I-NEXT: sub a3, a3, a2
+; RV32I-NEXT: lw a2, 24(sp) # 4-byte Folded Reload
+; RV32I-NEXT: sw a5, 0(a2)
+; RV32I-NEXT: sw a3, 4(a2)
+; RV32I-NEXT: sw a1, 8(a2)
+; RV32I-NEXT: sw a0, 12(a2)
+; RV32I-NEXT: lw ra, 236(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s0, 232(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s1, 228(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s2, 224(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s3, 220(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s4, 216(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s5, 212(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s6, 208(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s7, 204(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s8, 200(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s9, 196(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s10, 192(sp) # 4-byte Folded Reload
+; RV32I-NEXT: lw s11, 188(sp) # 4-byte Folded Reload
+; RV32I-NEXT: .cfi_restore ra
+; RV32I-NEXT: .cfi_restore s0
+; RV32I-NEXT: .cfi_restore s1
+; RV32I-NEXT: .cfi_restore s2
+; RV32I-NEXT: .cfi_restore s3
+; RV32I-NEXT: .cfi_restore s4
+; RV32I-NEXT: .cfi_restore s5
+; RV32I-NEXT: .cfi_restore s6
+; RV32I-NEXT: .cfi_restore s7
+; RV32I-NEXT: .cfi_restore s8
+; RV32I-NEXT: .cfi_restore s9
+; RV32I-NEXT: .cfi_restore s10
+; RV32I-NEXT: .cfi_restore s11
+; RV32I-NEXT: addi sp, sp, 240
+; RV32I-NEXT: .cfi_def_cfa_offset 0
+; RV32I-NEXT: ret
+;
+; RV32M-LABEL: udivrem_i128:
+; RV32M: # %bb.0: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: addi sp, sp, -256
+; RV32M-NEXT: .cfi_def_cfa_offset 256
+; RV32M-NEXT: sw ra, 252(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s0, 248(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s1, 244(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s2, 240(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s3, 236(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s4, 232(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s5, 228(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s6, 224(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s7, 220(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s8, 216(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s9, 212(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s10, 208(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s11, 204(sp) # 4-byte Folded Spill
+; RV32M-NEXT: .cfi_offset ra, -4
+; RV32M-NEXT: .cfi_offset s0, -8
+; RV32M-NEXT: .cfi_offset s1, -12
+; RV32M-NEXT: .cfi_offset s2, -16
+; RV32M-NEXT: .cfi_offset s3, -20
+; RV32M-NEXT: .cfi_offset s4, -24
+; RV32M-NEXT: .cfi_offset s5, -28
+; RV32M-NEXT: .cfi_offset s6, -32
+; RV32M-NEXT: .cfi_offset s7, -36
+; RV32M-NEXT: .cfi_offset s8, -40
+; RV32M-NEXT: .cfi_offset s9, -44
+; RV32M-NEXT: .cfi_offset s10, -48
+; RV32M-NEXT: .cfi_offset s11, -52
+; RV32M-NEXT: sw a1, 32(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw a0, 28(sp) # 4-byte Folded Spill
+; RV32M-NEXT: lw a6, 0(a3)
+; RV32M-NEXT: lw s11, 4(a3)
+; RV32M-NEXT: lw ra, 8(a3)
+; RV32M-NEXT: lw s10, 12(a3)
+; RV32M-NEXT: lui a0, 349525
+; RV32M-NEXT: lui a1, 209715
+; RV32M-NEXT: addi t5, a0, 1365
+; RV32M-NEXT: addi t4, a1, 819
+; RV32M-NEXT: lui t2, 61681
+; RV32M-NEXT: addi t2, t2, -241
+; RV32M-NEXT: lui t3, 4112
+; RV32M-NEXT: addi t3, t3, 257
+; RV32M-NEXT: bnez s11, .LBB1_2
+; RV32M-NEXT: # %bb.1: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: srli a0, a6, 1
+; RV32M-NEXT: or a0, a6, a0
+; RV32M-NEXT: srli a1, a0, 2
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 8
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 16
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a1, a0, 1
+; RV32M-NEXT: and a1, a1, t5
+; RV32M-NEXT: sub a0, a0, a1
+; RV32M-NEXT: and a1, a0, t4
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, t4
+; RV32M-NEXT: add a0, a1, a0
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: add a0, a0, a1
+; RV32M-NEXT: and a0, a0, t2
+; RV32M-NEXT: mul a0, a0, t3
+; RV32M-NEXT: srli a0, a0, 24
+; RV32M-NEXT: addi a1, a0, 32
+; RV32M-NEXT: j .LBB1_3
+; RV32M-NEXT: .LBB1_2:
+; RV32M-NEXT: srli a0, s11, 1
+; RV32M-NEXT: or a0, s11, a0
+; RV32M-NEXT: srli a1, a0, 2
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 8
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 16
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a1, a0, 1
+; RV32M-NEXT: and a1, a1, t5
+; RV32M-NEXT: sub a0, a0, a1
+; RV32M-NEXT: and a1, a0, t4
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, t4
+; RV32M-NEXT: add a0, a1, a0
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: add a0, a0, a1
+; RV32M-NEXT: and a0, a0, t2
+; RV32M-NEXT: mul a1, a0, t3
+; RV32M-NEXT: srli a1, a1, 24
+; RV32M-NEXT: .LBB1_3: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: lw s8, 4(a2)
+; RV32M-NEXT: or t6, ra, s10
+; RV32M-NEXT: bnez s10, .LBB1_5
+; RV32M-NEXT: # %bb.4: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: srli a0, ra, 1
+; RV32M-NEXT: or a0, ra, a0
+; RV32M-NEXT: srli a7, a0, 2
+; RV32M-NEXT: or a0, a0, a7
+; RV32M-NEXT: srli a7, a0, 4
+; RV32M-NEXT: or a0, a0, a7
+; RV32M-NEXT: srli a7, a0, 8
+; RV32M-NEXT: or a0, a0, a7
+; RV32M-NEXT: srli a7, a0, 16
+; RV32M-NEXT: or a0, a0, a7
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a7, a0, 1
+; RV32M-NEXT: and a7, a7, t5
+; RV32M-NEXT: sub a0, a0, a7
+; RV32M-NEXT: and a7, a0, t4
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, t4
+; RV32M-NEXT: add a0, a7, a0
+; RV32M-NEXT: srli a7, a0, 4
+; RV32M-NEXT: add a0, a0, a7
+; RV32M-NEXT: and a0, a0, t2
+; RV32M-NEXT: mul a0, a0, t3
+; RV32M-NEXT: srli a0, a0, 24
+; RV32M-NEXT: addi a0, a0, 32
+; RV32M-NEXT: j .LBB1_6
+; RV32M-NEXT: .LBB1_5:
+; RV32M-NEXT: srli a0, s10, 1
+; RV32M-NEXT: or a0, s10, a0
+; RV32M-NEXT: srli a7, a0, 2
+; RV32M-NEXT: or a0, a0, a7
+; RV32M-NEXT: srli a7, a0, 4
+; RV32M-NEXT: or a0, a0, a7
+; RV32M-NEXT: srli a7, a0, 8
+; RV32M-NEXT: or a0, a0, a7
+; RV32M-NEXT: srli a7, a0, 16
+; RV32M-NEXT: or a0, a0, a7
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a7, a0, 1
+; RV32M-NEXT: and a7, a7, t5
+; RV32M-NEXT: sub a0, a0, a7
+; RV32M-NEXT: and a7, a0, t4
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, t4
+; RV32M-NEXT: add a0, a7, a0
+; RV32M-NEXT: srli a7, a0, 4
+; RV32M-NEXT: add a0, a0, a7
+; RV32M-NEXT: and a0, a0, t2
+; RV32M-NEXT: mul a0, a0, t3
+; RV32M-NEXT: srli a0, a0, 24
+; RV32M-NEXT: .LBB1_6: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: lw s7, 12(a2)
+; RV32M-NEXT: addi t0, a1, 64
+; RV32M-NEXT: bnez t6, .LBB1_8
+; RV32M-NEXT: # %bb.7: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: mv a0, t0
+; RV32M-NEXT: .LBB1_8: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: lw s9, 0(a2)
+; RV32M-NEXT: lw s6, 8(a2)
+; RV32M-NEXT: snez s3, t6
+; RV32M-NEXT: bnez s8, .LBB1_10
+; RV32M-NEXT: # %bb.9: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: srli a2, s9, 1
+; RV32M-NEXT: or a2, s9, a2
+; RV32M-NEXT: srli a7, a2, 2
+; RV32M-NEXT: or a2, a2, a7
+; RV32M-NEXT: srli a7, a2, 4
+; RV32M-NEXT: or a2, a2, a7
+; RV32M-NEXT: srli a7, a2, 8
+; RV32M-NEXT: or a2, a2, a7
+; RV32M-NEXT: srli a7, a2, 16
+; RV32M-NEXT: or a2, a2, a7
+; RV32M-NEXT: not a2, a2
+; RV32M-NEXT: srli a7, a2, 1
+; RV32M-NEXT: and a7, a7, t5
+; RV32M-NEXT: sub a2, a2, a7
+; RV32M-NEXT: and a7, a2, t4
+; RV32M-NEXT: srli a2, a2, 2
+; RV32M-NEXT: and a2, a2, t4
+; RV32M-NEXT: add a2, a7, a2
+; RV32M-NEXT: srli a7, a2, 4
+; RV32M-NEXT: add a2, a2, a7
+; RV32M-NEXT: and a2, a2, t2
+; RV32M-NEXT: mul a2, a2, t3
+; RV32M-NEXT: srli a2, a2, 24
+; RV32M-NEXT: addi a2, a2, 32
+; RV32M-NEXT: j .LBB1_11
+; RV32M-NEXT: .LBB1_10:
+; RV32M-NEXT: srli a2, s8, 1
+; RV32M-NEXT: or a2, s8, a2
+; RV32M-NEXT: srli a7, a2, 2
+; RV32M-NEXT: or a2, a2, a7
+; RV32M-NEXT: srli a7, a2, 4
+; RV32M-NEXT: or a2, a2, a7
+; RV32M-NEXT: srli a7, a2, 8
+; RV32M-NEXT: or a2, a2, a7
+; RV32M-NEXT: srli a7, a2, 16
+; RV32M-NEXT: or a2, a2, a7
+; RV32M-NEXT: not a2, a2
+; RV32M-NEXT: srli a7, a2, 1
+; RV32M-NEXT: and a7, a7, t5
+; RV32M-NEXT: sub a2, a2, a7
+; RV32M-NEXT: and a7, a2, t4
+; RV32M-NEXT: srli a2, a2, 2
+; RV32M-NEXT: and a2, a2, t4
+; RV32M-NEXT: add a2, a7, a2
+; RV32M-NEXT: srli a7, a2, 4
+; RV32M-NEXT: add a2, a2, a7
+; RV32M-NEXT: and a2, a2, t2
+; RV32M-NEXT: mul a2, a2, t3
+; RV32M-NEXT: srli a2, a2, 24
+; RV32M-NEXT: .LBB1_11: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: or t6, s11, s10
+; RV32M-NEXT: or s0, a6, ra
+; RV32M-NEXT: or s1, s8, s7
+; RV32M-NEXT: or s2, s9, s6
+; RV32M-NEXT: sltu t0, t0, a1
+; RV32M-NEXT: addi s3, s3, -1
+; RV32M-NEXT: addi a1, a2, 64
+; RV32M-NEXT: or s4, s6, s7
+; RV32M-NEXT: sltu a7, a1, a2
+; RV32M-NEXT: snez a2, s4
+; RV32M-NEXT: addi a2, a2, -1
+; RV32M-NEXT: bnez s7, .LBB1_13
+; RV32M-NEXT: # %bb.12: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: srli t1, s6, 1
+; RV32M-NEXT: or t1, s6, t1
+; RV32M-NEXT: srli s5, t1, 2
+; RV32M-NEXT: or t1, t1, s5
+; RV32M-NEXT: srli s5, t1, 4
+; RV32M-NEXT: or t1, t1, s5
+; RV32M-NEXT: srli s5, t1, 8
+; RV32M-NEXT: or t1, t1, s5
+; RV32M-NEXT: srli s5, t1, 16
+; RV32M-NEXT: or t1, t1, s5
+; RV32M-NEXT: not t1, t1
+; RV32M-NEXT: srli s5, t1, 1
+; RV32M-NEXT: and t5, s5, t5
+; RV32M-NEXT: sub t1, t1, t5
+; RV32M-NEXT: and t5, t1, t4
+; RV32M-NEXT: srli t1, t1, 2
+; RV32M-NEXT: and t1, t1, t4
+; RV32M-NEXT: add t1, t5, t1
+; RV32M-NEXT: srli t4, t1, 4
+; RV32M-NEXT: add t1, t1, t4
+; RV32M-NEXT: and t1, t1, t2
+; RV32M-NEXT: mul t1, t1, t3
+; RV32M-NEXT: srli t1, t1, 24
+; RV32M-NEXT: addi t1, t1, 32
+; RV32M-NEXT: j .LBB1_14
+; RV32M-NEXT: .LBB1_13:
+; RV32M-NEXT: srli t1, s7, 1
+; RV32M-NEXT: or t1, s7, t1
+; RV32M-NEXT: srli s5, t1, 2
+; RV32M-NEXT: or t1, t1, s5
+; RV32M-NEXT: srli s5, t1, 4
+; RV32M-NEXT: or t1, t1, s5
+; RV32M-NEXT: srli s5, t1, 8
+; RV32M-NEXT: or t1, t1, s5
+; RV32M-NEXT: srli s5, t1, 16
+; RV32M-NEXT: or t1, t1, s5
+; RV32M-NEXT: not t1, t1
+; RV32M-NEXT: srli s5, t1, 1
+; RV32M-NEXT: and t5, s5, t5
+; RV32M-NEXT: sub t1, t1, t5
+; RV32M-NEXT: and t5, t1, t4
+; RV32M-NEXT: srli t1, t1, 2
+; RV32M-NEXT: and t1, t1, t4
+; RV32M-NEXT: add t1, t5, t1
+; RV32M-NEXT: srli t4, t1, 4
+; RV32M-NEXT: add t1, t1, t4
+; RV32M-NEXT: and t1, t1, t2
+; RV32M-NEXT: mul t1, t1, t3
+; RV32M-NEXT: srli t1, t1, 24
+; RV32M-NEXT: .LBB1_14: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: or t2, s0, t6
+; RV32M-NEXT: or t3, s2, s1
+; RV32M-NEXT: and t0, s3, t0
+; RV32M-NEXT: and a2, a2, a7
+; RV32M-NEXT: bnez s4, .LBB1_16
+; RV32M-NEXT: # %bb.15: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: mv t1, a1
+; RV32M-NEXT: .LBB1_16: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: seqz a1, t2
+; RV32M-NEXT: seqz a7, t3
+; RV32M-NEXT: sltu t2, a0, t1
+; RV32M-NEXT: sub t3, t0, a2
+; RV32M-NEXT: mv t4, t2
+; RV32M-NEXT: beq t0, a2, .LBB1_18
+; RV32M-NEXT: # %bb.17: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: sltu t4, t0, a2
+; RV32M-NEXT: .LBB1_18: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: sub t3, t3, t2
+; RV32M-NEXT: or a2, a1, a7
+; RV32M-NEXT: neg a1, t4
+; RV32M-NEXT: seqz t4, t4
+; RV32M-NEXT: addi t4, t4, -1
+; RV32M-NEXT: or a7, a1, t4
+; RV32M-NEXT: sub a0, a0, t1
+; RV32M-NEXT: beqz a7, .LBB1_20
+; RV32M-NEXT: # %bb.19: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: snez a7, a7
+; RV32M-NEXT: j .LBB1_21
+; RV32M-NEXT: .LBB1_20:
+; RV32M-NEXT: snez a7, t3
+; RV32M-NEXT: sltiu t0, a0, 128
+; RV32M-NEXT: xori t0, t0, 1
+; RV32M-NEXT: or a7, t0, a7
+; RV32M-NEXT: .LBB1_21: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: li s5, 127
+; RV32M-NEXT: or a2, a2, a7
+; RV32M-NEXT: addi a7, a2, -1
+; RV32M-NEXT: and a4, a7, s7
+; RV32M-NEXT: and a5, a7, s6
+; RV32M-NEXT: and a3, a7, s8
+; RV32M-NEXT: and t0, a7, s9
+; RV32M-NEXT: sw s10, 68(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw ra, 64(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s11, 60(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s8, 48(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s9, 44(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s6, 40(sp) # 4-byte Folded Spill
+; RV32M-NEXT: sw s7, 36(sp) # 4-byte Folded Spill
+; RV32M-NEXT: bnez a2, .LBB1_33
+; RV32M-NEXT: # %bb.22: # %_udiv-special-cases_udiv-special-cases
+; RV32M-NEXT: xori a2, a0, 127
+; RV32M-NEXT: or a2, a2, a1
+; RV32M-NEXT: or a7, t3, t4
+; RV32M-NEXT: or a2, a2, a7
+; RV32M-NEXT: beqz a2, .LBB1_33
+; RV32M-NEXT: # %bb.23: # %udiv-bb15
+; RV32M-NEXT: addi t2, a0, 1
+; RV32M-NEXT: sub a0, s5, a0
+; RV32M-NEXT: sw zero, 168(sp)
+; RV32M-NEXT: sw zero, 172(sp)
+; RV32M-NEXT: sw zero, 176(sp)
+; RV32M-NEXT: sw zero, 180(sp)
+; RV32M-NEXT: sw s9, 184(sp)
+; RV32M-NEXT: sw s8, 188(sp)
+; RV32M-NEXT: sw s6, 192(sp)
+; RV32M-NEXT: sw s7, 196(sp)
+; RV32M-NEXT: addi a2, sp, 184
+; RV32M-NEXT: seqz a3, t2
+; RV32M-NEXT: srli a4, a0, 3
+; RV32M-NEXT: andi a5, a0, 31
+; RV32M-NEXT: add t3, t3, a3
+; RV32M-NEXT: andi a4, a4, 12
+; RV32M-NEXT: xori a3, a5, 31
+; RV32M-NEXT: or a5, t2, t3
+; RV32M-NEXT: sub a2, a2, a4
+; RV32M-NEXT: seqz s1, a5
+; RV32M-NEXT: lw a4, 0(a2)
+; RV32M-NEXT: lw a5, 4(a2)
+; RV32M-NEXT: lw a7, 8(a2)
+; RV32M-NEXT: lw a2, 12(a2)
+; RV32M-NEXT: add s1, a1, s1
+; RV32M-NEXT: sltu t5, s1, a1
+; RV32M-NEXT: or a1, t2, s1
+; RV32M-NEXT: add t5, t4, t5
+; RV32M-NEXT: or t0, t3, t5
+; RV32M-NEXT: srli t1, a7, 1
+; RV32M-NEXT: srli t4, a5, 1
+; RV32M-NEXT: or a1, a1, t0
+; RV32M-NEXT: srli t0, a4, 1
+; RV32M-NEXT: srl t1, t1, a3
+; RV32M-NEXT: srl t4, t4, a3
+; RV32M-NEXT: srl a3, t0, a3
+; RV32M-NEXT: sll a2, a2, a0
+; RV32M-NEXT: or s4, a2, t1
+; RV32M-NEXT: sll a2, a7, a0
+; RV32M-NEXT: sll a5, a5, a0
+; RV32M-NEXT: or s2, a2, t4
+; RV32M-NEXT: or s3, a5, a3
+; RV32M-NEXT: sll t4, a4, a0
+; RV32M-NEXT: beqz a1, .LBB1_31
+; RV32M-NEXT: # %bb.24: # %udiv-preheader4
+; RV32M-NEXT: mv a0, s6
+; RV32M-NEXT: mv a2, s7
+; RV32M-NEXT: li s0, 0
+; RV32M-NEXT: li s5, 0
+; RV32M-NEXT: li s6, 0
+; RV32M-NEXT: li s7, 0
+; RV32M-NEXT: sw zero, 152(sp)
+; RV32M-NEXT: sw zero, 156(sp)
+; RV32M-NEXT: sw zero, 160(sp)
+; RV32M-NEXT: sw zero, 164(sp)
+; RV32M-NEXT: sw s9, 136(sp)
+; RV32M-NEXT: sw s8, 140(sp)
+; RV32M-NEXT: sw a0, 144(sp)
+; RV32M-NEXT: sw a2, 148(sp)
+; RV32M-NEXT: srli a0, t2, 3
+; RV32M-NEXT: addi a1, sp, 136
+; RV32M-NEXT: andi a0, a0, 12
+; RV32M-NEXT: add a0, a1, a0
+; RV32M-NEXT: lw a1, 4(a0)
+; RV32M-NEXT: lw a2, 8(a0)
+; RV32M-NEXT: lw a3, 12(a0)
+; RV32M-NEXT: lw a4, 0(a0)
+; RV32M-NEXT: andi a0, t2, 31
+; RV32M-NEXT: xori a0, a0, 31
+; RV32M-NEXT: slli a5, a3, 1
+; RV32M-NEXT: slli a7, a2, 1
+; RV32M-NEXT: slli t0, a1, 1
+; RV32M-NEXT: sll a5, a5, a0
+; RV32M-NEXT: sll a7, a7, a0
+; RV32M-NEXT: sll t0, t0, a0
+; RV32M-NEXT: seqz t1, a6
+; RV32M-NEXT: srl a0, a2, t2
+; RV32M-NEXT: or a0, a0, a5
+; RV32M-NEXT: or a2, a6, s11
+; RV32M-NEXT: sub s8, s11, t1
+; RV32M-NEXT: seqz a2, a2
+; RV32M-NEXT: srl a1, a1, t2
+; RV32M-NEXT: or s11, a1, a7
+; RV32M-NEXT: sub s9, ra, a2
+; RV32M-NEXT: sltu a1, ra, a2
+; RV32M-NEXT: sub s10, s10, a1
+; RV32M-NEXT: srl a1, a4, t2
+; RV32M-NEXT: srl t6, a3, t2
+; RV32M-NEXT: or t0, a1, t0
+; RV32M-NEXT: j .LBB1_26
+; RV32M-NEXT: .LBB1_25: # %udiv-do-while3
+; RV32M-NEXT: # in Loop: Header=BB1_26 Depth=1
+; RV32M-NEXT: srli a4, s2, 31
+; RV32M-NEXT: slli s4, s4, 1
+; RV32M-NEXT: sub a1, a7, a1
+; RV32M-NEXT: srli a7, s3, 31
+; RV32M-NEXT: slli s2, s2, 1
+; RV32M-NEXT: or a4, s4, a4
+; RV32M-NEXT: srli s4, t4, 31
+; RV32M-NEXT: slli s3, s3, 1
+; RV32M-NEXT: slli t4, t4, 1
+; RV32M-NEXT: or a7, s2, a7
+; RV32M-NEXT: lw a3, 68(sp) # 4-byte Folded Reload
+; RV32M-NEXT: and s2, s11, a3
+; RV32M-NEXT: or s3, s3, s4
+; RV32M-NEXT: lw a3, 64(sp) # 4-byte Folded Reload
+; RV32M-NEXT: and s4, s11, a3
+; RV32M-NEXT: or t4, s0, t4
+; RV32M-NEXT: sub a3, t1, s4
+; RV32M-NEXT: sltu t1, t1, s4
+; RV32M-NEXT: or s4, t2, t3
+; RV32M-NEXT: sub a5, a0, s2
+; RV32M-NEXT: seqz a0, t2
+; RV32M-NEXT: addi t2, t2, -1
+; RV32M-NEXT: andi s0, s11, 1
+; RV32M-NEXT: sub s11, a1, a2
+; RV32M-NEXT: seqz a1, s4
+; RV32M-NEXT: sub t3, t3, a0
+; RV32M-NEXT: or s3, s5, s3
+; RV32M-NEXT: or s2, s6, a7
+; RV32M-NEXT: or s4, s7, a4
+; RV32M-NEXT: sub a0, a3, t6
+; RV32M-NEXT: sltu a2, a3, t6
+; RV32M-NEXT: sub a3, a5, t1
+; RV32M-NEXT: sltu a4, s1, a1
+; RV32M-NEXT: sub s1, s1, a1
+; RV32M-NEXT: sub t6, a3, a2
+; RV32M-NEXT: sub t5, t5, a4
+; RV32M-NEXT: or a1, t3, t5
+; RV32M-NEXT: or a2, t2, s1
+; RV32M-NEXT: or a1, a2, a1
+; RV32M-NEXT: sub t0, ra, t0
+; RV32M-NEXT: li s5, 0
+; RV32M-NEXT: li s6, 0
+; RV32M-NEXT: li s7, 0
+; RV32M-NEXT: beqz a1, .LBB1_32
+; RV32M-NEXT: .LBB1_26: # %udiv-do-while3
+; RV32M-NEXT: # =>This Inner Loop Header: Depth=1
+; RV32M-NEXT: srli a1, t0, 31
+; RV32M-NEXT: slli a2, s11, 1
+; RV32M-NEXT: slli t0, t0, 1
+; RV32M-NEXT: or a7, a2, a1
+; RV32M-NEXT: srli a1, s4, 31
+; RV32M-NEXT: or ra, t0, a1
+; RV32M-NEXT: beq s8, a7, .LBB1_28
+; RV32M-NEXT: # %bb.27: # %udiv-do-while3
+; RV32M-NEXT: # in Loop: Header=BB1_26 Depth=1
+; RV32M-NEXT: sltu a1, s8, a7
+; RV32M-NEXT: j .LBB1_29
+; RV32M-NEXT: .LBB1_28: # in Loop: Header=BB1_26 Depth=1
+; RV32M-NEXT: addi a1, a6, -1
+; RV32M-NEXT: sltu a1, a1, ra
+; RV32M-NEXT: .LBB1_29: # %udiv-do-while3
+; RV32M-NEXT: # in Loop: Header=BB1_26 Depth=1
+; RV32M-NEXT: srli a2, a0, 31
+; RV32M-NEXT: slli t6, t6, 1
+; RV32M-NEXT: srli t0, s11, 31
+; RV32M-NEXT: slli t1, a0, 1
+; RV32M-NEXT: or a0, t6, a2
+; RV32M-NEXT: or t1, t1, t0
+; RV32M-NEXT: sub a2, s9, t1
+; RV32M-NEXT: sltu t0, s9, t1
+; RV32M-NEXT: sub t6, s10, a0
+; RV32M-NEXT: sltu a1, a2, a1
+; RV32M-NEXT: sub a2, t6, t0
+; RV32M-NEXT: sub a2, a2, a1
+; RV32M-NEXT: srai s11, a2, 31
+; RV32M-NEXT: and t0, s11, a6
+; RV32M-NEXT: lw a1, 60(sp) # 4-byte Folded Reload
+; RV32M-NEXT: and a1, s11, a1
+; RV32M-NEXT: sltu a2, ra, t0
+; RV32M-NEXT: mv t6, a2
+; RV32M-NEXT: beq a7, a1, .LBB1_25
+; RV32M-NEXT: # %bb.30: # %udiv-do-while3
+; RV32M-NEXT: # in Loop: Header=BB1_26 Depth=1
+; RV32M-NEXT: sltu t6, a7, a1
+; RV32M-NEXT: j .LBB1_25
+; RV32M-NEXT: .LBB1_31:
+; RV32M-NEXT: li s0, 0
+; RV32M-NEXT: .LBB1_32: # %udiv-loop-exit2
+; RV32M-NEXT: srli a0, t4, 31
+; RV32M-NEXT: slli a1, s3, 1
+; RV32M-NEXT: srli a2, s3, 31
+; RV32M-NEXT: or a3, a1, a0
+; RV32M-NEXT: slli a0, s2, 1
+; RV32M-NEXT: srli a1, s2, 31
+; RV32M-NEXT: slli s4, s4, 1
+; RV32M-NEXT: slli t4, t4, 1
+; RV32M-NEXT: or a5, a0, a2
+; RV32M-NEXT: or a4, s4, a1
+; RV32M-NEXT: or t0, s0, t4
+; RV32M-NEXT: lw s10, 68(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw ra, 64(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s11, 60(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s8, 48(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s9, 44(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s6, 40(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s7, 36(sp) # 4-byte Folded Reload
+; RV32M-NEXT: li s5, 127
+; RV32M-NEXT: .LBB1_33: # %udiv-end1
+; RV32M-NEXT: sw a3, 24(sp) # 4-byte Folded Spill
+; RV32M-NEXT: lui a0, 349525
+; RV32M-NEXT: lui a1, 209715
+; RV32M-NEXT: lui a2, 61681
+; RV32M-NEXT: lui a3, 4112
+; RV32M-NEXT: addi s3, a0, 1365
+; RV32M-NEXT: addi s2, a1, 819
+; RV32M-NEXT: addi s1, a2, -241
+; RV32M-NEXT: addi s0, a3, 257
+; RV32M-NEXT: bnez s11, .LBB1_36
+; RV32M-NEXT: # %bb.34: # %udiv-end1
+; RV32M-NEXT: srli a0, a6, 1
+; RV32M-NEXT: or a0, a6, a0
+; RV32M-NEXT: srli a1, a0, 2
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 8
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 16
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a1, a0, 1
+; RV32M-NEXT: and a1, a1, s3
+; RV32M-NEXT: sub a0, a0, a1
+; RV32M-NEXT: and a1, a0, s2
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, s2
+; RV32M-NEXT: add a0, a1, a0
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: add a0, a0, a1
+; RV32M-NEXT: and a0, a0, s1
+; RV32M-NEXT: mul a0, a0, s0
+; RV32M-NEXT: srli a0, a0, 24
+; RV32M-NEXT: addi t2, a0, 32
+; RV32M-NEXT: or a7, ra, s10
+; RV32M-NEXT: beqz s10, .LBB1_37
+; RV32M-NEXT: .LBB1_35:
+; RV32M-NEXT: srli a0, s10, 1
+; RV32M-NEXT: or a0, s10, a0
+; RV32M-NEXT: srli a1, a0, 2
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 8
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 16
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a1, a0, 1
+; RV32M-NEXT: and a1, a1, s3
+; RV32M-NEXT: sub a0, a0, a1
+; RV32M-NEXT: and a1, a0, s2
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, s2
+; RV32M-NEXT: add a0, a1, a0
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: add a0, a0, a1
+; RV32M-NEXT: and a0, a0, s1
+; RV32M-NEXT: mul a1, a0, s0
+; RV32M-NEXT: srli a1, a1, 24
+; RV32M-NEXT: addi a0, t2, 64
+; RV32M-NEXT: beqz a7, .LBB1_38
+; RV32M-NEXT: j .LBB1_39
+; RV32M-NEXT: .LBB1_36:
+; RV32M-NEXT: srli a0, s11, 1
+; RV32M-NEXT: or a0, s11, a0
+; RV32M-NEXT: srli a1, a0, 2
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 8
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 16
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a1, a0, 1
+; RV32M-NEXT: and a1, a1, s3
+; RV32M-NEXT: sub a0, a0, a1
+; RV32M-NEXT: and a1, a0, s2
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, s2
+; RV32M-NEXT: add a0, a1, a0
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: add a0, a0, a1
+; RV32M-NEXT: and a0, a0, s1
+; RV32M-NEXT: mul a0, a0, s0
+; RV32M-NEXT: srli t2, a0, 24
+; RV32M-NEXT: or a7, ra, s10
+; RV32M-NEXT: bnez s10, .LBB1_35
+; RV32M-NEXT: .LBB1_37: # %udiv-end1
+; RV32M-NEXT: srli a0, ra, 1
+; RV32M-NEXT: or a0, ra, a0
+; RV32M-NEXT: srli a1, a0, 2
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 8
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: srli a1, a0, 16
+; RV32M-NEXT: or a0, a0, a1
+; RV32M-NEXT: not a0, a0
+; RV32M-NEXT: srli a1, a0, 1
+; RV32M-NEXT: and a1, a1, s3
+; RV32M-NEXT: sub a0, a0, a1
+; RV32M-NEXT: and a1, a0, s2
+; RV32M-NEXT: srli a0, a0, 2
+; RV32M-NEXT: and a0, a0, s2
+; RV32M-NEXT: add a0, a1, a0
+; RV32M-NEXT: srli a1, a0, 4
+; RV32M-NEXT: add a0, a0, a1
+; RV32M-NEXT: and a0, a0, s1
+; RV32M-NEXT: mul a0, a0, s0
+; RV32M-NEXT: srli a0, a0, 24
+; RV32M-NEXT: addi a1, a0, 32
+; RV32M-NEXT: addi a0, t2, 64
+; RV32M-NEXT: bnez a7, .LBB1_39
+; RV32M-NEXT: .LBB1_38: # %udiv-end1
+; RV32M-NEXT: mv a1, a0
+; RV32M-NEXT: .LBB1_39: # %udiv-end1
+; RV32M-NEXT: snez a7, a7
+; RV32M-NEXT: sw t0, 12(sp) # 4-byte Folded Spill
+; RV32M-NEXT: bnez s8, .LBB1_41
+; RV32M-NEXT: # %bb.40: # %udiv-end1
+; RV32M-NEXT: srli a2, s9, 1
+; RV32M-NEXT: or a2, s9, a2
+; RV32M-NEXT: srli a3, a2, 2
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: srli a3, a2, 4
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: srli a3, a2, 8
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: srli a3, a2, 16
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: not a2, a2
+; RV32M-NEXT: srli a3, a2, 1
+; RV32M-NEXT: and a3, a3, s3
+; RV32M-NEXT: sub a2, a2, a3
+; RV32M-NEXT: and a3, a2, s2
+; RV32M-NEXT: srli a2, a2, 2
+; RV32M-NEXT: and a2, a2, s2
+; RV32M-NEXT: add a2, a3, a2
+; RV32M-NEXT: srli a3, a2, 4
+; RV32M-NEXT: add a2, a2, a3
+; RV32M-NEXT: and a2, a2, s1
+; RV32M-NEXT: mul a2, a2, s0
+; RV32M-NEXT: srli a2, a2, 24
+; RV32M-NEXT: addi a2, a2, 32
+; RV32M-NEXT: j .LBB1_42
+; RV32M-NEXT: .LBB1_41:
+; RV32M-NEXT: srli a2, s8, 1
+; RV32M-NEXT: or a2, s8, a2
+; RV32M-NEXT: srli a3, a2, 2
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: srli a3, a2, 4
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: srli a3, a2, 8
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: srli a3, a2, 16
+; RV32M-NEXT: or a2, a2, a3
+; RV32M-NEXT: not a2, a2
+; RV32M-NEXT: srli a3, a2, 1
+; RV32M-NEXT: and a3, a3, s3
+; RV32M-NEXT: sub a2, a2, a3
+; RV32M-NEXT: and a3, a2, s2
+; RV32M-NEXT: srli a2, a2, 2
+; RV32M-NEXT: and a2, a2, s2
+; RV32M-NEXT: add a2, a3, a2
+; RV32M-NEXT: srli a3, a2, 4
+; RV32M-NEXT: add a2, a2, a3
+; RV32M-NEXT: and a2, a2, s1
+; RV32M-NEXT: mul a2, a2, s0
+; RV32M-NEXT: srli a2, a2, 24
+; RV32M-NEXT: .LBB1_42: # %udiv-end1
+; RV32M-NEXT: sw a4, 20(sp) # 4-byte Folded Spill
+; RV32M-NEXT: or t0, a6, ra
+; RV32M-NEXT: or t3, s11, s10
+; RV32M-NEXT: or t4, s9, s6
+; RV32M-NEXT: or t5, s8, s7
+; RV32M-NEXT: sltu t2, a0, t2
+; RV32M-NEXT: addi a7, a7, -1
+; RV32M-NEXT: addi a0, a2, 64
+; RV32M-NEXT: or t6, s6, s7
+; RV32M-NEXT: sltu s4, a0, a2
+; RV32M-NEXT: snez a2, t6
+; RV32M-NEXT: addi a2, a2, -1
+; RV32M-NEXT: bnez s7, .LBB1_44
+; RV32M-NEXT: # %bb.43: # %udiv-end1
+; RV32M-NEXT: srli a3, s6, 1
+; RV32M-NEXT: or a3, s6, a3
+; RV32M-NEXT: srli a4, a3, 2
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: srli a4, a3, 4
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: srli a4, a3, 8
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: srli a4, a3, 16
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: not a3, a3
+; RV32M-NEXT: srli a4, a3, 1
+; RV32M-NEXT: and a4, a4, s3
+; RV32M-NEXT: sub a3, a3, a4
+; RV32M-NEXT: and a4, a3, s2
+; RV32M-NEXT: srli a3, a3, 2
+; RV32M-NEXT: and a3, a3, s2
+; RV32M-NEXT: add a3, a4, a3
+; RV32M-NEXT: srli a4, a3, 4
+; RV32M-NEXT: add a3, a3, a4
+; RV32M-NEXT: and a3, a3, s1
+; RV32M-NEXT: mul a3, a3, s0
+; RV32M-NEXT: srli a3, a3, 24
+; RV32M-NEXT: addi t1, a3, 32
+; RV32M-NEXT: j .LBB1_45
+; RV32M-NEXT: .LBB1_44:
+; RV32M-NEXT: srli a3, s7, 1
+; RV32M-NEXT: or a3, s7, a3
+; RV32M-NEXT: srli a4, a3, 2
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: srli a4, a3, 4
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: srli a4, a3, 8
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: srli a4, a3, 16
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: not a3, a3
+; RV32M-NEXT: srli a4, a3, 1
+; RV32M-NEXT: and a4, a4, s3
+; RV32M-NEXT: sub a3, a3, a4
+; RV32M-NEXT: and a4, a3, s2
+; RV32M-NEXT: srli a3, a3, 2
+; RV32M-NEXT: and a3, a3, s2
+; RV32M-NEXT: add a3, a4, a3
+; RV32M-NEXT: srli a4, a3, 4
+; RV32M-NEXT: add a3, a3, a4
+; RV32M-NEXT: and a3, a3, s1
+; RV32M-NEXT: mul a3, a3, s0
+; RV32M-NEXT: srli t1, a3, 24
+; RV32M-NEXT: .LBB1_45: # %udiv-end1
+; RV32M-NEXT: or t0, t0, t3
+; RV32M-NEXT: or t3, t4, t5
+; RV32M-NEXT: and a7, a7, t2
+; RV32M-NEXT: and a2, a2, s4
+; RV32M-NEXT: bnez t6, .LBB1_47
+; RV32M-NEXT: # %bb.46: # %udiv-end1
+; RV32M-NEXT: mv t1, a0
+; RV32M-NEXT: .LBB1_47: # %udiv-end1
+; RV32M-NEXT: seqz a0, t0
+; RV32M-NEXT: seqz t0, t3
+; RV32M-NEXT: sltu t3, a1, t1
+; RV32M-NEXT: sub t4, a7, a2
+; RV32M-NEXT: mv t2, t3
+; RV32M-NEXT: beq a7, a2, .LBB1_49
+; RV32M-NEXT: # %bb.48: # %udiv-end1
+; RV32M-NEXT: sltu t2, a7, a2
+; RV32M-NEXT: .LBB1_49: # %udiv-end1
+; RV32M-NEXT: sub t6, t4, t3
+; RV32M-NEXT: or a2, a0, t0
+; RV32M-NEXT: neg a0, t2
+; RV32M-NEXT: seqz s2, t2
+; RV32M-NEXT: addi s2, s2, -1
+; RV32M-NEXT: or a7, a0, s2
+; RV32M-NEXT: sub t1, a1, t1
+; RV32M-NEXT: beqz a7, .LBB1_51
+; RV32M-NEXT: # %bb.50: # %udiv-end1
+; RV32M-NEXT: snez a1, a7
+; RV32M-NEXT: j .LBB1_52
+; RV32M-NEXT: .LBB1_51:
+; RV32M-NEXT: snez a1, t6
+; RV32M-NEXT: sltiu a3, t1, 128
+; RV32M-NEXT: xori a3, a3, 1
+; RV32M-NEXT: or a1, a3, a1
+; RV32M-NEXT: .LBB1_52: # %udiv-end1
+; RV32M-NEXT: or a3, a2, a1
+; RV32M-NEXT: addi a4, a3, -1
+; RV32M-NEXT: and a7, a4, s7
+; RV32M-NEXT: and a2, a4, s6
+; RV32M-NEXT: and a1, a4, s8
+; RV32M-NEXT: and t0, a4, s9
+; RV32M-NEXT: sw a5, 16(sp) # 4-byte Folded Spill
+; RV32M-NEXT: bnez a3, .LBB1_64
+; RV32M-NEXT: # %bb.53: # %udiv-end1
+; RV32M-NEXT: xori a3, t1, 127
+; RV32M-NEXT: or a3, a3, a0
+; RV32M-NEXT: or a4, t6, s2
+; RV32M-NEXT: or a3, a3, a4
+; RV32M-NEXT: beqz a3, .LBB1_64
+; RV32M-NEXT: # %bb.54: # %udiv-bb1
+; RV32M-NEXT: sw a6, 56(sp) # 4-byte Folded Spill
+; RV32M-NEXT: addi s0, t1, 1
+; RV32M-NEXT: sub a1, s5, t1
+; RV32M-NEXT: sw zero, 104(sp)
+; RV32M-NEXT: sw zero, 108(sp)
+; RV32M-NEXT: sw zero, 112(sp)
+; RV32M-NEXT: sw zero, 116(sp)
+; RV32M-NEXT: sw s9, 120(sp)
+; RV32M-NEXT: sw s8, 124(sp)
+; RV32M-NEXT: sw s6, 128(sp)
+; RV32M-NEXT: sw s7, 132(sp)
+; RV32M-NEXT: addi a2, sp, 120
+; RV32M-NEXT: seqz a3, s0
+; RV32M-NEXT: srli a4, a1, 3
+; RV32M-NEXT: andi a5, a1, 31
+; RV32M-NEXT: add t6, t6, a3
+; RV32M-NEXT: andi a4, a4, 12
+; RV32M-NEXT: xori a3, a5, 31
+; RV32M-NEXT: or a5, s0, t6
+; RV32M-NEXT: sub a2, a2, a4
+; RV32M-NEXT: seqz s4, a5
+; RV32M-NEXT: lw a4, 0(a2)
+; RV32M-NEXT: lw a5, 4(a2)
+; RV32M-NEXT: lw a6, 8(a2)
+; RV32M-NEXT: lw a2, 12(a2)
+; RV32M-NEXT: add s4, a0, s4
+; RV32M-NEXT: sltu a0, s4, a0
+; RV32M-NEXT: or a7, s0, s4
+; RV32M-NEXT: add s2, s2, a0
+; RV32M-NEXT: or a0, t6, s2
+; RV32M-NEXT: srli t0, a6, 1
+; RV32M-NEXT: srli t1, a5, 1
+; RV32M-NEXT: or a0, a7, a0
+; RV32M-NEXT: srli a7, a4, 1
+; RV32M-NEXT: srl t0, t0, a3
+; RV32M-NEXT: srl t1, t1, a3
+; RV32M-NEXT: srl a3, a7, a3
+; RV32M-NEXT: sll a2, a2, a1
+; RV32M-NEXT: mv a7, s7
+; RV32M-NEXT: or s7, a2, t0
+; RV32M-NEXT: sll a2, a6, a1
+; RV32M-NEXT: sll a5, a5, a1
+; RV32M-NEXT: or s5, a2, t1
+; RV32M-NEXT: mv a6, s6
+; RV32M-NEXT: or s6, a5, a3
+; RV32M-NEXT: sll s1, a4, a1
+; RV32M-NEXT: beqz a0, .LBB1_62
+; RV32M-NEXT: # %bb.55: # %udiv-preheader
+; RV32M-NEXT: mv a1, s8
+; RV32M-NEXT: mv a2, s9
+; RV32M-NEXT: li s3, 0
+; RV32M-NEXT: li s8, 0
+; RV32M-NEXT: li s9, 0
+; RV32M-NEXT: li s10, 0
+; RV32M-NEXT: sw zero, 88(sp)
+; RV32M-NEXT: sw zero, 92(sp)
+; RV32M-NEXT: sw zero, 96(sp)
+; RV32M-NEXT: sw zero, 100(sp)
+; RV32M-NEXT: sw a2, 72(sp)
+; RV32M-NEXT: sw a1, 76(sp)
+; RV32M-NEXT: sw a6, 80(sp)
+; RV32M-NEXT: sw a7, 84(sp)
+; RV32M-NEXT: srli a0, s0, 3
+; RV32M-NEXT: addi a1, sp, 72
+; RV32M-NEXT: andi a0, a0, 12
+; RV32M-NEXT: add a0, a1, a0
+; RV32M-NEXT: lw a1, 4(a0)
+; RV32M-NEXT: lw a2, 8(a0)
+; RV32M-NEXT: lw a3, 12(a0)
+; RV32M-NEXT: lw a4, 0(a0)
+; RV32M-NEXT: andi a0, s0, 31
+; RV32M-NEXT: xori a0, a0, 31
+; RV32M-NEXT: slli a5, a3, 1
+; RV32M-NEXT: slli a6, a2, 1
+; RV32M-NEXT: slli a7, a1, 1
+; RV32M-NEXT: sll a5, a5, a0
+; RV32M-NEXT: sll a6, a6, a0
+; RV32M-NEXT: sll a7, a7, a0
+; RV32M-NEXT: lw t1, 56(sp) # 4-byte Folded Reload
+; RV32M-NEXT: seqz t0, t1
+; RV32M-NEXT: srl a0, a2, s0
+; RV32M-NEXT: or a0, a0, a5
+; RV32M-NEXT: or a2, t1, s11
+; RV32M-NEXT: sub s11, s11, t0
+; RV32M-NEXT: seqz a2, a2
+; RV32M-NEXT: srl a1, a1, s0
+; RV32M-NEXT: or t3, a1, a6
+; RV32M-NEXT: mv a6, t1
+; RV32M-NEXT: mv a1, ra
+; RV32M-NEXT: sub ra, ra, a2
+; RV32M-NEXT: sltu a1, a1, a2
+; RV32M-NEXT: lw a2, 68(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sub t2, a2, a1
+; RV32M-NEXT: srl a1, a4, s0
+; RV32M-NEXT: srl t5, a3, s0
+; RV32M-NEXT: or t0, a1, a7
+; RV32M-NEXT: addi a1, t1, -1
+; RV32M-NEXT: sw a1, 52(sp) # 4-byte Folded Spill
+; RV32M-NEXT: j .LBB1_57
+; RV32M-NEXT: .LBB1_56: # %udiv-do-while
+; RV32M-NEXT: # in Loop: Header=BB1_57 Depth=1
+; RV32M-NEXT: srli a3, s5, 31
+; RV32M-NEXT: slli s7, s7, 1
+; RV32M-NEXT: sub a1, a7, a1
+; RV32M-NEXT: srli a4, s6, 31
+; RV32M-NEXT: slli s5, s5, 1
+; RV32M-NEXT: or a3, s7, a3
+; RV32M-NEXT: srli a5, s1, 31
+; RV32M-NEXT: slli s6, s6, 1
+; RV32M-NEXT: slli s1, s1, 1
+; RV32M-NEXT: or a4, s5, a4
+; RV32M-NEXT: lw a6, 68(sp) # 4-byte Folded Reload
+; RV32M-NEXT: and a7, t3, a6
+; RV32M-NEXT: or a5, s6, a5
+; RV32M-NEXT: lw a6, 64(sp) # 4-byte Folded Reload
+; RV32M-NEXT: and s5, t3, a6
+; RV32M-NEXT: or s1, s3, s1
+; RV32M-NEXT: sub a6, t1, s5
+; RV32M-NEXT: sltu t1, t1, s5
+; RV32M-NEXT: or s5, s0, t6
+; RV32M-NEXT: sub a7, a0, a7
+; RV32M-NEXT: seqz a0, s0
+; RV32M-NEXT: addi s0, s0, -1
+; RV32M-NEXT: andi s3, t3, 1
+; RV32M-NEXT: sub t3, a1, a2
+; RV32M-NEXT: seqz a1, s5
+; RV32M-NEXT: sub t6, t6, a0
+; RV32M-NEXT: or s6, s8, a5
+; RV32M-NEXT: or s5, s9, a4
+; RV32M-NEXT: or s7, s10, a3
+; RV32M-NEXT: sub a0, a6, t5
+; RV32M-NEXT: sltu a2, a6, t5
+; RV32M-NEXT: sub a3, a7, t1
+; RV32M-NEXT: sltu a4, s4, a1
+; RV32M-NEXT: sub s4, s4, a1
+; RV32M-NEXT: sub t5, a3, a2
+; RV32M-NEXT: sub s2, s2, a4
+; RV32M-NEXT: or a1, t6, s2
+; RV32M-NEXT: or a2, s0, s4
+; RV32M-NEXT: or a1, a2, a1
+; RV32M-NEXT: sub t0, t4, t0
+; RV32M-NEXT: li s8, 0
+; RV32M-NEXT: li s9, 0
+; RV32M-NEXT: li s10, 0
+; RV32M-NEXT: lw a6, 56(sp) # 4-byte Folded Reload
+; RV32M-NEXT: beqz a1, .LBB1_63
+; RV32M-NEXT: .LBB1_57: # %udiv-do-while
+; RV32M-NEXT: # =>This Inner Loop Header: Depth=1
+; RV32M-NEXT: srli a1, t0, 31
+; RV32M-NEXT: slli a2, t3, 1
+; RV32M-NEXT: slli t0, t0, 1
+; RV32M-NEXT: or a7, a2, a1
+; RV32M-NEXT: srli a1, s7, 31
+; RV32M-NEXT: or t4, t0, a1
+; RV32M-NEXT: beq s11, a7, .LBB1_59
+; RV32M-NEXT: # %bb.58: # %udiv-do-while
+; RV32M-NEXT: # in Loop: Header=BB1_57 Depth=1
+; RV32M-NEXT: sltu a1, s11, a7
+; RV32M-NEXT: j .LBB1_60
+; RV32M-NEXT: .LBB1_59: # in Loop: Header=BB1_57 Depth=1
+; RV32M-NEXT: lw a1, 52(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sltu a1, a1, t4
+; RV32M-NEXT: .LBB1_60: # %udiv-do-while
+; RV32M-NEXT: # in Loop: Header=BB1_57 Depth=1
+; RV32M-NEXT: srli a2, a0, 31
+; RV32M-NEXT: slli t5, t5, 1
+; RV32M-NEXT: srli a3, t3, 31
+; RV32M-NEXT: slli a4, a0, 1
+; RV32M-NEXT: or a0, t5, a2
+; RV32M-NEXT: or t1, a4, a3
+; RV32M-NEXT: sub a2, ra, t1
+; RV32M-NEXT: sltu a3, ra, t1
+; RV32M-NEXT: sub a4, t2, a0
+; RV32M-NEXT: sltu a1, a2, a1
+; RV32M-NEXT: sub a4, a4, a3
+; RV32M-NEXT: sub a4, a4, a1
+; RV32M-NEXT: srai t3, a4, 31
+; RV32M-NEXT: and t0, t3, a6
+; RV32M-NEXT: lw a1, 60(sp) # 4-byte Folded Reload
+; RV32M-NEXT: and a1, t3, a1
+; RV32M-NEXT: sltu a2, t4, t0
+; RV32M-NEXT: mv t5, a2
+; RV32M-NEXT: beq a7, a1, .LBB1_56
+; RV32M-NEXT: # %bb.61: # %udiv-do-while
+; RV32M-NEXT: # in Loop: Header=BB1_57 Depth=1
+; RV32M-NEXT: sltu t5, a7, a1
+; RV32M-NEXT: j .LBB1_56
+; RV32M-NEXT: .LBB1_62:
+; RV32M-NEXT: li s3, 0
+; RV32M-NEXT: lw a6, 56(sp) # 4-byte Folded Reload
+; RV32M-NEXT: .LBB1_63: # %udiv-loop-exit
+; RV32M-NEXT: srli a0, s1, 31
+; RV32M-NEXT: slli a1, s6, 1
+; RV32M-NEXT: srli a2, s6, 31
+; RV32M-NEXT: or a1, a1, a0
+; RV32M-NEXT: slli a0, s5, 1
+; RV32M-NEXT: srli a3, s5, 31
+; RV32M-NEXT: slli s7, s7, 1
+; RV32M-NEXT: slli s1, s1, 1
+; RV32M-NEXT: or a2, a0, a2
+; RV32M-NEXT: or a7, s7, a3
+; RV32M-NEXT: or t0, s3, s1
+; RV32M-NEXT: lw ra, 64(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s11, 60(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s8, 48(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s9, 44(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s6, 40(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s7, 36(sp) # 4-byte Folded Reload
+; RV32M-NEXT: .LBB1_64: # %udiv-end
+; RV32M-NEXT: mulhu a3, a6, t0
+; RV32M-NEXT: mul a4, s11, t0
+; RV32M-NEXT: mulhu a5, s11, t0
+; RV32M-NEXT: mv a0, a6
+; RV32M-NEXT: mul a6, a6, a1
+; RV32M-NEXT: mulhu t1, a0, a1
+; RV32M-NEXT: mul t2, s11, a1
+; RV32M-NEXT: mul t3, t0, ra
+; RV32M-NEXT: mul t4, a2, a0
+; RV32M-NEXT: mulhu t5, s11, a1
+; RV32M-NEXT: mul t6, a2, s11
+; RV32M-NEXT: mulhu a2, a2, a0
+; RV32M-NEXT: mul a7, a7, a0
+; RV32M-NEXT: mul s0, a1, ra
+; RV32M-NEXT: mulhu a1, t0, ra
+; RV32M-NEXT: lw s1, 68(sp) # 4-byte Folded Reload
+; RV32M-NEXT: mul s1, t0, s1
+; RV32M-NEXT: mul a0, a0, t0
+; RV32M-NEXT: add a3, a4, a3
+; RV32M-NEXT: add t3, t4, t3
+; RV32M-NEXT: add a2, a2, t6
+; RV32M-NEXT: add s1, a1, s1
+; RV32M-NEXT: sltu a4, a3, a4
+; RV32M-NEXT: add a1, a6, a3
+; RV32M-NEXT: add a2, a2, a7
+; RV32M-NEXT: add s0, s1, s0
+; RV32M-NEXT: sltu a3, t3, t4
+; RV32M-NEXT: add a4, a5, a4
+; RV32M-NEXT: sltu a5, a1, a6
+; RV32M-NEXT: add a2, a2, s0
+; RV32M-NEXT: add a5, t1, a5
+; RV32M-NEXT: add a2, a2, a3
+; RV32M-NEXT: add a5, a4, a5
+; RV32M-NEXT: add a3, t2, a5
+; RV32M-NEXT: sltu a5, a5, a4
+; RV32M-NEXT: add a4, a3, t3
+; RV32M-NEXT: sltu a6, a3, t2
+; RV32M-NEXT: add a5, t5, a5
+; RV32M-NEXT: sltu a3, a4, a3
+; RV32M-NEXT: add a5, a5, a6
+; RV32M-NEXT: sltu a6, s6, a4
+; RV32M-NEXT: add a2, a5, a2
+; RV32M-NEXT: sub a3, s7, a3
+; RV32M-NEXT: sub a2, a3, a2
+; RV32M-NEXT: sltu a3, s9, a0
+; RV32M-NEXT: sub a2, a2, a6
+; RV32M-NEXT: mv a5, a3
+; RV32M-NEXT: beq s8, a1, .LBB1_66
+; RV32M-NEXT: # %bb.65: # %udiv-end
+; RV32M-NEXT: sltu a5, s8, a1
+; RV32M-NEXT: .LBB1_66: # %udiv-end
+; RV32M-NEXT: sub a4, s6, a4
+; RV32M-NEXT: sub a1, s8, a1
+; RV32M-NEXT: sub a0, s9, a0
+; RV32M-NEXT: lw a6, 28(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw a7, 12(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sw a7, 0(a6)
+; RV32M-NEXT: lw a7, 24(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sw a7, 4(a6)
+; RV32M-NEXT: lw a7, 16(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sw a7, 8(a6)
+; RV32M-NEXT: lw a7, 20(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sw a7, 12(a6)
+; RV32M-NEXT: sltu a6, a4, a5
+; RV32M-NEXT: sub a4, a4, a5
+; RV32M-NEXT: sub a1, a1, a3
+; RV32M-NEXT: sub a2, a2, a6
+; RV32M-NEXT: lw a3, 32(sp) # 4-byte Folded Reload
+; RV32M-NEXT: sw a0, 0(a3)
+; RV32M-NEXT: sw a1, 4(a3)
+; RV32M-NEXT: sw a4, 8(a3)
+; RV32M-NEXT: sw a2, 12(a3)
+; RV32M-NEXT: lw ra, 252(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s0, 248(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s1, 244(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s2, 240(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s3, 236(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s4, 232(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s5, 228(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s6, 224(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s7, 220(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s8, 216(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s9, 212(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s10, 208(sp) # 4-byte Folded Reload
+; RV32M-NEXT: lw s11, 204(sp) # 4-byte Folded Reload
+; RV32M-NEXT: .cfi_restore ra
+; RV32M-NEXT: .cfi_restore s0
+; RV32M-NEXT: .cfi_restore s1
+; RV32M-NEXT: .cfi_restore s2
+; RV32M-NEXT: .cfi_restore s3
+; RV32M-NEXT: .cfi_restore s4
+; RV32M-NEXT: .cfi_restore s5
+; RV32M-NEXT: .cfi_restore s6
+; RV32M-NEXT: .cfi_restore s7
+; RV32M-NEXT: .cfi_restore s8
+; RV32M-NEXT: .cfi_restore s9
+; RV32M-NEXT: .cfi_restore s10
+; RV32M-NEXT: .cfi_restore s11
+; RV32M-NEXT: addi sp, sp, 256
+; RV32M-NEXT: .cfi_def_cfa_offset 0
+; RV32M-NEXT: ret
+ %q = udiv i128 %n, %d
+ %r = urem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
diff --git a/llvm/test/CodeGen/RISCV/i128-divrem-libcall-rv64.ll b/llvm/test/CodeGen/RISCV/i128-divrem-libcall-rv64.ll
new file mode 100644
index 0000000000000..f50a71ac17527
--- /dev/null
+++ b/llvm/test/CodeGen/RISCV/i128-divrem-libcall-rv64.ll
@@ -0,0 +1,149 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=riscv64-linux-gnu | FileCheck %s --check-prefix=RV64
+; RUN: llc < %s -mtriple=riscv64-linux-gnu -mattr=+m | FileCheck %s --check-prefix=RV64
+
+define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; RV64-LABEL: sdivrem_i128:
+; RV64: # %bb.0:
+; RV64-NEXT: addi sp, sp, -80
+; RV64-NEXT: .cfi_def_cfa_offset 80
+; RV64-NEXT: sd ra, 72(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s0, 64(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s1, 56(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s2, 48(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s3, 40(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s4, 32(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s5, 24(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s6, 16(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s7, 8(sp) # 8-byte Folded Spill
+; RV64-NEXT: .cfi_offset ra, -8
+; RV64-NEXT: .cfi_offset s0, -16
+; RV64-NEXT: .cfi_offset s1, -24
+; RV64-NEXT: .cfi_offset s2, -32
+; RV64-NEXT: .cfi_offset s3, -40
+; RV64-NEXT: .cfi_offset s4, -48
+; RV64-NEXT: .cfi_offset s5, -56
+; RV64-NEXT: .cfi_offset s6, -64
+; RV64-NEXT: .cfi_offset s7, -72
+; RV64-NEXT: mv s0, a5
+; RV64-NEXT: mv s1, a4
+; RV64-NEXT: mv s2, a3
+; RV64-NEXT: mv s3, a2
+; RV64-NEXT: mv s4, a1
+; RV64-NEXT: mv s5, a0
+; RV64-NEXT: mv a0, a2
+; RV64-NEXT: mv a1, a3
+; RV64-NEXT: mv a2, a4
+; RV64-NEXT: mv a3, a5
+; RV64-NEXT: call __divti3
+; RV64-NEXT: mv s6, a0
+; RV64-NEXT: mv s7, a1
+; RV64-NEXT: mv a0, s3
+; RV64-NEXT: mv a1, s2
+; RV64-NEXT: mv a2, s1
+; RV64-NEXT: mv a3, s0
+; RV64-NEXT: call __modti3
+; RV64-NEXT: sd s6, 0(s5)
+; RV64-NEXT: sd s7, 8(s5)
+; RV64-NEXT: sd a0, 0(s4)
+; RV64-NEXT: sd a1, 8(s4)
+; RV64-NEXT: ld ra, 72(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s0, 64(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s1, 56(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s2, 48(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s3, 40(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s4, 32(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s5, 24(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s6, 16(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s7, 8(sp) # 8-byte Folded Reload
+; RV64-NEXT: .cfi_restore ra
+; RV64-NEXT: .cfi_restore s0
+; RV64-NEXT: .cfi_restore s1
+; RV64-NEXT: .cfi_restore s2
+; RV64-NEXT: .cfi_restore s3
+; RV64-NEXT: .cfi_restore s4
+; RV64-NEXT: .cfi_restore s5
+; RV64-NEXT: .cfi_restore s6
+; RV64-NEXT: .cfi_restore s7
+; RV64-NEXT: addi sp, sp, 80
+; RV64-NEXT: .cfi_def_cfa_offset 0
+; RV64-NEXT: ret
+ %q = sdiv i128 %n, %d
+ %r = srem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
+
+define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; RV64-LABEL: udivrem_i128:
+; RV64: # %bb.0:
+; RV64-NEXT: addi sp, sp, -80
+; RV64-NEXT: .cfi_def_cfa_offset 80
+; RV64-NEXT: sd ra, 72(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s0, 64(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s1, 56(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s2, 48(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s3, 40(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s4, 32(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s5, 24(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s6, 16(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s7, 8(sp) # 8-byte Folded Spill
+; RV64-NEXT: .cfi_offset ra, -8
+; RV64-NEXT: .cfi_offset s0, -16
+; RV64-NEXT: .cfi_offset s1, -24
+; RV64-NEXT: .cfi_offset s2, -32
+; RV64-NEXT: .cfi_offset s3, -40
+; RV64-NEXT: .cfi_offset s4, -48
+; RV64-NEXT: .cfi_offset s5, -56
+; RV64-NEXT: .cfi_offset s6, -64
+; RV64-NEXT: .cfi_offset s7, -72
+; RV64-NEXT: mv s0, a5
+; RV64-NEXT: mv s1, a4
+; RV64-NEXT: mv s2, a3
+; RV64-NEXT: mv s3, a2
+; RV64-NEXT: mv s4, a1
+; RV64-NEXT: mv s5, a0
+; RV64-NEXT: mv a0, a2
+; RV64-NEXT: mv a1, a3
+; RV64-NEXT: mv a2, a4
+; RV64-NEXT: mv a3, a5
+; RV64-NEXT: call __udivti3
+; RV64-NEXT: mv s6, a0
+; RV64-NEXT: mv s7, a1
+; RV64-NEXT: mv a0, s3
+; RV64-NEXT: mv a1, s2
+; RV64-NEXT: mv a2, s1
+; RV64-NEXT: mv a3, s0
+; RV64-NEXT: call __umodti3
+; RV64-NEXT: sd s6, 0(s5)
+; RV64-NEXT: sd s7, 8(s5)
+; RV64-NEXT: sd a0, 0(s4)
+; RV64-NEXT: sd a1, 8(s4)
+; RV64-NEXT: ld ra, 72(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s0, 64(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s1, 56(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s2, 48(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s3, 40(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s4, 32(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s5, 24(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s6, 16(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s7, 8(sp) # 8-byte Folded Reload
+; RV64-NEXT: .cfi_restore ra
+; RV64-NEXT: .cfi_restore s0
+; RV64-NEXT: .cfi_restore s1
+; RV64-NEXT: .cfi_restore s2
+; RV64-NEXT: .cfi_restore s3
+; RV64-NEXT: .cfi_restore s4
+; RV64-NEXT: .cfi_restore s5
+; RV64-NEXT: .cfi_restore s6
+; RV64-NEXT: .cfi_restore s7
+; RV64-NEXT: addi sp, sp, 80
+; RV64-NEXT: .cfi_def_cfa_offset 0
+; RV64-NEXT: ret
+ %q = udiv i128 %n, %d
+ %r = urem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
diff --git a/llvm/test/CodeGen/SPARC/i128-divrem-libcall.ll b/llvm/test/CodeGen/SPARC/i128-divrem-libcall.ll
new file mode 100644
index 0000000000000..9e7c240cd4388
--- /dev/null
+++ b/llvm/test/CodeGen/SPARC/i128-divrem-libcall.ll
@@ -0,0 +1,68 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=sparcv9-linux-gnu | FileCheck %s
+
+define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; CHECK-LABEL: sdivrem_i128:
+; CHECK: .cfi_startproc
+; CHECK-NEXT: ! %bb.0:
+; CHECK-NEXT: save %sp, -176, %sp
+; CHECK-NEXT: .cfi_def_cfa_register %fp
+; CHECK-NEXT: .cfi_window_save
+; CHECK-NEXT: .cfi_register %o7, %i7
+; CHECK-NEXT: mov %i2, %o0
+; CHECK-NEXT: mov %i3, %o1
+; CHECK-NEXT: mov %i4, %o2
+; CHECK-NEXT: call __divti3
+; CHECK-NEXT: mov %i5, %o3
+; CHECK-NEXT: mov %o0, %l0
+; CHECK-NEXT: mov %o1, %l1
+; CHECK-NEXT: mov %i2, %o0
+; CHECK-NEXT: mov %i3, %o1
+; CHECK-NEXT: mov %i4, %o2
+; CHECK-NEXT: call __modti3
+; CHECK-NEXT: mov %i5, %o3
+; CHECK-NEXT: stx %l0, [%i0]
+; CHECK-NEXT: stx %l1, [%i0+8]
+; CHECK-NEXT: stx %o0, [%i1]
+; CHECK-NEXT: stx %o1, [%i1+8]
+; CHECK-NEXT: ret
+; CHECK-NEXT: restore
+ %q = sdiv i128 %n, %d
+ %r = srem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
+
+define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; CHECK-LABEL: udivrem_i128:
+; CHECK: .cfi_startproc
+; CHECK-NEXT: ! %bb.0:
+; CHECK-NEXT: save %sp, -176, %sp
+; CHECK-NEXT: .cfi_def_cfa_register %fp
+; CHECK-NEXT: .cfi_window_save
+; CHECK-NEXT: .cfi_register %o7, %i7
+; CHECK-NEXT: mov %i2, %o0
+; CHECK-NEXT: mov %i3, %o1
+; CHECK-NEXT: mov %i4, %o2
+; CHECK-NEXT: call __udivti3
+; CHECK-NEXT: mov %i5, %o3
+; CHECK-NEXT: mov %o0, %l0
+; CHECK-NEXT: mov %o1, %l1
+; CHECK-NEXT: mov %i2, %o0
+; CHECK-NEXT: mov %i3, %o1
+; CHECK-NEXT: mov %i4, %o2
+; CHECK-NEXT: call __umodti3
+; CHECK-NEXT: mov %i5, %o3
+; CHECK-NEXT: stx %l0, [%i0]
+; CHECK-NEXT: stx %l1, [%i0+8]
+; CHECK-NEXT: stx %o0, [%i1]
+; CHECK-NEXT: stx %o1, [%i1+8]
+; CHECK-NEXT: ret
+; CHECK-NEXT: restore
+ %q = udiv i128 %n, %d
+ %r = urem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
diff --git a/llvm/test/CodeGen/SystemZ/i128-divrem-libcall.ll b/llvm/test/CodeGen/SystemZ/i128-divrem-libcall.ll
new file mode 100644
index 0000000000000..3355d62de579b
--- /dev/null
+++ b/llvm/test/CodeGen/SystemZ/i128-divrem-libcall.ll
@@ -0,0 +1,114 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=s390x-unknown-linux | FileCheck %s
+
+; SystemZ (s390x) lowers i128 div/rem pairs through fused libcalls.
+
+define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; CHECK-LABEL: sdivrem_i128:
+; CHECK: # %bb.0:
+; CHECK-NEXT: stmg %r6, %r15, 48(%r15)
+; CHECK-NEXT: .cfi_offset %r6, -112
+; CHECK-NEXT: .cfi_offset %r7, -104
+; CHECK-NEXT: .cfi_offset %r8, -96
+; CHECK-NEXT: .cfi_offset %r9, -88
+; CHECK-NEXT: .cfi_offset %r10, -80
+; CHECK-NEXT: .cfi_offset %r11, -72
+; CHECK-NEXT: .cfi_offset %r12, -64
+; CHECK-NEXT: .cfi_offset %r13, -56
+; CHECK-NEXT: .cfi_offset %r14, -48
+; CHECK-NEXT: .cfi_offset %r15, -40
+; CHECK-NEXT: aghi %r15, -256
+; CHECK-NEXT: .cfi_def_cfa_offset 416
+; CHECK-NEXT: lgr %r13, %r3
+; CHECK-NEXT: lgr %r12, %r2
+; CHECK-NEXT: lg %r11, 8(%r5)
+; CHECK-NEXT: lg %r10, 0(%r5)
+; CHECK-NEXT: lg %r9, 8(%r4)
+; CHECK-NEXT: lg %r8, 0(%r4)
+; CHECK-NEXT: stg %r11, 168(%r15)
+; CHECK-NEXT: stg %r10, 160(%r15)
+; CHECK-NEXT: stg %r9, 184(%r15)
+; CHECK-NEXT: la %r2, 192(%r15)
+; CHECK-NEXT: la %r3, 176(%r15)
+; CHECK-NEXT: la %r4, 160(%r15)
+; CHECK-NEXT: stg %r8, 176(%r15)
+; CHECK-NEXT: brasl %r14, __divti3 at PLT
+; CHECK-NEXT: lg %r7, 192(%r15)
+; CHECK-NEXT: lg %r6, 200(%r15)
+; CHECK-NEXT: stg %r11, 216(%r15)
+; CHECK-NEXT: stg %r10, 208(%r15)
+; CHECK-NEXT: stg %r9, 232(%r15)
+; CHECK-NEXT: la %r2, 240(%r15)
+; CHECK-NEXT: la %r3, 224(%r15)
+; CHECK-NEXT: la %r4, 208(%r15)
+; CHECK-NEXT: stg %r8, 224(%r15)
+; CHECK-NEXT: brasl %r14, __modti3 at PLT
+; CHECK-NEXT: lg %r0, 248(%r15)
+; CHECK-NEXT: lg %r1, 240(%r15)
+; CHECK-NEXT: stg %r6, 8(%r12)
+; CHECK-NEXT: stg %r7, 0(%r12)
+; CHECK-NEXT: stg %r0, 8(%r13)
+; CHECK-NEXT: stg %r1, 0(%r13)
+; CHECK-NEXT: lmg %r6, %r15, 304(%r15)
+; CHECK-NEXT: br %r14
+ %q = sdiv i128 %n, %d
+ %r = srem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
+
+define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; CHECK-LABEL: udivrem_i128:
+; CHECK: # %bb.0:
+; CHECK-NEXT: stmg %r6, %r15, 48(%r15)
+; CHECK-NEXT: .cfi_offset %r6, -112
+; CHECK-NEXT: .cfi_offset %r7, -104
+; CHECK-NEXT: .cfi_offset %r8, -96
+; CHECK-NEXT: .cfi_offset %r9, -88
+; CHECK-NEXT: .cfi_offset %r10, -80
+; CHECK-NEXT: .cfi_offset %r11, -72
+; CHECK-NEXT: .cfi_offset %r12, -64
+; CHECK-NEXT: .cfi_offset %r13, -56
+; CHECK-NEXT: .cfi_offset %r14, -48
+; CHECK-NEXT: .cfi_offset %r15, -40
+; CHECK-NEXT: aghi %r15, -256
+; CHECK-NEXT: .cfi_def_cfa_offset 416
+; CHECK-NEXT: lgr %r13, %r3
+; CHECK-NEXT: lgr %r12, %r2
+; CHECK-NEXT: lg %r11, 8(%r5)
+; CHECK-NEXT: lg %r10, 0(%r5)
+; CHECK-NEXT: lg %r9, 8(%r4)
+; CHECK-NEXT: lg %r8, 0(%r4)
+; CHECK-NEXT: stg %r11, 168(%r15)
+; CHECK-NEXT: stg %r10, 160(%r15)
+; CHECK-NEXT: stg %r9, 184(%r15)
+; CHECK-NEXT: la %r2, 192(%r15)
+; CHECK-NEXT: la %r3, 176(%r15)
+; CHECK-NEXT: la %r4, 160(%r15)
+; CHECK-NEXT: stg %r8, 176(%r15)
+; CHECK-NEXT: brasl %r14, __udivti3 at PLT
+; CHECK-NEXT: lg %r7, 192(%r15)
+; CHECK-NEXT: lg %r6, 200(%r15)
+; CHECK-NEXT: stg %r11, 216(%r15)
+; CHECK-NEXT: stg %r10, 208(%r15)
+; CHECK-NEXT: stg %r9, 232(%r15)
+; CHECK-NEXT: la %r2, 240(%r15)
+; CHECK-NEXT: la %r3, 224(%r15)
+; CHECK-NEXT: la %r4, 208(%r15)
+; CHECK-NEXT: stg %r8, 224(%r15)
+; CHECK-NEXT: brasl %r14, __umodti3 at PLT
+; CHECK-NEXT: lg %r0, 248(%r15)
+; CHECK-NEXT: lg %r1, 240(%r15)
+; CHECK-NEXT: stg %r6, 8(%r12)
+; CHECK-NEXT: stg %r7, 0(%r12)
+; CHECK-NEXT: stg %r0, 8(%r13)
+; CHECK-NEXT: stg %r1, 0(%r13)
+; CHECK-NEXT: lmg %r6, %r15, 304(%r15)
+; CHECK-NEXT: br %r14
+ %q = udiv i128 %n, %d
+ %r = urem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
diff --git a/llvm/test/CodeGen/WebAssembly/i128-divrem-libcall.ll b/llvm/test/CodeGen/WebAssembly/i128-divrem-libcall.ll
new file mode 100644
index 0000000000000..e04191dd1d17e
--- /dev/null
+++ b/llvm/test/CodeGen/WebAssembly/i128-divrem-libcall.ll
@@ -0,0 +1,197 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=wasm32-unknown-unknown | FileCheck %s --check-prefix=WASM32
+; RUN: llc < %s -mtriple=wasm64-unknown-unknown | FileCheck %s --check-prefix=WASM64
+
+define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; WASM32-LABEL: sdivrem_i128:
+; WASM32: .functype sdivrem_i128 (i32, i32, i64, i64, i64, i64) -> ()
+; WASM32-NEXT: .local i32
+; WASM32-NEXT: # %bb.0:
+; WASM32-NEXT: global.get __stack_pointer
+; WASM32-NEXT: i32.const 32
+; WASM32-NEXT: i32.sub
+; WASM32-NEXT: local.tee 6
+; WASM32-NEXT: global.set __stack_pointer
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: i32.const 16
+; WASM32-NEXT: i32.add
+; WASM32-NEXT: local.get 2
+; WASM32-NEXT: local.get 3
+; WASM32-NEXT: local.get 4
+; WASM32-NEXT: local.get 5
+; WASM32-NEXT: call __divti3
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: local.get 2
+; WASM32-NEXT: local.get 3
+; WASM32-NEXT: local.get 4
+; WASM32-NEXT: local.get 5
+; WASM32-NEXT: call __modti3
+; WASM32-NEXT: local.get 0
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: i64.load 16
+; WASM32-NEXT: i64.store 0
+; WASM32-NEXT: local.get 0
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: i64.load 24
+; WASM32-NEXT: i64.store 8
+; WASM32-NEXT: local.get 1
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: i64.load 0
+; WASM32-NEXT: i64.store 0
+; WASM32-NEXT: local.get 1
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: i64.load 8
+; WASM32-NEXT: i64.store 8
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: i32.const 32
+; WASM32-NEXT: i32.add
+; WASM32-NEXT: global.set __stack_pointer
+; WASM32-NEXT: # fallthrough-return
+;
+; WASM64-LABEL: sdivrem_i128:
+; WASM64: .functype sdivrem_i128 (i64, i64, i64, i64, i64, i64) -> ()
+; WASM64-NEXT: .local i64
+; WASM64-NEXT: # %bb.0:
+; WASM64-NEXT: global.get __stack_pointer
+; WASM64-NEXT: i64.const 32
+; WASM64-NEXT: i64.sub
+; WASM64-NEXT: local.tee 6
+; WASM64-NEXT: global.set __stack_pointer
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: i64.const 16
+; WASM64-NEXT: i64.add
+; WASM64-NEXT: local.get 2
+; WASM64-NEXT: local.get 3
+; WASM64-NEXT: local.get 4
+; WASM64-NEXT: local.get 5
+; WASM64-NEXT: call __divti3
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: local.get 2
+; WASM64-NEXT: local.get 3
+; WASM64-NEXT: local.get 4
+; WASM64-NEXT: local.get 5
+; WASM64-NEXT: call __modti3
+; WASM64-NEXT: local.get 0
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: i64.load 16
+; WASM64-NEXT: i64.store 0
+; WASM64-NEXT: local.get 0
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: i64.load 24
+; WASM64-NEXT: i64.store 8
+; WASM64-NEXT: local.get 1
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: i64.load 0
+; WASM64-NEXT: i64.store 0
+; WASM64-NEXT: local.get 1
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: i64.load 8
+; WASM64-NEXT: i64.store 8
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: i64.const 32
+; WASM64-NEXT: i64.add
+; WASM64-NEXT: global.set __stack_pointer
+; WASM64-NEXT: # fallthrough-return
+ %q = sdiv i128 %n, %d
+ %r = srem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
+
+define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; WASM32-LABEL: udivrem_i128:
+; WASM32: .functype udivrem_i128 (i32, i32, i64, i64, i64, i64) -> ()
+; WASM32-NEXT: .local i32
+; WASM32-NEXT: # %bb.0:
+; WASM32-NEXT: global.get __stack_pointer
+; WASM32-NEXT: i32.const 32
+; WASM32-NEXT: i32.sub
+; WASM32-NEXT: local.tee 6
+; WASM32-NEXT: global.set __stack_pointer
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: i32.const 16
+; WASM32-NEXT: i32.add
+; WASM32-NEXT: local.get 2
+; WASM32-NEXT: local.get 3
+; WASM32-NEXT: local.get 4
+; WASM32-NEXT: local.get 5
+; WASM32-NEXT: call __udivti3
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: local.get 2
+; WASM32-NEXT: local.get 3
+; WASM32-NEXT: local.get 4
+; WASM32-NEXT: local.get 5
+; WASM32-NEXT: call __umodti3
+; WASM32-NEXT: local.get 0
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: i64.load 16
+; WASM32-NEXT: i64.store 0
+; WASM32-NEXT: local.get 0
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: i64.load 24
+; WASM32-NEXT: i64.store 8
+; WASM32-NEXT: local.get 1
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: i64.load 0
+; WASM32-NEXT: i64.store 0
+; WASM32-NEXT: local.get 1
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: i64.load 8
+; WASM32-NEXT: i64.store 8
+; WASM32-NEXT: local.get 6
+; WASM32-NEXT: i32.const 32
+; WASM32-NEXT: i32.add
+; WASM32-NEXT: global.set __stack_pointer
+; WASM32-NEXT: # fallthrough-return
+;
+; WASM64-LABEL: udivrem_i128:
+; WASM64: .functype udivrem_i128 (i64, i64, i64, i64, i64, i64) -> ()
+; WASM64-NEXT: .local i64
+; WASM64-NEXT: # %bb.0:
+; WASM64-NEXT: global.get __stack_pointer
+; WASM64-NEXT: i64.const 32
+; WASM64-NEXT: i64.sub
+; WASM64-NEXT: local.tee 6
+; WASM64-NEXT: global.set __stack_pointer
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: i64.const 16
+; WASM64-NEXT: i64.add
+; WASM64-NEXT: local.get 2
+; WASM64-NEXT: local.get 3
+; WASM64-NEXT: local.get 4
+; WASM64-NEXT: local.get 5
+; WASM64-NEXT: call __udivti3
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: local.get 2
+; WASM64-NEXT: local.get 3
+; WASM64-NEXT: local.get 4
+; WASM64-NEXT: local.get 5
+; WASM64-NEXT: call __umodti3
+; WASM64-NEXT: local.get 0
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: i64.load 16
+; WASM64-NEXT: i64.store 0
+; WASM64-NEXT: local.get 0
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: i64.load 24
+; WASM64-NEXT: i64.store 8
+; WASM64-NEXT: local.get 1
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: i64.load 0
+; WASM64-NEXT: i64.store 0
+; WASM64-NEXT: local.get 1
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: i64.load 8
+; WASM64-NEXT: i64.store 8
+; WASM64-NEXT: local.get 6
+; WASM64-NEXT: i64.const 32
+; WASM64-NEXT: i64.add
+; WASM64-NEXT: global.set __stack_pointer
+; WASM64-NEXT: # fallthrough-return
+ %q = udiv i128 %n, %d
+ %r = urem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
diff --git a/llvm/test/CodeGen/X86/i128-divrem-libcall-x86-32.ll b/llvm/test/CodeGen/X86/i128-divrem-libcall-x86-32.ll
new file mode 100644
index 0000000000000..4b1e1a352a979
--- /dev/null
+++ b/llvm/test/CodeGen/X86/i128-divrem-libcall-x86-32.ll
@@ -0,0 +1,3079 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=i386-linux-gnu | FileCheck %s --check-prefix=LINUX-X86
+; RUN: llc < %s -mtriple=i686-linux-gnu | FileCheck %s --check-prefix=LINUX-X86
+; RUN: llc < %s -mtriple=i686-pc-windows-msvc | FileCheck %s --check-prefix=WIN32
+
+; The 32-bit X86 triples inline-expand i128 div/rem, so keep the checks
+; focused on the absence of libcalls.
+
+define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; LINUX-X86-LABEL: sdivrem_i128:
+; LINUX-X86: # %bb.0: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: pushl %ebp
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 8
+; LINUX-X86-NEXT: pushl %ebx
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 12
+; LINUX-X86-NEXT: pushl %edi
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 16
+; LINUX-X86-NEXT: pushl %esi
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 20
+; LINUX-X86-NEXT: subl $284, %esp # imm = 0x11C
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 304
+; LINUX-X86-NEXT: .cfi_offset %esi, -20
+; LINUX-X86-NEXT: .cfi_offset %edi, -16
+; LINUX-X86-NEXT: .cfi_offset %ebx, -12
+; LINUX-X86-NEXT: .cfi_offset %ebp, -8
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
+; LINUX-X86-NEXT: movl %ebp, %esi
+; LINUX-X86-NEXT: sarl $31, %esi
+; LINUX-X86-NEXT: xorl %esi, %ebp
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; LINUX-X86-NEXT: xorl %esi, %edx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: xorl %esi, %eax
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: xorl %esi, %ecx
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: subl %esi, %ecx
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: sbbl %esi, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: sbbl %esi, %edx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: sbbl %esi, %ebp
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; LINUX-X86-NEXT: movl %ebx, %edx
+; LINUX-X86-NEXT: sarl $31, %edx
+; LINUX-X86-NEXT: xorl %edx, %ebx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; LINUX-X86-NEXT: xorl %edx, %edi
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: xorl %edx, %eax
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: xorl %edx, %ecx
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: subl %edx, %ecx
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: sbbl %edx, %eax
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: sbbl %edx, %edi
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: sbbl %edx, %ebx
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: orl %ebx, %eax
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: orl %edi, %ecx
+; LINUX-X86-NEXT: orl %eax, %ecx
+; LINUX-X86-NEXT: sete {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: orl %ebp, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: orl %eax, %edx
+; LINUX-X86-NEXT: orl %ecx, %edx
+; LINUX-X86-NEXT: sete %cl
+; LINUX-X86-NEXT: testl %ebx, %ebx
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: jne .LBB0_1
+; LINUX-X86-NEXT: # %bb.2: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: bsrl %edi, %ebp
+; LINUX-X86-NEXT: xorl $31, %ebp
+; LINUX-X86-NEXT: orl $32, %ebp
+; LINUX-X86-NEXT: jmp .LBB0_3
+; LINUX-X86-NEXT: .LBB0_1:
+; LINUX-X86-NEXT: bsrl %ebx, %ebp
+; LINUX-X86-NEXT: xorl $31, %ebp
+; LINUX-X86-NEXT: .LBB0_3: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: testl %edx, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: jne .LBB0_4
+; LINUX-X86-NEXT: # %bb.5: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: bsrl %esi, %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: orl $32, %edx
+; LINUX-X86-NEXT: jmp .LBB0_6
+; LINUX-X86-NEXT: .LBB0_4:
+; LINUX-X86-NEXT: bsrl %edx, %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: .LBB0_6: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; LINUX-X86-NEXT: jne .LBB0_8
+; LINUX-X86-NEXT: # %bb.7: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: orl $64, %edx
+; LINUX-X86-NEXT: movl %edx, %ebp
+; LINUX-X86-NEXT: .LBB0_8: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: testl %ebx, %ebx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: jne .LBB0_9
+; LINUX-X86-NEXT: # %bb.10: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: bsrl %eax, %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: orl $32, %edx
+; LINUX-X86-NEXT: testl %esi, %esi
+; LINUX-X86-NEXT: je .LBB0_13
+; LINUX-X86-NEXT: .LBB0_12:
+; LINUX-X86-NEXT: bsrl %esi, %esi
+; LINUX-X86-NEXT: xorl $31, %esi
+; LINUX-X86-NEXT: jmp .LBB0_14
+; LINUX-X86-NEXT: .LBB0_9:
+; LINUX-X86-NEXT: bsrl %ebx, %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: testl %esi, %esi
+; LINUX-X86-NEXT: jne .LBB0_12
+; LINUX-X86-NEXT: .LBB0_13: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: bsrl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; LINUX-X86-NEXT: xorl $31, %esi
+; LINUX-X86-NEXT: orl $32, %esi
+; LINUX-X86-NEXT: .LBB0_14: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: orb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; LINUX-X86-NEXT: orl %ebx, %eax
+; LINUX-X86-NEXT: jne .LBB0_16
+; LINUX-X86-NEXT: # %bb.15: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: orl $64, %esi
+; LINUX-X86-NEXT: movl %esi, %edx
+; LINUX-X86-NEXT: .LBB0_16: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: xorl %ebx, %ebx
+; LINUX-X86-NEXT: movl %ebp, %ecx
+; LINUX-X86-NEXT: subl %edx, %ecx
+; LINUX-X86-NEXT: movl $0, %edx
+; LINUX-X86-NEXT: sbbl %edx, %edx
+; LINUX-X86-NEXT: movl $0, %esi
+; LINUX-X86-NEXT: sbbl %esi, %esi
+; LINUX-X86-NEXT: movl $0, %edi
+; LINUX-X86-NEXT: sbbl %edi, %edi
+; LINUX-X86-NEXT: cmpb $0, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Reload
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: jne .LBB0_17
+; LINUX-X86-NEXT: # %bb.18: # %select.false.sink
+; LINUX-X86-NEXT: movl $127, %eax
+; LINUX-X86-NEXT: cmpl %ecx, %eax
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: sbbl %edx, %eax
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: sbbl %esi, %eax
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: sbbl %edi, %eax
+; LINUX-X86-NEXT: setb %al
+; LINUX-X86-NEXT: .LBB0_19: # %select.end
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: testb %al, %al
+; LINUX-X86-NEXT: movl $0, %edx
+; LINUX-X86-NEXT: movl $0, %ebp
+; LINUX-X86-NEXT: movl $0, %esi
+; LINUX-X86-NEXT: jne .LBB0_21
+; LINUX-X86-NEXT: # %bb.20: # %select.end
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: movl %edi, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: .LBB0_21: # %select.end
+; LINUX-X86-NEXT: movl %edx, %edi
+; LINUX-X86-NEXT: jne .LBB0_22
+; LINUX-X86-NEXT: # %bb.29: # %select.end
+; LINUX-X86-NEXT: movl %ecx, %eax
+; LINUX-X86-NEXT: xorl $127, %eax
+; LINUX-X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl %ecx, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; LINUX-X86-NEXT: orl %eax, %ecx
+; LINUX-X86-NEXT: movl %edi, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: je .LBB0_30
+; LINUX-X86-NEXT: # %bb.27: # %udiv-bb15
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: xorb $127, %cl
+; LINUX-X86-NEXT: movl %ecx, %eax
+; LINUX-X86-NEXT: shrb $3, %al
+; LINUX-X86-NEXT: andb $12, %al
+; LINUX-X86-NEXT: negb %al
+; LINUX-X86-NEXT: movsbl %al, %eax
+; LINUX-X86-NEXT: movl 264(%esp,%eax), %edi
+; LINUX-X86-NEXT: movl 268(%esp,%eax), %esi
+; LINUX-X86-NEXT: shldl %cl, %edi, %esi
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl 256(%esp,%eax), %ebp
+; LINUX-X86-NEXT: movl 260(%esp,%eax), %ebx
+; LINUX-X86-NEXT: shldl %cl, %ebx, %edi
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shldl %cl, %ebp, %ebx
+; LINUX-X86-NEXT: shll %cl, %ebp
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: addl $1, %edx
+; LINUX-X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: jb .LBB0_28
+; LINUX-X86-NEXT: # %bb.24: # %udiv-preheader4
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %ecx, %eax
+; LINUX-X86-NEXT: shrb $3, %al
+; LINUX-X86-NEXT: andb $12, %al
+; LINUX-X86-NEXT: movzbl %al, %eax
+; LINUX-X86-NEXT: movl 220(%esp,%eax), %ebp
+; LINUX-X86-NEXT: movl 216(%esp,%eax), %edx
+; LINUX-X86-NEXT: movl %edx, %esi
+; LINUX-X86-NEXT: shrdl %cl, %ebp, %esi
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl 208(%esp,%eax), %edi
+; LINUX-X86-NEXT: movl 212(%esp,%eax), %esi
+; LINUX-X86-NEXT: movl %esi, %eax
+; LINUX-X86-NEXT: shrdl %cl, %edx, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shrl %cl, %ebp
+; LINUX-X86-NEXT: movl %ebp, %edx
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: # kill: def $cl killed $cl killed $ecx
+; LINUX-X86-NEXT: shrdl %cl, %esi, %edi
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: addl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: adcl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: adcl $-1, %ecx
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: adcl $-1, %ecx
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: .p2align 4
+; LINUX-X86-NEXT: .LBB0_25: # %udiv-do-while3
+; LINUX-X86-NEXT: # =>This Inner Loop Header: Depth=1
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %ebp, %edx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %edi, %ebp
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %esi, %edi
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %edx, %esi
+; LINUX-X86-NEXT: shldl $1, %ecx, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: orl %eax, %edx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shldl $1, %ebx, %ecx
+; LINUX-X86-NEXT: orl %eax, %ecx
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %ecx, %ebx
+; LINUX-X86-NEXT: orl %eax, %ebx
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: addl %ecx, %ecx
+; LINUX-X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: cmpl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %edi, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ebp, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; LINUX-X86-NEXT: sarl $31, %edx
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: andl $1, %ecx
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl %edx, %ebx
+; LINUX-X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl %edx, %eax
+; LINUX-X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; LINUX-X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; LINUX-X86-NEXT: subl %edx, %esi
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: sbbl %eax, %edi
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ebx, %ebp
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ecx, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: addl $-1, %ecx
+; LINUX-X86-NEXT: adcl $-1, %ebp
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: adcl $-1, %esi
+; LINUX-X86-NEXT: adcl $-1, %edi
+; LINUX-X86-NEXT: movl %ebp, %eax
+; LINUX-X86-NEXT: orl %edi, %eax
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: orl %esi, %ecx
+; LINUX-X86-NEXT: orl %eax, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: jne .LBB0_25
+; LINUX-X86-NEXT: .LBB0_26: # %udiv-loop-exit2
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %ecx, %esi
+; LINUX-X86-NEXT: shldl $1, %ebx, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %eax, %ebx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: leal (%edx,%eax,2), %eax
+; LINUX-X86-NEXT: movl %ecx, %ebp
+; LINUX-X86-NEXT: .LBB0_23: # %udiv-end1
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: .LBB0_30: # %udiv-end1
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: xorl %edx, %esi
+; LINUX-X86-NEXT: xorl %edx, %ebp
+; LINUX-X86-NEXT: xorl %edx, %ebx
+; LINUX-X86-NEXT: xorl %edx, %eax
+; LINUX-X86-NEXT: subl %edx, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: sbbl %edx, %ebx
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: sbbl %edx, %ebp
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: sbbl %edx, %esi
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: subl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %eax, %edx
+; LINUX-X86-NEXT: sbbl %eax, %ecx
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %eax, %ebx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: subl %ecx, %edi
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ecx, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ecx, %ebp
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ecx, %esi
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: orl %esi, %eax
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: orl %ebp, %edi
+; LINUX-X86-NEXT: orl %eax, %edi
+; LINUX-X86-NEXT: sete %al
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: orl %ebx, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; LINUX-X86-NEXT: orl %ecx, %edx
+; LINUX-X86-NEXT: sete %cl
+; LINUX-X86-NEXT: testl %esi, %esi
+; LINUX-X86-NEXT: movl %ebx, %edi
+; LINUX-X86-NEXT: jne .LBB0_31
+; LINUX-X86-NEXT: # %bb.32: # %udiv-end1
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: bsrl %ebx, %ebp
+; LINUX-X86-NEXT: xorl $31, %ebp
+; LINUX-X86-NEXT: orl $32, %ebp
+; LINUX-X86-NEXT: jmp .LBB0_33
+; LINUX-X86-NEXT: .LBB0_31:
+; LINUX-X86-NEXT: bsrl %esi, %ebp
+; LINUX-X86-NEXT: xorl $31, %ebp
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: .LBB0_33: # %udiv-end1
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: testl %edx, %edx
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: jne .LBB0_34
+; LINUX-X86-NEXT: # %bb.35: # %udiv-end1
+; LINUX-X86-NEXT: bsrl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: orl $32, %edx
+; LINUX-X86-NEXT: jmp .LBB0_36
+; LINUX-X86-NEXT: .LBB0_34:
+; LINUX-X86-NEXT: bsrl %edx, %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: .LBB0_36: # %udiv-end1
+; LINUX-X86-NEXT: movl %ebx, %esi
+; LINUX-X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; LINUX-X86-NEXT: jne .LBB0_38
+; LINUX-X86-NEXT: # %bb.37: # %udiv-end1
+; LINUX-X86-NEXT: orl $64, %edx
+; LINUX-X86-NEXT: movl %edx, %ebp
+; LINUX-X86-NEXT: .LBB0_38: # %udiv-end1
+; LINUX-X86-NEXT: testl %edi, %edi
+; LINUX-X86-NEXT: jne .LBB0_39
+; LINUX-X86-NEXT: # %bb.40: # %udiv-end1
+; LINUX-X86-NEXT: bsrl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: orl $32, %edx
+; LINUX-X86-NEXT: jmp .LBB0_41
+; LINUX-X86-NEXT: .LBB0_39:
+; LINUX-X86-NEXT: bsrl %edi, %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: .LBB0_41: # %udiv-end1
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: testl %esi, %esi
+; LINUX-X86-NEXT: jne .LBB0_42
+; LINUX-X86-NEXT: # %bb.43: # %udiv-end1
+; LINUX-X86-NEXT: bsrl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; LINUX-X86-NEXT: xorl $31, %esi
+; LINUX-X86-NEXT: orl $32, %esi
+; LINUX-X86-NEXT: jmp .LBB0_44
+; LINUX-X86-NEXT: .LBB0_42:
+; LINUX-X86-NEXT: bsrl %esi, %esi
+; LINUX-X86-NEXT: xorl $31, %esi
+; LINUX-X86-NEXT: .LBB0_44: # %udiv-end1
+; LINUX-X86-NEXT: orb %cl, %al
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: orl %edi, %ecx
+; LINUX-X86-NEXT: jne .LBB0_46
+; LINUX-X86-NEXT: # %bb.45: # %udiv-end1
+; LINUX-X86-NEXT: orl $64, %esi
+; LINUX-X86-NEXT: movl %esi, %edx
+; LINUX-X86-NEXT: .LBB0_46: # %udiv-end1
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl %ebp, %ebx
+; LINUX-X86-NEXT: subl %edx, %ebx
+; LINUX-X86-NEXT: movl $0, %esi
+; LINUX-X86-NEXT: sbbl %esi, %esi
+; LINUX-X86-NEXT: movl $0, %ecx
+; LINUX-X86-NEXT: sbbl %ecx, %ecx
+; LINUX-X86-NEXT: movl $0, %edi
+; LINUX-X86-NEXT: sbbl %edi, %edi
+; LINUX-X86-NEXT: testb %al, %al
+; LINUX-X86-NEXT: jne .LBB0_47
+; LINUX-X86-NEXT: # %bb.48: # %select.false.sink8
+; LINUX-X86-NEXT: movl $127, %eax
+; LINUX-X86-NEXT: cmpl %ebx, %eax
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: sbbl %esi, %eax
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: sbbl %ecx, %eax
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: sbbl %edi, %eax
+; LINUX-X86-NEXT: setb %al
+; LINUX-X86-NEXT: .LBB0_49: # %select.end7
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: testb %al, %al
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: jne .LBB0_51
+; LINUX-X86-NEXT: # %bb.50: # %select.end7
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: .LBB0_51: # %select.end7
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: jne .LBB0_52
+; LINUX-X86-NEXT: # %bb.58: # %select.end7
+; LINUX-X86-NEXT: movl %ebx, %eax
+; LINUX-X86-NEXT: xorl $127, %eax
+; LINUX-X86-NEXT: orl %ecx, %eax
+; LINUX-X86-NEXT: movl %esi, %ebp
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %esi, %ecx
+; LINUX-X86-NEXT: orl %edi, %ecx
+; LINUX-X86-NEXT: orl %eax, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: je .LBB0_59
+; LINUX-X86-NEXT: # %bb.56: # %udiv-bb1
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %ebx, %ecx
+; LINUX-X86-NEXT: xorb $127, %cl
+; LINUX-X86-NEXT: movl %ecx, %eax
+; LINUX-X86-NEXT: shrb $3, %al
+; LINUX-X86-NEXT: andb $12, %al
+; LINUX-X86-NEXT: negb %al
+; LINUX-X86-NEXT: movsbl %al, %eax
+; LINUX-X86-NEXT: movl 200(%esp,%eax), %edx
+; LINUX-X86-NEXT: movl 204(%esp,%eax), %esi
+; LINUX-X86-NEXT: shldl %cl, %edx, %esi
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl 192(%esp,%eax), %esi
+; LINUX-X86-NEXT: movl 196(%esp,%eax), %eax
+; LINUX-X86-NEXT: shldl %cl, %eax, %edx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shldl %cl, %esi, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shll %cl, %esi
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: addl $1, %ebx
+; LINUX-X86-NEXT: adcl $0, %ebp
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: adcl $0, %edi
+; LINUX-X86-NEXT: jb .LBB0_57
+; LINUX-X86-NEXT: # %bb.53: # %udiv-preheader
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %ebx, %eax
+; LINUX-X86-NEXT: shrb $3, %al
+; LINUX-X86-NEXT: andb $12, %al
+; LINUX-X86-NEXT: movzbl %al, %eax
+; LINUX-X86-NEXT: movl 156(%esp,%eax), %edx
+; LINUX-X86-NEXT: movl 152(%esp,%eax), %esi
+; LINUX-X86-NEXT: movl %esi, %ebp
+; LINUX-X86-NEXT: movl %ebx, %ecx
+; LINUX-X86-NEXT: shrdl %cl, %edx, %ebp
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl 144(%esp,%eax), %ebp
+; LINUX-X86-NEXT: movl 148(%esp,%eax), %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shrdl %cl, %esi, %eax
+; LINUX-X86-NEXT: movl %eax, %esi
+; LINUX-X86-NEXT: shrl %cl, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: shrdl %cl, %eax, %ebp
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: addl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: adcl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: adcl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: adcl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: .p2align 4
+; LINUX-X86-NEXT: .LBB0_54: # %udiv-do-while
+; LINUX-X86-NEXT: # =>This Inner Loop Header: Depth=1
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %ebp, %edx
+; LINUX-X86-NEXT: movl %edx, %ebx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %esi, %ecx
+; LINUX-X86-NEXT: shldl $1, %esi, %ebp
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %esi, %ecx
+; LINUX-X86-NEXT: shldl $1, %eax, %esi
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %edx, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: orl %edi, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %eax, %edx
+; LINUX-X86-NEXT: orl %edi, %edx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %edx, %eax
+; LINUX-X86-NEXT: orl %edi, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: addl %edx, %edx
+; LINUX-X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: cmpl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ecx, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ebp, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ebx, %eax
+; LINUX-X86-NEXT: sarl $31, %eax
+; LINUX-X86-NEXT: movl %eax, %edx
+; LINUX-X86-NEXT: andl $1, %edx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl %eax, %ebx
+; LINUX-X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl %eax, %edi
+; LINUX-X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl %eax, %edx
+; LINUX-X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; LINUX-X86-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; LINUX-X86-NEXT: subl %eax, %esi
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: sbbl %edx, %ecx
+; LINUX-X86-NEXT: movl %ecx, %esi
+; LINUX-X86-NEXT: sbbl %edi, %ebp
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ebx, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: addl $-1, %ebx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: adcl $-1, %eax
+; LINUX-X86-NEXT: adcl $-1, %ebp
+; LINUX-X86-NEXT: adcl $-1, %edi
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: orl %edi, %eax
+; LINUX-X86-NEXT: movl %ebx, %ecx
+; LINUX-X86-NEXT: orl %ebp, %ecx
+; LINUX-X86-NEXT: orl %eax, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: jne .LBB0_54
+; LINUX-X86-NEXT: .LBB0_55: # %udiv-loop-exit
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %edx, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %esi, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %eax, %esi
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: leal (%ecx,%eax,2), %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: .LBB0_59: # %udiv-end
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: movl %eax, (%ecx)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, 4(%ecx)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, 8(%ecx)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, 12(%ecx)
+; LINUX-X86-NEXT: movl %edx, %esi
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: imull %eax, %esi
+; LINUX-X86-NEXT: movl %edx, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: mull %ebp
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: addl %esi, %edx
+; LINUX-X86-NEXT: imull %ebp, %ecx
+; LINUX-X86-NEXT: addl %edx, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: movl %edi, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: mull %ebx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: imull %edi, %esi
+; LINUX-X86-NEXT: addl %edx, %esi
+; LINUX-X86-NEXT: imull {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
+; LINUX-X86-NEXT: addl %esi, %ebx
+; LINUX-X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: adcl %ecx, %ebx
+; LINUX-X86-NEXT: movl %ebp, %eax
+; LINUX-X86-NEXT: mull %edi
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: mull %edi
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: movl %eax, %esi
+; LINUX-X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; LINUX-X86-NEXT: adcl $0, %ecx
+; LINUX-X86-NEXT: movl %ebp, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: mull %ebp
+; LINUX-X86-NEXT: movl %edx, %edi
+; LINUX-X86-NEXT: addl %esi, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: adcl %ecx, %edi
+; LINUX-X86-NEXT: setb %cl
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: mull %ebp
+; LINUX-X86-NEXT: addl %edi, %eax
+; LINUX-X86-NEXT: movzbl %cl, %ecx
+; LINUX-X86-NEXT: adcl %ecx, %edx
+; LINUX-X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; LINUX-X86-NEXT: adcl %ebx, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: subl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %eax, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %edx, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: xorl %edx, %eax
+; LINUX-X86-NEXT: xorl %edx, %ecx
+; LINUX-X86-NEXT: xorl %edx, %esi
+; LINUX-X86-NEXT: xorl %edx, %edi
+; LINUX-X86-NEXT: subl %edx, %edi
+; LINUX-X86-NEXT: sbbl %edx, %esi
+; LINUX-X86-NEXT: sbbl %edx, %ecx
+; LINUX-X86-NEXT: sbbl %edx, %eax
+; LINUX-X86-NEXT: movl %eax, %edx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: movl %edi, (%eax)
+; LINUX-X86-NEXT: movl %esi, 4(%eax)
+; LINUX-X86-NEXT: movl %ecx, 8(%eax)
+; LINUX-X86-NEXT: movl %edx, 12(%eax)
+; LINUX-X86-NEXT: addl $284, %esp # imm = 0x11C
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 20
+; LINUX-X86-NEXT: popl %esi
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 16
+; LINUX-X86-NEXT: popl %edi
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 12
+; LINUX-X86-NEXT: popl %ebx
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 8
+; LINUX-X86-NEXT: popl %ebp
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 4
+; LINUX-X86-NEXT: retl
+; LINUX-X86-NEXT: .LBB0_17:
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 304
+; LINUX-X86-NEXT: movb $1, %al
+; LINUX-X86-NEXT: jmp .LBB0_19
+; LINUX-X86-NEXT: .LBB0_28:
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: jmp .LBB0_26
+; LINUX-X86-NEXT: .LBB0_47:
+; LINUX-X86-NEXT: movb $1, %al
+; LINUX-X86-NEXT: jmp .LBB0_49
+; LINUX-X86-NEXT: .LBB0_57:
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: jmp .LBB0_55
+; LINUX-X86-NEXT: .LBB0_22:
+; LINUX-X86-NEXT: movl %edi, %eax
+; LINUX-X86-NEXT: jmp .LBB0_23
+; LINUX-X86-NEXT: .LBB0_52:
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: jmp .LBB0_59
+;
+; WIN32-LABEL: sdivrem_i128:
+; WIN32: # %bb.0: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: pushl %ebp
+; WIN32-NEXT: movl %esp, %ebp
+; WIN32-NEXT: pushl %ebx
+; WIN32-NEXT: pushl %edi
+; WIN32-NEXT: pushl %esi
+; WIN32-NEXT: andl $-16, %esp
+; WIN32-NEXT: subl $288, %esp # imm = 0x120
+; WIN32-NEXT: movl 36(%ebp), %edi
+; WIN32-NEXT: movl %edi, %esi
+; WIN32-NEXT: sarl $31, %esi
+; WIN32-NEXT: xorl %esi, %edi
+; WIN32-NEXT: movl 32(%ebp), %eax
+; WIN32-NEXT: xorl %esi, %eax
+; WIN32-NEXT: movl 28(%ebp), %ecx
+; WIN32-NEXT: xorl %esi, %ecx
+; WIN32-NEXT: movl 24(%ebp), %edx
+; WIN32-NEXT: xorl %esi, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: subl %esi, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %esi, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %esi, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %esi, %edi
+; WIN32-NEXT: movl 52(%ebp), %ebx
+; WIN32-NEXT: movl %ebx, %edx
+; WIN32-NEXT: sarl $31, %edx
+; WIN32-NEXT: xorl %edx, %ebx
+; WIN32-NEXT: movl 48(%ebp), %esi
+; WIN32-NEXT: xorl %edx, %esi
+; WIN32-NEXT: movl 44(%ebp), %eax
+; WIN32-NEXT: xorl %edx, %eax
+; WIN32-NEXT: movl 40(%ebp), %ecx
+; WIN32-NEXT: xorl %edx, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: subl %edx, %ecx
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %edx, %eax
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %edx, %esi
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %edx, %ebx
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: orl %ebx, %eax
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: orl %esi, %ecx
+; WIN32-NEXT: orl %eax, %ecx
+; WIN32-NEXT: sete %al
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: orl %edi, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; WIN32-NEXT: orl %ecx, %edx
+; WIN32-NEXT: sete %cl
+; WIN32-NEXT: testl %ebx, %ebx
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: jne LBB0_1
+; WIN32-NEXT: # %bb.2: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: bsrl %esi, %edi
+; WIN32-NEXT: xorl $31, %edi
+; WIN32-NEXT: orl $32, %edi
+; WIN32-NEXT: jmp LBB0_3
+; WIN32-NEXT: LBB0_1:
+; WIN32-NEXT: bsrl %ebx, %edi
+; WIN32-NEXT: xorl $31, %edi
+; WIN32-NEXT: LBB0_3: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: testl %edx, %edx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: jne LBB0_4
+; WIN32-NEXT: # %bb.5: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: bsrl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: orl $32, %edx
+; WIN32-NEXT: jmp LBB0_6
+; WIN32-NEXT: LBB0_4:
+; WIN32-NEXT: bsrl %edx, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: LBB0_6: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; WIN32-NEXT: jne LBB0_8
+; WIN32-NEXT: # %bb.7: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: orl $64, %edx
+; WIN32-NEXT: movl %edx, %edi
+; WIN32-NEXT: LBB0_8: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: testl %edx, %edx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: jne LBB0_9
+; WIN32-NEXT: # %bb.10: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: bsrl %ebx, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: orl $32, %edx
+; WIN32-NEXT: testl %esi, %esi
+; WIN32-NEXT: je LBB0_13
+; WIN32-NEXT: LBB0_12:
+; WIN32-NEXT: bsrl %esi, %esi
+; WIN32-NEXT: xorl $31, %esi
+; WIN32-NEXT: jmp LBB0_14
+; WIN32-NEXT: LBB0_9:
+; WIN32-NEXT: bsrl %edx, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: testl %esi, %esi
+; WIN32-NEXT: jne LBB0_12
+; WIN32-NEXT: LBB0_13: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: bsrl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; WIN32-NEXT: xorl $31, %esi
+; WIN32-NEXT: orl $32, %esi
+; WIN32-NEXT: LBB0_14: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: orb %cl, %al
+; WIN32-NEXT: movl %ebx, %ecx
+; WIN32-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: jne LBB0_16
+; WIN32-NEXT: # %bb.15: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: orl $64, %esi
+; WIN32-NEXT: movl %esi, %edx
+; WIN32-NEXT: LBB0_16: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: xorl %ebx, %ebx
+; WIN32-NEXT: subl %edx, %edi
+; WIN32-NEXT: movl $0, %ecx
+; WIN32-NEXT: sbbl %ecx, %ecx
+; WIN32-NEXT: movl $0, %edx
+; WIN32-NEXT: sbbl %edx, %edx
+; WIN32-NEXT: movl $0, %esi
+; WIN32-NEXT: sbbl %esi, %esi
+; WIN32-NEXT: testb %al, %al
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: jne LBB0_17
+; WIN32-NEXT: # %bb.18: # %select.false.sink
+; WIN32-NEXT: movl $127, %eax
+; WIN32-NEXT: cmpl %edi, %eax
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: sbbl %ecx, %eax
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: sbbl %edx, %eax
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: sbbl %esi, %eax
+; WIN32-NEXT: setb %al
+; WIN32-NEXT: LBB0_19: # %select.end
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: xorl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: testb %al, %al
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: movl $0, %edx
+; WIN32-NEXT: movl $0, %ecx
+; WIN32-NEXT: jne LBB0_21
+; WIN32-NEXT: # %bb.20: # %select.end
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: LBB0_21: # %select.end
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: jne LBB0_22
+; WIN32-NEXT: # %bb.28: # %select.end
+; WIN32-NEXT: movl %edi, %eax
+; WIN32-NEXT: xorl $127, %eax
+; WIN32-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; WIN32-NEXT: movl %edi, %esi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: orl %eax, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: je LBB0_29
+; WIN32-NEXT: # %bb.26: # %udiv-bb15
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %esi, %eax
+; WIN32-NEXT: movl %eax, %ecx
+; WIN32-NEXT: movl %esi, %edi
+; WIN32-NEXT: xorb $127, %cl
+; WIN32-NEXT: movl %ecx, %eax
+; WIN32-NEXT: shrb $3, %al
+; WIN32-NEXT: andb $12, %al
+; WIN32-NEXT: negb %al
+; WIN32-NEXT: movsbl %al, %eax
+; WIN32-NEXT: movl 264(%esp,%eax), %esi
+; WIN32-NEXT: movl 268(%esp,%eax), %edx
+; WIN32-NEXT: shldl %cl, %esi, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 256(%esp,%eax), %edx
+; WIN32-NEXT: movl 260(%esp,%eax), %ebx
+; WIN32-NEXT: shldl %cl, %ebx, %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shldl %cl, %edx, %ebx
+; WIN32-NEXT: shll %cl, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: addl $1, %edi
+; WIN32-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: jb LBB0_27
+; WIN32-NEXT: # %bb.23: # %udiv-preheader4
+; WIN32-NEXT: movl %edi, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %ecx, %eax
+; WIN32-NEXT: shrb $3, %al
+; WIN32-NEXT: andb $12, %al
+; WIN32-NEXT: movzbl %al, %eax
+; WIN32-NEXT: movl 220(%esp,%eax), %edi
+; WIN32-NEXT: movl 216(%esp,%eax), %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shrdl %cl, %edi, %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 208(%esp,%eax), %edx
+; WIN32-NEXT: movl 212(%esp,%eax), %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: shrdl %cl, %esi, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shrl %cl, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: # kill: def $cl killed $cl killed $ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: shrdl %cl, %eax, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: addl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: .p2align 4
+; WIN32-NEXT: LBB0_24: # %udiv-do-while3
+; WIN32-NEXT: # =>This Inner Loop Header: Depth=1
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: shldl $1, %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: shldl $1, %esi, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: shldl $1, %eax, %esi
+; WIN32-NEXT: shldl $1, %ecx, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: shldl $1, %edi, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: orl %edx, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shldl $1, %ebx, %edi
+; WIN32-NEXT: orl %edx, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: shldl $1, %ecx, %ebx
+; WIN32-NEXT: orl %edx, %ebx
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: addl %ecx, %ecx
+; WIN32-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: cmpl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: sbbl %esi, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: sbbl %edx, %ecx
+; WIN32-NEXT: sarl $31, %ecx
+; WIN32-NEXT: movl %ecx, %edi
+; WIN32-NEXT: andl $1, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ecx, %edi
+; WIN32-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ecx, %edi
+; WIN32-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; WIN32-NEXT: movl %ecx, %ebx
+; WIN32-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
+; WIN32-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: subl %ecx, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %ebx, %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: sbbl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl %edx, %eax
+; WIN32-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: addl $-1, %edx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %edi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %eax
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: orl %eax, %ecx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: orl %edi, %edx
+; WIN32-NEXT: orl %ecx, %edx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: jne LBB0_24
+; WIN32-NEXT: LBB0_25: # %udiv-loop-exit2
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: shldl $1, %edx, %ecx
+; WIN32-NEXT: shldl $1, %ebx, %edx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: shldl $1, %esi, %ebx
+; WIN32-NEXT: movl %ecx, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: leal (%ecx,%esi,2), %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: LBB0_29: # %udiv-end1
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: xorl %esi, %eax
+; WIN32-NEXT: xorl %esi, %edx
+; WIN32-NEXT: xorl %esi, %ebx
+; WIN32-NEXT: xorl %esi, %ecx
+; WIN32-NEXT: subl %esi, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %esi, %ebx
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %esi, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %esi, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: subl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: sbbl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: sbbl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: sbbl %ecx, %edi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: subl %ecx, %esi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: sbbl %ecx, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: sbbl %ecx, %edx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: sbbl %ecx, %ebx
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: orl %ebx, %eax
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: orl %edx, %esi
+; WIN32-NEXT: orl %eax, %esi
+; WIN32-NEXT: sete {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl %edi, %eax
+; WIN32-NEXT: orl %edi, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; WIN32-NEXT: orl %ecx, %edx
+; WIN32-NEXT: sete %cl
+; WIN32-NEXT: testl %ebx, %ebx
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: jne LBB0_30
+; WIN32-NEXT: # %bb.31: # %udiv-end1
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: bsrl %edi, %ebx
+; WIN32-NEXT: xorl $31, %ebx
+; WIN32-NEXT: orl $32, %ebx
+; WIN32-NEXT: jmp LBB0_32
+; WIN32-NEXT: LBB0_30:
+; WIN32-NEXT: bsrl %ebx, %ebx
+; WIN32-NEXT: xorl $31, %ebx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: LBB0_32: # %udiv-end1
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: testl %edx, %edx
+; WIN32-NEXT: jne LBB0_33
+; WIN32-NEXT: # %bb.34: # %udiv-end1
+; WIN32-NEXT: bsrl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: orl $32, %edx
+; WIN32-NEXT: jmp LBB0_35
+; WIN32-NEXT: LBB0_33:
+; WIN32-NEXT: bsrl %edx, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: LBB0_35: # %udiv-end1
+; WIN32-NEXT: movl %edi, %esi
+; WIN32-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; WIN32-NEXT: jne LBB0_37
+; WIN32-NEXT: # %bb.36: # %udiv-end1
+; WIN32-NEXT: orl $64, %edx
+; WIN32-NEXT: movl %edx, %ebx
+; WIN32-NEXT: LBB0_37: # %udiv-end1
+; WIN32-NEXT: testl %eax, %eax
+; WIN32-NEXT: jne LBB0_38
+; WIN32-NEXT: # %bb.39: # %udiv-end1
+; WIN32-NEXT: bsrl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: orl $32, %edx
+; WIN32-NEXT: jmp LBB0_40
+; WIN32-NEXT: LBB0_38:
+; WIN32-NEXT: bsrl %eax, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: LBB0_40: # %udiv-end1
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: testl %esi, %esi
+; WIN32-NEXT: jne LBB0_41
+; WIN32-NEXT: # %bb.42: # %udiv-end1
+; WIN32-NEXT: bsrl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; WIN32-NEXT: xorl $31, %esi
+; WIN32-NEXT: orl $32, %esi
+; WIN32-NEXT: jmp LBB0_43
+; WIN32-NEXT: LBB0_41:
+; WIN32-NEXT: bsrl %esi, %esi
+; WIN32-NEXT: xorl $31, %esi
+; WIN32-NEXT: LBB0_43: # %udiv-end1
+; WIN32-NEXT: orb %cl, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: orl %eax, %ecx
+; WIN32-NEXT: jne LBB0_45
+; WIN32-NEXT: # %bb.44: # %udiv-end1
+; WIN32-NEXT: orl $64, %esi
+; WIN32-NEXT: movl %esi, %edx
+; WIN32-NEXT: LBB0_45: # %udiv-end1
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: subl %edx, %ebx
+; WIN32-NEXT: movl $0, %edi
+; WIN32-NEXT: sbbl %edi, %edi
+; WIN32-NEXT: movl $0, %ecx
+; WIN32-NEXT: sbbl %ecx, %ecx
+; WIN32-NEXT: movl $0, %edx
+; WIN32-NEXT: sbbl %edx, %edx
+; WIN32-NEXT: cmpb $0, {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Reload
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: jne LBB0_46
+; WIN32-NEXT: # %bb.47: # %select.false.sink8
+; WIN32-NEXT: movl $127, %eax
+; WIN32-NEXT: cmpl %ebx, %eax
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: sbbl %edi, %eax
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: sbbl %ecx, %eax
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: sbbl %edx, %eax
+; WIN32-NEXT: setb %al
+; WIN32-NEXT: LBB0_48: # %select.end7
+; WIN32-NEXT: testb %al, %al
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: movl $0, %edx
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: jne LBB0_50
+; WIN32-NEXT: # %bb.49: # %select.end7
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %esi, %edx
+; WIN32-NEXT: LBB0_50: # %select.end7
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: jne LBB0_51
+; WIN32-NEXT: # %bb.57: # %select.end7
+; WIN32-NEXT: movl %ebx, %eax
+; WIN32-NEXT: xorl $127, %eax
+; WIN32-NEXT: orl %ecx, %eax
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %edi, %ecx
+; WIN32-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: orl %eax, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: je LBB0_58
+; WIN32-NEXT: # %bb.55: # %udiv-bb1
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %ebx, %ecx
+; WIN32-NEXT: xorb $127, %cl
+; WIN32-NEXT: movl %ecx, %eax
+; WIN32-NEXT: shrb $3, %al
+; WIN32-NEXT: andb $12, %al
+; WIN32-NEXT: negb %al
+; WIN32-NEXT: movsbl %al, %eax
+; WIN32-NEXT: movl 200(%esp,%eax), %esi
+; WIN32-NEXT: movl 204(%esp,%eax), %edx
+; WIN32-NEXT: shldl %cl, %esi, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 192(%esp,%eax), %edx
+; WIN32-NEXT: movl 196(%esp,%eax), %eax
+; WIN32-NEXT: shldl %cl, %eax, %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shldl %cl, %edx, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shll %cl, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: addl $1, %ebx
+; WIN32-NEXT: adcl $0, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: jb LBB0_56
+; WIN32-NEXT: # %bb.52: # %udiv-preheader
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %ebx, %eax
+; WIN32-NEXT: shrb $3, %al
+; WIN32-NEXT: andb $12, %al
+; WIN32-NEXT: movzbl %al, %eax
+; WIN32-NEXT: movl 156(%esp,%eax), %edi
+; WIN32-NEXT: movl 152(%esp,%eax), %esi
+; WIN32-NEXT: movl %esi, %edx
+; WIN32-NEXT: movl %ebx, %ecx
+; WIN32-NEXT: shrdl %cl, %edi, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 144(%esp,%eax), %edx
+; WIN32-NEXT: movl 148(%esp,%eax), %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shrdl %cl, %esi, %eax
+; WIN32-NEXT: shrl %cl, %edi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: shrdl %cl, %esi, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: addl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: .p2align 4
+; WIN32-NEXT: LBB0_53: # %udiv-do-while
+; WIN32-NEXT: # =>This Inner Loop Header: Depth=1
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: shldl $1, %edx, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %eax, %ebx
+; WIN32-NEXT: shldl $1, %eax, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: shldl $1, %eax, %ebx
+; WIN32-NEXT: shldl $1, %ecx, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: shldl $1, %edi, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: orl %edx, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shldl $1, %esi, %edi
+; WIN32-NEXT: orl %edx, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: shldl $1, %ecx, %esi
+; WIN32-NEXT: orl %edx, %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: addl %ecx, %ecx
+; WIN32-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: cmpl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: sbbl %ebx, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: sarl $31, %ecx
+; WIN32-NEXT: movl %ecx, %esi
+; WIN32-NEXT: andl $1, %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ecx, %edx
+; WIN32-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ecx, %esi
+; WIN32-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; WIN32-NEXT: movl %ecx, %edi
+; WIN32-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; WIN32-NEXT: andl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: subl %ecx, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %edi, %ebx
+; WIN32-NEXT: movl %ebx, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: sbbl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: addl $-1, %ebx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: adcl $-1, %edx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %esi
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: orl %esi, %ecx
+; WIN32-NEXT: movl %ebx, %esi
+; WIN32-NEXT: orl %edx, %esi
+; WIN32-NEXT: orl %ecx, %esi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: jne LBB0_53
+; WIN32-NEXT: LBB0_54: # %udiv-loop-exit
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: shldl $1, %edx, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shldl $1, %esi, %edx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: shldl $1, %eax, %esi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: leal (%ecx,%eax,2), %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: LBB0_58: # %udiv-end
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl 8(%ebp), %ecx
+; WIN32-NEXT: movl %eax, (%ecx)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, 4(%ecx)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, 8(%ecx)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, 12(%ecx)
+; WIN32-NEXT: movl %edx, %esi
+; WIN32-NEXT: imull {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; WIN32-NEXT: movl %edx, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: mull %edi
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: addl %esi, %edx
+; WIN32-NEXT: imull %edi, %ecx
+; WIN32-NEXT: addl %edx, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: movl %ebx, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: mull %esi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: imull %ebx, %edi
+; WIN32-NEXT: addl %edx, %edi
+; WIN32-NEXT: imull {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; WIN32-NEXT: addl %edi, %esi
+; WIN32-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: adcl %ecx, %esi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: movl %edi, %eax
+; WIN32-NEXT: mull %ebx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: mull %ebx
+; WIN32-NEXT: movl %eax, %ecx
+; WIN32-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: adcl $0, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %edi, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: mull %ebx
+; WIN32-NEXT: movl %edx, %edi
+; WIN32-NEXT: addl %ecx, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; WIN32-NEXT: setb %cl
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: mull %ebx
+; WIN32-NEXT: addl %edi, %eax
+; WIN32-NEXT: movzbl %cl, %ecx
+; WIN32-NEXT: adcl %ecx, %edx
+; WIN32-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; WIN32-NEXT: adcl %esi, %edx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: subl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: sbbl %eax, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: sbbl %edx, %ebx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: xorl %eax, %ebx
+; WIN32-NEXT: xorl %eax, %ecx
+; WIN32-NEXT: xorl %eax, %esi
+; WIN32-NEXT: xorl %eax, %edi
+; WIN32-NEXT: subl %eax, %edi
+; WIN32-NEXT: sbbl %eax, %esi
+; WIN32-NEXT: sbbl %eax, %ecx
+; WIN32-NEXT: sbbl %eax, %ebx
+; WIN32-NEXT: movl 12(%ebp), %eax
+; WIN32-NEXT: movl %edi, (%eax)
+; WIN32-NEXT: movl %esi, 4(%eax)
+; WIN32-NEXT: movl %ecx, 8(%eax)
+; WIN32-NEXT: movl %ebx, 12(%eax)
+; WIN32-NEXT: leal -12(%ebp), %esp
+; WIN32-NEXT: popl %esi
+; WIN32-NEXT: popl %edi
+; WIN32-NEXT: popl %ebx
+; WIN32-NEXT: popl %ebp
+; WIN32-NEXT: retl
+; WIN32-NEXT: LBB0_17:
+; WIN32-NEXT: movb $1, %al
+; WIN32-NEXT: jmp LBB0_19
+; WIN32-NEXT: LBB0_27:
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: jmp LBB0_25
+; WIN32-NEXT: LBB0_46:
+; WIN32-NEXT: movb $1, %al
+; WIN32-NEXT: jmp LBB0_48
+; WIN32-NEXT: LBB0_56:
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: jmp LBB0_54
+; WIN32-NEXT: LBB0_22:
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: jmp LBB0_29
+; WIN32-NEXT: LBB0_51:
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: jmp LBB0_58
+ %q = sdiv i128 %n, %d
+ %r = srem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
+
+define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; LINUX-X86-LABEL: udivrem_i128:
+; LINUX-X86: # %bb.0: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: pushl %ebp
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 8
+; LINUX-X86-NEXT: pushl %ebx
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 12
+; LINUX-X86-NEXT: pushl %edi
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 16
+; LINUX-X86-NEXT: pushl %esi
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 20
+; LINUX-X86-NEXT: subl $236, %esp
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 256
+; LINUX-X86-NEXT: .cfi_offset %esi, -20
+; LINUX-X86-NEXT: .cfi_offset %edi, -16
+; LINUX-X86-NEXT: .cfi_offset %ebx, -12
+; LINUX-X86-NEXT: .cfi_offset %ebp, -8
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %esi
+; LINUX-X86-NEXT: movl %esi, %eax
+; LINUX-X86-NEXT: orl %ebp, %eax
+; LINUX-X86-NEXT: orl %ebx, %ecx
+; LINUX-X86-NEXT: orl %eax, %ecx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; LINUX-X86-NEXT: sete %al
+; LINUX-X86-NEXT: movl %edi, %ecx
+; LINUX-X86-NEXT: orl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; LINUX-X86-NEXT: orl {{[0-9]+}}(%esp), %edx
+; LINUX-X86-NEXT: orl %ecx, %edx
+; LINUX-X86-NEXT: sete %cl
+; LINUX-X86-NEXT: testl %ebp, %ebp
+; LINUX-X86-NEXT: jne .LBB1_2
+; LINUX-X86-NEXT: # %bb.1: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: bsrl %ebx, %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: orl $32, %edx
+; LINUX-X86-NEXT: jmp .LBB1_3
+; LINUX-X86-NEXT: .LBB1_2:
+; LINUX-X86-NEXT: bsrl %ebp, %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: .LBB1_3: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: movl %ebx, %ebp
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: testl %esi, %esi
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; LINUX-X86-NEXT: jne .LBB1_5
+; LINUX-X86-NEXT: # %bb.4: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: bsrl {{[0-9]+}}(%esp), %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: orl $32, %edx
+; LINUX-X86-NEXT: jmp .LBB1_6
+; LINUX-X86-NEXT: .LBB1_5:
+; LINUX-X86-NEXT: bsrl %esi, %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: .LBB1_6: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: movl %ebp, %esi
+; LINUX-X86-NEXT: orl {{[0-9]+}}(%esp), %esi
+; LINUX-X86-NEXT: jne .LBB1_8
+; LINUX-X86-NEXT: # %bb.7: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: orl $64, %edx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: .LBB1_8: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: testl %ebx, %ebx
+; LINUX-X86-NEXT: jne .LBB1_11
+; LINUX-X86-NEXT: # %bb.9: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: bsrl {{[0-9]+}}(%esp), %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: orl $32, %edx
+; LINUX-X86-NEXT: testl %edi, %edi
+; LINUX-X86-NEXT: je .LBB1_12
+; LINUX-X86-NEXT: .LBB1_10:
+; LINUX-X86-NEXT: bsrl %edi, %esi
+; LINUX-X86-NEXT: xorl $31, %esi
+; LINUX-X86-NEXT: jmp .LBB1_13
+; LINUX-X86-NEXT: .LBB1_11:
+; LINUX-X86-NEXT: bsrl %ebx, %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: testl %edi, %edi
+; LINUX-X86-NEXT: jne .LBB1_10
+; LINUX-X86-NEXT: .LBB1_12: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: bsrl {{[0-9]+}}(%esp), %esi
+; LINUX-X86-NEXT: xorl $31, %esi
+; LINUX-X86-NEXT: orl $32, %esi
+; LINUX-X86-NEXT: .LBB1_13: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: orb %cl, %al
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: orl %ebx, %ecx
+; LINUX-X86-NEXT: jne .LBB1_15
+; LINUX-X86-NEXT: # %bb.14: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: orl $64, %esi
+; LINUX-X86-NEXT: movl %esi, %edx
+; LINUX-X86-NEXT: .LBB1_15: # %_udiv-special-cases_udiv-special-cases
+; LINUX-X86-NEXT: xorl %ebp, %ebp
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: subl %edx, %ecx
+; LINUX-X86-NEXT: movl $0, %edx
+; LINUX-X86-NEXT: sbbl %edx, %edx
+; LINUX-X86-NEXT: movl $0, %ebx
+; LINUX-X86-NEXT: sbbl %ebx, %ebx
+; LINUX-X86-NEXT: movl $0, %edi
+; LINUX-X86-NEXT: sbbl %edi, %edi
+; LINUX-X86-NEXT: testb %al, %al
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: jne .LBB1_52
+; LINUX-X86-NEXT: # %bb.16: # %select.false.sink
+; LINUX-X86-NEXT: movl $127, %eax
+; LINUX-X86-NEXT: cmpl %ecx, %eax
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: sbbl %edx, %eax
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: sbbl %ebx, %eax
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: sbbl %edi, %eax
+; LINUX-X86-NEXT: setb %al
+; LINUX-X86-NEXT: .LBB1_17: # %select.end
+; LINUX-X86-NEXT: movl %edi, %edx
+; LINUX-X86-NEXT: testb %al, %al
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: movl $0, %ecx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %esi
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; LINUX-X86-NEXT: jne .LBB1_19
+; LINUX-X86-NEXT: # %bb.18: # %select.end
+; LINUX-X86-NEXT: movl %esi, %ebp
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %edi, %eax
+; LINUX-X86-NEXT: movl %ebx, %ecx
+; LINUX-X86-NEXT: .LBB1_19: # %select.end
+; LINUX-X86-NEXT: movl %edx, %esi
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: jne .LBB1_25
+; LINUX-X86-NEXT: # %bb.20: # %select.end
+; LINUX-X86-NEXT: movl %edx, %eax
+; LINUX-X86-NEXT: xorl $127, %eax
+; LINUX-X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: movl %edi, %ecx
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: orl %esi, %ecx
+; LINUX-X86-NEXT: orl %eax, %ecx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: je .LBB1_26
+; LINUX-X86-NEXT: # %bb.21: # %udiv-bb15
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %esi
+; LINUX-X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %ebx, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: xorb $127, %cl
+; LINUX-X86-NEXT: movl %ecx, %eax
+; LINUX-X86-NEXT: shrb $3, %al
+; LINUX-X86-NEXT: andb $12, %al
+; LINUX-X86-NEXT: negb %al
+; LINUX-X86-NEXT: movsbl %al, %eax
+; LINUX-X86-NEXT: movl 216(%esp,%eax), %esi
+; LINUX-X86-NEXT: movl 220(%esp,%eax), %ebp
+; LINUX-X86-NEXT: shldl %cl, %esi, %ebp
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl 208(%esp,%eax), %ebx
+; LINUX-X86-NEXT: movl 212(%esp,%eax), %ebp
+; LINUX-X86-NEXT: shldl %cl, %ebp, %esi
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shldl %cl, %ebx, %ebp
+; LINUX-X86-NEXT: shll %cl, %ebx
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: addl $1, %edx
+; LINUX-X86-NEXT: adcl $0, %edi
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: jb .LBB1_53
+; LINUX-X86-NEXT: # %bb.22: # %udiv-preheader4
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %edx, %eax
+; LINUX-X86-NEXT: shrb $3, %al
+; LINUX-X86-NEXT: andb $12, %al
+; LINUX-X86-NEXT: movzbl %al, %eax
+; LINUX-X86-NEXT: movl 172(%esp,%eax), %esi
+; LINUX-X86-NEXT: movl 168(%esp,%eax), %ebx
+; LINUX-X86-NEXT: movl %ebx, %edi
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: shrdl %cl, %esi, %edi
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: movl 160(%esp,%eax), %edx
+; LINUX-X86-NEXT: movl 164(%esp,%eax), %edi
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shrdl %cl, %ebx, %edi
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shrl %cl, %esi
+; LINUX-X86-NEXT: movl %esi, %ebx
+; LINUX-X86-NEXT: # kill: def $cl killed $cl killed $ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: shrdl %cl, %eax, %edx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: addl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: adcl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: adcl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: adcl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: .p2align 4
+; LINUX-X86-NEXT: .LBB1_23: # %udiv-do-while3
+; LINUX-X86-NEXT: # =>This Inner Loop Header: Depth=1
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %edx, %ebx
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %edi, %esi
+; LINUX-X86-NEXT: shldl $1, %edi, %edx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %edi, %esi
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %ebx, %edi
+; LINUX-X86-NEXT: shldl $1, %eax, %ebx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: orl %edx, %ebx
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shldl $1, %ebp, %eax
+; LINUX-X86-NEXT: orl %edx, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shldl $1, %ecx, %ebp
+; LINUX-X86-NEXT: orl %edx, %ebp
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: addl %ecx, %ecx
+; LINUX-X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: cmpl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %esi, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Folded Reload
+; LINUX-X86-NEXT: sarl $31, %ebp
+; LINUX-X86-NEXT: movl %ebp, %eax
+; LINUX-X86-NEXT: andl $1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl %ebp, %ecx
+; LINUX-X86-NEXT: andl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: movl %ebp, %ebx
+; LINUX-X86-NEXT: andl {{[0-9]+}}(%esp), %ebx
+; LINUX-X86-NEXT: movl %ebp, %eax
+; LINUX-X86-NEXT: andl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: andl {{[0-9]+}}(%esp), %ebp
+; LINUX-X86-NEXT: subl %ebp, %edi
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %eax, %esi
+; LINUX-X86-NEXT: movl %esi, %edi
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ecx, %ebx
+; LINUX-X86-NEXT: addl $-1, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: adcl $-1, %eax
+; LINUX-X86-NEXT: adcl $-1, %esi
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: adcl $-1, %ecx
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: orl %ecx, %eax
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: orl %esi, %ecx
+; LINUX-X86-NEXT: orl %eax, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: jne .LBB1_23
+; LINUX-X86-NEXT: .LBB1_24: # %udiv-loop-exit2
+; LINUX-X86-NEXT: shldl $1, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: shldl $1, %ebp, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shldl $1, %ecx, %ebp
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: leal (%eax,%ecx,2), %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; LINUX-X86-NEXT: .LBB1_25: # %udiv-end1
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: .LBB1_26: # %udiv-end1
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: movl %ecx, %edx
+; LINUX-X86-NEXT: movl %ebx, %edi
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; LINUX-X86-NEXT: orl %ebx, %eax
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
+; LINUX-X86-NEXT: orl %ebp, %ecx
+; LINUX-X86-NEXT: orl %eax, %ecx
+; LINUX-X86-NEXT: sete {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: orl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: movl %edx, %esi
+; LINUX-X86-NEXT: movl %edi, %eax
+; LINUX-X86-NEXT: orl %edi, %edx
+; LINUX-X86-NEXT: orl %ecx, %edx
+; LINUX-X86-NEXT: sete %cl
+; LINUX-X86-NEXT: testl %ebp, %ebp
+; LINUX-X86-NEXT: jne .LBB1_28
+; LINUX-X86-NEXT: # %bb.27: # %udiv-end1
+; LINUX-X86-NEXT: bsrl %ebx, %edi
+; LINUX-X86-NEXT: xorl $31, %edi
+; LINUX-X86-NEXT: orl $32, %edi
+; LINUX-X86-NEXT: jmp .LBB1_29
+; LINUX-X86-NEXT: .LBB1_28:
+; LINUX-X86-NEXT: bsrl %ebp, %edi
+; LINUX-X86-NEXT: xorl $31, %edi
+; LINUX-X86-NEXT: .LBB1_29: # %udiv-end1
+; LINUX-X86-NEXT: movl %ebx, %ebp
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; LINUX-X86-NEXT: testl %edx, %edx
+; LINUX-X86-NEXT: movl %eax, %ebx
+; LINUX-X86-NEXT: movl %esi, %eax
+; LINUX-X86-NEXT: jne .LBB1_31
+; LINUX-X86-NEXT: # %bb.30: # %udiv-end1
+; LINUX-X86-NEXT: bsrl {{[0-9]+}}(%esp), %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: orl $32, %edx
+; LINUX-X86-NEXT: jmp .LBB1_32
+; LINUX-X86-NEXT: .LBB1_31:
+; LINUX-X86-NEXT: bsrl %edx, %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: .LBB1_32: # %udiv-end1
+; LINUX-X86-NEXT: movl %ebp, %esi
+; LINUX-X86-NEXT: orl {{[0-9]+}}(%esp), %esi
+; LINUX-X86-NEXT: jne .LBB1_34
+; LINUX-X86-NEXT: # %bb.33: # %udiv-end1
+; LINUX-X86-NEXT: orl $64, %edx
+; LINUX-X86-NEXT: movl %edx, %edi
+; LINUX-X86-NEXT: .LBB1_34: # %udiv-end1
+; LINUX-X86-NEXT: testl %ebx, %ebx
+; LINUX-X86-NEXT: jne .LBB1_37
+; LINUX-X86-NEXT: # %bb.35: # %udiv-end1
+; LINUX-X86-NEXT: bsrl {{[0-9]+}}(%esp), %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: orl $32, %edx
+; LINUX-X86-NEXT: testl %eax, %eax
+; LINUX-X86-NEXT: je .LBB1_38
+; LINUX-X86-NEXT: .LBB1_36:
+; LINUX-X86-NEXT: bsrl %eax, %esi
+; LINUX-X86-NEXT: xorl $31, %esi
+; LINUX-X86-NEXT: jmp .LBB1_39
+; LINUX-X86-NEXT: .LBB1_37:
+; LINUX-X86-NEXT: bsrl %ebx, %edx
+; LINUX-X86-NEXT: xorl $31, %edx
+; LINUX-X86-NEXT: testl %eax, %eax
+; LINUX-X86-NEXT: jne .LBB1_36
+; LINUX-X86-NEXT: .LBB1_38: # %udiv-end1
+; LINUX-X86-NEXT: bsrl {{[0-9]+}}(%esp), %esi
+; LINUX-X86-NEXT: xorl $31, %esi
+; LINUX-X86-NEXT: orl $32, %esi
+; LINUX-X86-NEXT: .LBB1_39: # %udiv-end1
+; LINUX-X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 1-byte Folded Reload
+; LINUX-X86-NEXT: orb %cl, %al
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: orl %ebx, %ecx
+; LINUX-X86-NEXT: jne .LBB1_41
+; LINUX-X86-NEXT: # %bb.40: # %udiv-end1
+; LINUX-X86-NEXT: orl $64, %esi
+; LINUX-X86-NEXT: movl %esi, %edx
+; LINUX-X86-NEXT: .LBB1_41: # %udiv-end1
+; LINUX-X86-NEXT: xorl %ebx, %ebx
+; LINUX-X86-NEXT: subl %edx, %edi
+; LINUX-X86-NEXT: movl %edi, %edx
+; LINUX-X86-NEXT: movl $0, %edi
+; LINUX-X86-NEXT: sbbl %edi, %edi
+; LINUX-X86-NEXT: movl $0, %ecx
+; LINUX-X86-NEXT: sbbl %ecx, %ecx
+; LINUX-X86-NEXT: movl $0, %ebp
+; LINUX-X86-NEXT: sbbl %ebp, %ebp
+; LINUX-X86-NEXT: testb %al, %al
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: jne .LBB1_54
+; LINUX-X86-NEXT: # %bb.42: # %select.false.sink8
+; LINUX-X86-NEXT: movl $127, %eax
+; LINUX-X86-NEXT: cmpl %edx, %eax
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: sbbl %edi, %eax
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: sbbl %ecx, %eax
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: sbbl %ebp, %eax
+; LINUX-X86-NEXT: setb %al
+; LINUX-X86-NEXT: .LBB1_43: # %select.end7
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: testb %al, %al
+; LINUX-X86-NEXT: movl $0, %eax
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl $0, %ebp
+; LINUX-X86-NEXT: jne .LBB1_45
+; LINUX-X86-NEXT: # %bb.44: # %select.end7
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
+; LINUX-X86-NEXT: .LBB1_45: # %select.end7
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: jne .LBB1_57
+; LINUX-X86-NEXT: # %bb.46: # %select.end7
+; LINUX-X86-NEXT: movl %edx, %eax
+; LINUX-X86-NEXT: xorl $127, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: orl %ebx, %eax
+; LINUX-X86-NEXT: movl %edi, %ecx
+; LINUX-X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; LINUX-X86-NEXT: orl %eax, %ecx
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: movl %ebp, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: je .LBB1_51
+; LINUX-X86-NEXT: # %bb.47: # %udiv-bb1
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; LINUX-X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %edx
+; LINUX-X86-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %esi
+; LINUX-X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %eax, %esi
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, %ecx
+; LINUX-X86-NEXT: xorb $127, %cl
+; LINUX-X86-NEXT: movl %ecx, %eax
+; LINUX-X86-NEXT: shrb $3, %al
+; LINUX-X86-NEXT: andb $12, %al
+; LINUX-X86-NEXT: negb %al
+; LINUX-X86-NEXT: movsbl %al, %eax
+; LINUX-X86-NEXT: movl 152(%esp,%eax), %edx
+; LINUX-X86-NEXT: movl 156(%esp,%eax), %ebp
+; LINUX-X86-NEXT: shldl %cl, %edx, %ebp
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl 144(%esp,%eax), %ebp
+; LINUX-X86-NEXT: movl 148(%esp,%eax), %eax
+; LINUX-X86-NEXT: shldl %cl, %eax, %edx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shldl %cl, %ebp, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shll %cl, %ebp
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: addl $1, %edx
+; LINUX-X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: adcl $0, %ebx
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: jb .LBB1_55
+; LINUX-X86-NEXT: # %bb.48: # %udiv-preheader
+; LINUX-X86-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl $0, {{[0-9]+}}(%esp)
+; LINUX-X86-NEXT: movl %edx, %eax
+; LINUX-X86-NEXT: shrb $3, %al
+; LINUX-X86-NEXT: andb $12, %al
+; LINUX-X86-NEXT: movzbl %al, %eax
+; LINUX-X86-NEXT: movl 108(%esp,%eax), %ebp
+; LINUX-X86-NEXT: movl 104(%esp,%eax), %ebx
+; LINUX-X86-NEXT: movl %ebx, %esi
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: shrdl %cl, %ebp, %esi
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl 96(%esp,%eax), %esi
+; LINUX-X86-NEXT: movl 100(%esp,%eax), %eax
+; LINUX-X86-NEXT: movl %eax, %edi
+; LINUX-X86-NEXT: shrdl %cl, %ebx, %edi
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shrl %cl, %ebp
+; LINUX-X86-NEXT: shrdl %cl, %eax, %esi
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: addl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: adcl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: adcl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: adcl $-1, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: .p2align 4
+; LINUX-X86-NEXT: .LBB1_49: # %udiv-do-while
+; LINUX-X86-NEXT: # =>This Inner Loop Header: Depth=1
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %edi, %ebp
+; LINUX-X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %ecx, %edi
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %ebx, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %edx, %ebx
+; LINUX-X86-NEXT: shldl $1, %eax, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: orl %ebp, %edx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: shldl $1, %esi, %eax
+; LINUX-X86-NEXT: orl %ebp, %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %eax, %esi
+; LINUX-X86-NEXT: orl %ebp, %esi
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: addl %eax, %eax
+; LINUX-X86-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: cmpl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ecx, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %edi, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; LINUX-X86-NEXT: sarl $31, %eax
+; LINUX-X86-NEXT: movl %eax, %edx
+; LINUX-X86-NEXT: andl $1, %edx
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: movl %eax, %esi
+; LINUX-X86-NEXT: andl {{[0-9]+}}(%esp), %esi
+; LINUX-X86-NEXT: movl %eax, %ebp
+; LINUX-X86-NEXT: andl {{[0-9]+}}(%esp), %ebp
+; LINUX-X86-NEXT: movl %eax, %edx
+; LINUX-X86-NEXT: andl {{[0-9]+}}(%esp), %edx
+; LINUX-X86-NEXT: andl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: subl %eax, %ebx
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: sbbl %edx, %ecx
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %ebp, %edi
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: sbbl %esi, %ebp
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: addl $-1, %edx
+; LINUX-X86-NEXT: adcl $-1, %edi
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; LINUX-X86-NEXT: adcl $-1, %ebx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: adcl $-1, %ecx
+; LINUX-X86-NEXT: movl %edi, %eax
+; LINUX-X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: orl %ecx, %eax
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: orl %ebx, %ecx
+; LINUX-X86-NEXT: orl %eax, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: jne .LBB1_49
+; LINUX-X86-NEXT: .LBB1_50: # %udiv-loop-exit
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %eax, %edx
+; LINUX-X86-NEXT: shldl $1, %esi, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: shldl $1, %edi, %esi
+; LINUX-X86-NEXT: movl %eax, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: leal (%eax,%edi,2), %eax
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %ecx, %edi
+; LINUX-X86-NEXT: .LBB1_51: # %udiv-end
+; LINUX-X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: movl %eax, (%ecx)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, 4(%ecx)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, 8(%ecx)
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl %eax, 12(%ecx)
+; LINUX-X86-NEXT: movl %edi, %esi
+; LINUX-X86-NEXT: movl %edi, %eax
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebp
+; LINUX-X86-NEXT: imull %ebp, %esi
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; LINUX-X86-NEXT: mull %edi
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: addl %esi, %edx
+; LINUX-X86-NEXT: imull %edi, %ecx
+; LINUX-X86-NEXT: addl %edx, %ecx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: movl %esi, %eax
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; LINUX-X86-NEXT: mull %ebx
+; LINUX-X86-NEXT: movl %eax, %edi
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: imull %esi, %eax
+; LINUX-X86-NEXT: addl %edx, %eax
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload
+; LINUX-X86-NEXT: imull %ebp, %ebx
+; LINUX-X86-NEXT: addl %eax, %ebx
+; LINUX-X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: adcl %ecx, %ebx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; LINUX-X86-NEXT: movl %edi, %eax
+; LINUX-X86-NEXT: mull %esi
+; LINUX-X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: mull %esi
+; LINUX-X86-NEXT: movl %edx, %ecx
+; LINUX-X86-NEXT: movl %eax, %esi
+; LINUX-X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; LINUX-X86-NEXT: adcl $0, %ecx
+; LINUX-X86-NEXT: movl %edi, %eax
+; LINUX-X86-NEXT: mull %ebp
+; LINUX-X86-NEXT: movl %edx, %edi
+; LINUX-X86-NEXT: addl %esi, %eax
+; LINUX-X86-NEXT: movl %eax, %esi
+; LINUX-X86-NEXT: adcl %ecx, %edi
+; LINUX-X86-NEXT: setb %cl
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: mull %ebp
+; LINUX-X86-NEXT: addl %edi, %eax
+; LINUX-X86-NEXT: movzbl %cl, %ecx
+; LINUX-X86-NEXT: adcl %ecx, %edx
+; LINUX-X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; LINUX-X86-NEXT: adcl %ebx, %edx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %edi
+; LINUX-X86-NEXT: subl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ecx
+; LINUX-X86-NEXT: sbbl %esi, %ecx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %esi
+; LINUX-X86-NEXT: sbbl %eax, %esi
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %ebx
+; LINUX-X86-NEXT: sbbl %edx, %ebx
+; LINUX-X86-NEXT: movl {{[0-9]+}}(%esp), %eax
+; LINUX-X86-NEXT: movl %edi, (%eax)
+; LINUX-X86-NEXT: movl %ecx, 4(%eax)
+; LINUX-X86-NEXT: movl %esi, 8(%eax)
+; LINUX-X86-NEXT: movl %ebx, 12(%eax)
+; LINUX-X86-NEXT: addl $236, %esp
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 20
+; LINUX-X86-NEXT: popl %esi
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 16
+; LINUX-X86-NEXT: popl %edi
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 12
+; LINUX-X86-NEXT: popl %ebx
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 8
+; LINUX-X86-NEXT: popl %ebp
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 4
+; LINUX-X86-NEXT: retl
+; LINUX-X86-NEXT: .LBB1_52:
+; LINUX-X86-NEXT: .cfi_def_cfa_offset 256
+; LINUX-X86-NEXT: movb $1, %al
+; LINUX-X86-NEXT: jmp .LBB1_17
+; LINUX-X86-NEXT: .LBB1_53:
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: jmp .LBB1_24
+; LINUX-X86-NEXT: .LBB1_54:
+; LINUX-X86-NEXT: movb $1, %al
+; LINUX-X86-NEXT: jmp .LBB1_43
+; LINUX-X86-NEXT: .LBB1_55:
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; LINUX-X86-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; LINUX-X86-NEXT: jmp .LBB1_50
+; LINUX-X86-NEXT: .LBB1_57:
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; LINUX-X86-NEXT: movl %ebp, %edx
+; LINUX-X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; LINUX-X86-NEXT: jmp .LBB1_51
+;
+; WIN32-LABEL: udivrem_i128:
+; WIN32: # %bb.0: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: pushl %ebp
+; WIN32-NEXT: movl %esp, %ebp
+; WIN32-NEXT: pushl %ebx
+; WIN32-NEXT: pushl %edi
+; WIN32-NEXT: pushl %esi
+; WIN32-NEXT: andl $-16, %esp
+; WIN32-NEXT: subl $240, %esp
+; WIN32-NEXT: movl 48(%ebp), %ebx
+; WIN32-NEXT: movl 40(%ebp), %ecx
+; WIN32-NEXT: movl 52(%ebp), %edi
+; WIN32-NEXT: movl 44(%ebp), %esi
+; WIN32-NEXT: movl %esi, %eax
+; WIN32-NEXT: orl %edi, %eax
+; WIN32-NEXT: orl %ebx, %ecx
+; WIN32-NEXT: orl %eax, %ecx
+; WIN32-NEXT: sete %al
+; WIN32-NEXT: movl 28(%ebp), %ecx
+; WIN32-NEXT: orl 36(%ebp), %ecx
+; WIN32-NEXT: movl 24(%ebp), %edx
+; WIN32-NEXT: orl 32(%ebp), %edx
+; WIN32-NEXT: orl %ecx, %edx
+; WIN32-NEXT: sete %cl
+; WIN32-NEXT: testl %edi, %edi
+; WIN32-NEXT: jne LBB1_1
+; WIN32-NEXT: # %bb.2: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: bsrl %ebx, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: orl $32, %edx
+; WIN32-NEXT: jmp LBB1_3
+; WIN32-NEXT: LBB1_1:
+; WIN32-NEXT: bsrl %edi, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: LBB1_3: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: testl %esi, %esi
+; WIN32-NEXT: jne LBB1_4
+; WIN32-NEXT: # %bb.5: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: bsrl 40(%ebp), %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: orl $32, %edx
+; WIN32-NEXT: jmp LBB1_6
+; WIN32-NEXT: LBB1_4:
+; WIN32-NEXT: bsrl %esi, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: LBB1_6: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: movl %ebx, %esi
+; WIN32-NEXT: orl %edi, %esi
+; WIN32-NEXT: jne LBB1_8
+; WIN32-NEXT: # %bb.7: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: orl $64, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: LBB1_8: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: movl 36(%ebp), %edi
+; WIN32-NEXT: testl %edi, %edi
+; WIN32-NEXT: movl 28(%ebp), %esi
+; WIN32-NEXT: jne LBB1_9
+; WIN32-NEXT: # %bb.10: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: bsrl 32(%ebp), %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: orl $32, %edx
+; WIN32-NEXT: testl %esi, %esi
+; WIN32-NEXT: je LBB1_13
+; WIN32-NEXT: LBB1_12:
+; WIN32-NEXT: bsrl %esi, %esi
+; WIN32-NEXT: xorl $31, %esi
+; WIN32-NEXT: jmp LBB1_14
+; WIN32-NEXT: LBB1_9:
+; WIN32-NEXT: bsrl %edi, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: testl %esi, %esi
+; WIN32-NEXT: jne LBB1_12
+; WIN32-NEXT: LBB1_13: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: bsrl 24(%ebp), %esi
+; WIN32-NEXT: xorl $31, %esi
+; WIN32-NEXT: orl $32, %esi
+; WIN32-NEXT: LBB1_14: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: orb %cl, %al
+; WIN32-NEXT: movl 32(%ebp), %ecx
+; WIN32-NEXT: orl %edi, %ecx
+; WIN32-NEXT: jne LBB1_16
+; WIN32-NEXT: # %bb.15: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: orl $64, %esi
+; WIN32-NEXT: movl %esi, %edx
+; WIN32-NEXT: LBB1_16: # %_udiv-special-cases_udiv-special-cases
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: subl %edx, %ecx
+; WIN32-NEXT: movl $0, %esi
+; WIN32-NEXT: sbbl %esi, %esi
+; WIN32-NEXT: movl $0, %edi
+; WIN32-NEXT: sbbl %edi, %edi
+; WIN32-NEXT: movl $0, %ebx
+; WIN32-NEXT: sbbl %ebx, %ebx
+; WIN32-NEXT: testb %al, %al
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: jne LBB1_17
+; WIN32-NEXT: # %bb.18: # %select.false.sink
+; WIN32-NEXT: movl $127, %eax
+; WIN32-NEXT: cmpl %ecx, %eax
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: sbbl %esi, %eax
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: movl %edi, %ecx
+; WIN32-NEXT: sbbl %edi, %eax
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: sbbl %ebx, %eax
+; WIN32-NEXT: setb %al
+; WIN32-NEXT: LBB1_19: # %select.end
+; WIN32-NEXT: movl 28(%ebp), %edx
+; WIN32-NEXT: movl %ebx, %edi
+; WIN32-NEXT: movl %edx, %ebx
+; WIN32-NEXT: movl 32(%ebp), %esi
+; WIN32-NEXT: testb %al, %al
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: movl $0, %edx
+; WIN32-NEXT: jne LBB1_21
+; WIN32-NEXT: # %bb.20: # %select.end
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 24(%ebp), %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %esi, %eax
+; WIN32-NEXT: movl 36(%ebp), %edx
+; WIN32-NEXT: LBB1_21: # %select.end
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: jne LBB1_22
+; WIN32-NEXT: # %bb.28: # %select.end
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl %edx, %eax
+; WIN32-NEXT: xorl $127, %eax
+; WIN32-NEXT: orl %ecx, %eax
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: orl %edi, %ecx
+; WIN32-NEXT: orl %eax, %ecx
+; WIN32-NEXT: movl 36(%ebp), %ecx
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: je LBB1_29
+; WIN32-NEXT: # %bb.26: # %udiv-bb15
+; WIN32-NEXT: movl 24(%ebp), %eax
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %ebx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %edx, %ecx
+; WIN32-NEXT: xorb $127, %cl
+; WIN32-NEXT: movl %ecx, %eax
+; WIN32-NEXT: shrb $3, %al
+; WIN32-NEXT: andb $12, %al
+; WIN32-NEXT: negb %al
+; WIN32-NEXT: movsbl %al, %eax
+; WIN32-NEXT: movl 216(%esp,%eax), %edx
+; WIN32-NEXT: movl 220(%esp,%eax), %edi
+; WIN32-NEXT: shldl %cl, %edx, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %esi, %edi
+; WIN32-NEXT: movl 208(%esp,%eax), %esi
+; WIN32-NEXT: movl 212(%esp,%eax), %eax
+; WIN32-NEXT: shldl %cl, %eax, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: shldl %cl, %esi, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shll %cl, %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: addl $1, %edx
+; WIN32-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: jb LBB1_27
+; WIN32-NEXT: # %bb.23: # %udiv-preheader4
+; WIN32-NEXT: movl 24(%ebp), %eax
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %ebx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %edi, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl 36(%ebp), %eax
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %edx, %eax
+; WIN32-NEXT: shrb $3, %al
+; WIN32-NEXT: andb $12, %al
+; WIN32-NEXT: movzbl %al, %eax
+; WIN32-NEXT: movl 172(%esp,%eax), %esi
+; WIN32-NEXT: movl %edx, %ecx
+; WIN32-NEXT: movl 168(%esp,%eax), %edx
+; WIN32-NEXT: movl %edx, %edi
+; WIN32-NEXT: shrdl %cl, %esi, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 160(%esp,%eax), %ebx
+; WIN32-NEXT: movl 164(%esp,%eax), %edi
+; WIN32-NEXT: movl %edi, %eax
+; WIN32-NEXT: shrdl %cl, %edx, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shrl %cl, %esi
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: # kill: def $cl killed $cl killed $ecx
+; WIN32-NEXT: shrdl %cl, %edi, %ebx
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 40(%ebp), %eax
+; WIN32-NEXT: addl $-1, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 44(%ebp), %eax
+; WIN32-NEXT: adcl $-1, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 48(%ebp), %ecx
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 52(%ebp), %ecx
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: .p2align 4
+; WIN32-NEXT: LBB1_24: # %udiv-do-while3
+; WIN32-NEXT: # =>This Inner Loop Header: Depth=1
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: shldl $1, %eax, %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: shldl $1, %ebx, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: shldl $1, %edi, %ebx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: shldl $1, %esi, %edi
+; WIN32-NEXT: shldl $1, %ecx, %esi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: orl %eax, %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shldl $1, %edx, %ecx
+; WIN32-NEXT: orl %eax, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: shldl $1, %ecx, %edx
+; WIN32-NEXT: orl %eax, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: addl %ecx, %ecx
+; WIN32-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: cmpl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: sbbl %ebx, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: sarl $31, %ecx
+; WIN32-NEXT: movl %ecx, %edx
+; WIN32-NEXT: andl $1, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ecx, %eax
+; WIN32-NEXT: andl 52(%ebp), %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ecx, %esi
+; WIN32-NEXT: andl 48(%ebp), %esi
+; WIN32-NEXT: movl %ecx, %edx
+; WIN32-NEXT: andl 44(%ebp), %edx
+; WIN32-NEXT: andl 40(%ebp), %ecx
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: subl %ecx, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %edx, %ebx
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: sbbl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: addl $-1, %edx
+; WIN32-NEXT: adcl $-1, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %edi
+; WIN32-NEXT: adcl $-1, %ebx
+; WIN32-NEXT: movl %eax, %ecx
+; WIN32-NEXT: orl %ebx, %ecx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: orl %edi, %edx
+; WIN32-NEXT: orl %ecx, %edx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: jne LBB1_24
+; WIN32-NEXT: LBB1_25: # %udiv-loop-exit2
+; WIN32-NEXT: shldl $1, %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: shldl $1, %edx, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: shldl $1, %eax, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: leal (%ecx,%eax,2), %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 36(%ebp), %ecx
+; WIN32-NEXT: movl 28(%ebp), %ebx
+; WIN32-NEXT: LBB1_29: # %udiv-end1
+; WIN32-NEXT: movl 40(%ebp), %eax
+; WIN32-NEXT: movl 48(%ebp), %esi
+; WIN32-NEXT: orl %esi, %eax
+; WIN32-NEXT: movl %ebx, %edx
+; WIN32-NEXT: movl %ecx, %ebx
+; WIN32-NEXT: movl 44(%ebp), %ecx
+; WIN32-NEXT: movl 52(%ebp), %edi
+; WIN32-NEXT: orl %edi, %ecx
+; WIN32-NEXT: orl %eax, %ecx
+; WIN32-NEXT: sete %al
+; WIN32-NEXT: movl 24(%ebp), %ecx
+; WIN32-NEXT: orl 32(%ebp), %ecx
+; WIN32-NEXT: orl %ebx, %edx
+; WIN32-NEXT: orl %ecx, %edx
+; WIN32-NEXT: sete %cl
+; WIN32-NEXT: testl %edi, %edi
+; WIN32-NEXT: jne LBB1_30
+; WIN32-NEXT: # %bb.31: # %udiv-end1
+; WIN32-NEXT: bsrl %esi, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: orl $32, %edx
+; WIN32-NEXT: jmp LBB1_32
+; WIN32-NEXT: LBB1_30:
+; WIN32-NEXT: bsrl %edi, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: LBB1_32: # %udiv-end1
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %esi, %ebx
+; WIN32-NEXT: movl 44(%ebp), %edx
+; WIN32-NEXT: testl %edx, %edx
+; WIN32-NEXT: movl 40(%ebp), %esi
+; WIN32-NEXT: jne LBB1_33
+; WIN32-NEXT: # %bb.34: # %udiv-end1
+; WIN32-NEXT: bsrl %esi, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: orl $32, %edx
+; WIN32-NEXT: jmp LBB1_35
+; WIN32-NEXT: LBB1_33:
+; WIN32-NEXT: bsrl %edx, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: LBB1_35: # %udiv-end1
+; WIN32-NEXT: movl %ebx, %esi
+; WIN32-NEXT: orl %edi, %esi
+; WIN32-NEXT: jne LBB1_37
+; WIN32-NEXT: # %bb.36: # %udiv-end1
+; WIN32-NEXT: orl $64, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: LBB1_37: # %udiv-end1
+; WIN32-NEXT: movl 36(%ebp), %edx
+; WIN32-NEXT: testl %edx, %edx
+; WIN32-NEXT: movl 28(%ebp), %esi
+; WIN32-NEXT: jne LBB1_38
+; WIN32-NEXT: # %bb.39: # %udiv-end1
+; WIN32-NEXT: bsrl 32(%ebp), %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: orl $32, %edx
+; WIN32-NEXT: testl %esi, %esi
+; WIN32-NEXT: je LBB1_42
+; WIN32-NEXT: LBB1_41:
+; WIN32-NEXT: bsrl %esi, %esi
+; WIN32-NEXT: xorl $31, %esi
+; WIN32-NEXT: jmp LBB1_43
+; WIN32-NEXT: LBB1_38:
+; WIN32-NEXT: bsrl %edx, %edx
+; WIN32-NEXT: xorl $31, %edx
+; WIN32-NEXT: testl %esi, %esi
+; WIN32-NEXT: jne LBB1_41
+; WIN32-NEXT: LBB1_42: # %udiv-end1
+; WIN32-NEXT: bsrl 24(%ebp), %esi
+; WIN32-NEXT: xorl $31, %esi
+; WIN32-NEXT: orl $32, %esi
+; WIN32-NEXT: LBB1_43: # %udiv-end1
+; WIN32-NEXT: orb %cl, %al
+; WIN32-NEXT: movl 32(%ebp), %ecx
+; WIN32-NEXT: orl 36(%ebp), %ecx
+; WIN32-NEXT: jne LBB1_45
+; WIN32-NEXT: # %bb.44: # %udiv-end1
+; WIN32-NEXT: orl $64, %esi
+; WIN32-NEXT: movl %esi, %edx
+; WIN32-NEXT: LBB1_45: # %udiv-end1
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: subl %edx, %ecx
+; WIN32-NEXT: movl $0, %edx
+; WIN32-NEXT: sbbl %edx, %edx
+; WIN32-NEXT: movl $0, %esi
+; WIN32-NEXT: sbbl %esi, %esi
+; WIN32-NEXT: movl $0, %edi
+; WIN32-NEXT: sbbl %edi, %edi
+; WIN32-NEXT: testb %al, %al
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: jne LBB1_46
+; WIN32-NEXT: # %bb.47: # %select.false.sink8
+; WIN32-NEXT: movl $127, %eax
+; WIN32-NEXT: cmpl %ecx, %eax
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: sbbl %edx, %eax
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: sbbl %esi, %eax
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: sbbl %edi, %eax
+; WIN32-NEXT: setb %al
+; WIN32-NEXT: LBB1_48: # %select.end7
+; WIN32-NEXT: movl 28(%ebp), %ecx
+; WIN32-NEXT: movl 32(%ebp), %edx
+; WIN32-NEXT: movl %edi, %esi
+; WIN32-NEXT: testb %al, %al
+; WIN32-NEXT: movl $0, %edi
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl $0, %eax
+; WIN32-NEXT: jne LBB1_50
+; WIN32-NEXT: # %bb.49: # %select.end7
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 24(%ebp), %edi
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 36(%ebp), %eax
+; WIN32-NEXT: LBB1_50: # %select.end7
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: jne LBB1_51
+; WIN32-NEXT: # %bb.57: # %select.end7
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, %edi
+; WIN32-NEXT: xorl $127, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: orl %ebx, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: orl %esi, %ecx
+; WIN32-NEXT: orl %eax, %ecx
+; WIN32-NEXT: movl 36(%ebp), %ecx
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: je LBB1_58
+; WIN32-NEXT: # %bb.55: # %udiv-bb1
+; WIN32-NEXT: movl 24(%ebp), %eax
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl 28(%ebp), %edx
+; WIN32-NEXT: movl %edx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl 32(%ebp), %esi
+; WIN32-NEXT: movl %esi, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %edi, %eax
+; WIN32-NEXT: movl %eax, %ecx
+; WIN32-NEXT: movl %edi, %esi
+; WIN32-NEXT: xorb $127, %cl
+; WIN32-NEXT: movl %ecx, %eax
+; WIN32-NEXT: shrb $3, %al
+; WIN32-NEXT: andb $12, %al
+; WIN32-NEXT: negb %al
+; WIN32-NEXT: movsbl %al, %eax
+; WIN32-NEXT: movl 152(%esp,%eax), %edx
+; WIN32-NEXT: movl 156(%esp,%eax), %edi
+; WIN32-NEXT: shldl %cl, %edx, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 144(%esp,%eax), %edi
+; WIN32-NEXT: movl 148(%esp,%eax), %eax
+; WIN32-NEXT: shldl %cl, %eax, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shldl %cl, %edi, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shll %cl, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: addl $1, %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: adcl $0, %ebx
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl 36(%ebp), %eax
+; WIN32-NEXT: jb LBB1_56
+; WIN32-NEXT: # %bb.52: # %udiv-preheader
+; WIN32-NEXT: movl 24(%ebp), %ecx
+; WIN32-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl 28(%ebp), %ecx
+; WIN32-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl 32(%ebp), %ecx
+; WIN32-NEXT: movl %ecx, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl $0, {{[0-9]+}}(%esp)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl %ecx, %eax
+; WIN32-NEXT: shrb $3, %al
+; WIN32-NEXT: andb $12, %al
+; WIN32-NEXT: movzbl %al, %eax
+; WIN32-NEXT: movl 108(%esp,%eax), %edi
+; WIN32-NEXT: movl 104(%esp,%eax), %ebx
+; WIN32-NEXT: movl %ebx, %edx
+; WIN32-NEXT: shrdl %cl, %edi, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 96(%esp,%eax), %esi
+; WIN32-NEXT: movl 100(%esp,%eax), %eax
+; WIN32-NEXT: movl %eax, %edx
+; WIN32-NEXT: shrdl %cl, %ebx, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shrl %cl, %edi
+; WIN32-NEXT: # kill: def $cl killed $cl killed $ecx
+; WIN32-NEXT: shrdl %cl, %eax, %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 40(%ebp), %ecx
+; WIN32-NEXT: addl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 44(%ebp), %ecx
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 48(%ebp), %eax
+; WIN32-NEXT: adcl $-1, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 52(%ebp), %ecx
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: .p2align 4
+; WIN32-NEXT: LBB1_53: # %udiv-do-while
+; WIN32-NEXT: # =>This Inner Loop Header: Depth=1
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: shldl $1, %eax, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: shldl $1, %esi, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: shldl $1, %eax, %esi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: shldl $1, %ebx, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: shldl $1, %edi, %ebx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: orl %edx, %ebx
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: shldl $1, %ecx, %edi
+; WIN32-NEXT: orl %edx, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: shldl $1, %edi, %ecx
+; WIN32-NEXT: orl %edx, %ecx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: addl %edi, %edi
+; WIN32-NEXT: orl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: cmpl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: sbbl %esi, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: sbbl %edx, %ecx
+; WIN32-NEXT: sarl $31, %ecx
+; WIN32-NEXT: movl %ecx, %edi
+; WIN32-NEXT: andl $1, %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ecx, %edi
+; WIN32-NEXT: andl 52(%ebp), %edi
+; WIN32-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ecx, %edi
+; WIN32-NEXT: andl 48(%ebp), %edi
+; WIN32-NEXT: movl %ecx, %ebx
+; WIN32-NEXT: andl 44(%ebp), %ebx
+; WIN32-NEXT: andl 40(%ebp), %ecx
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: subl %ecx, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: sbbl %ebx, %esi
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: sbbl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload
+; WIN32-NEXT: movl %edx, %edi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: addl $-1, %esi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %ecx
+; WIN32-NEXT: adcl $-1, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload
+; WIN32-NEXT: adcl $-1, %ebx
+; WIN32-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: orl %ebx, %ecx
+; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: orl %eax, %esi
+; WIN32-NEXT: orl %ecx, %esi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: jne LBB1_53
+; WIN32-NEXT: LBB1_54: # %udiv-loop-exit
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: shldl $1, %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: shldl $1, %ecx, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: shldl $1, %eax, %ecx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: leal (%edx,%eax,2), %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl %ecx, %eax
+; WIN32-NEXT: LBB1_58: # %udiv-end
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl 8(%ebp), %ecx
+; WIN32-NEXT: movl %eax, (%ecx)
+; WIN32-NEXT: movl %edx, 4(%ecx)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, 8(%ecx)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: movl %eax, 12(%ecx)
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl %ecx, %esi
+; WIN32-NEXT: movl 44(%ebp), %eax
+; WIN32-NEXT: imull %eax, %esi
+; WIN32-NEXT: movl %ecx, %eax
+; WIN32-NEXT: movl 40(%ebp), %edi
+; WIN32-NEXT: mull %edi
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: addl %esi, %edx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload
+; WIN32-NEXT: imull %edi, %esi
+; WIN32-NEXT: addl %edx, %esi
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl %ecx, %eax
+; WIN32-NEXT: movl 48(%ebp), %ebx
+; WIN32-NEXT: mull %ebx
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 52(%ebp), %eax
+; WIN32-NEXT: imull %ecx, %eax
+; WIN32-NEXT: addl %edx, %eax
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload
+; WIN32-NEXT: imull %edi, %ebx
+; WIN32-NEXT: addl %eax, %ebx
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: addl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: adcl %esi, %ebx
+; WIN32-NEXT: movl 40(%ebp), %esi
+; WIN32-NEXT: movl %esi, %eax
+; WIN32-NEXT: mull %ecx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl 44(%ebp), %eax
+; WIN32-NEXT: mull %ecx
+; WIN32-NEXT: movl %eax, %ecx
+; WIN32-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: adcl $0, %edx
+; WIN32-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: movl %esi, %eax
+; WIN32-NEXT: mull %edi
+; WIN32-NEXT: movl %edx, %esi
+; WIN32-NEXT: addl %ecx, %eax
+; WIN32-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
+; WIN32-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload
+; WIN32-NEXT: setb %cl
+; WIN32-NEXT: movl 44(%ebp), %eax
+; WIN32-NEXT: mull %edi
+; WIN32-NEXT: addl %esi, %eax
+; WIN32-NEXT: movzbl %cl, %ecx
+; WIN32-NEXT: adcl %ecx, %edx
+; WIN32-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload
+; WIN32-NEXT: adcl %ebx, %edx
+; WIN32-NEXT: movl 24(%ebp), %ebx
+; WIN32-NEXT: subl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload
+; WIN32-NEXT: movl 28(%ebp), %ecx
+; WIN32-NEXT: sbbl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload
+; WIN32-NEXT: movl 32(%ebp), %esi
+; WIN32-NEXT: sbbl %eax, %esi
+; WIN32-NEXT: movl 36(%ebp), %edi
+; WIN32-NEXT: sbbl %edx, %edi
+; WIN32-NEXT: movl 12(%ebp), %eax
+; WIN32-NEXT: movl %ebx, (%eax)
+; WIN32-NEXT: movl %ecx, 4(%eax)
+; WIN32-NEXT: movl %esi, 8(%eax)
+; WIN32-NEXT: movl %edi, 12(%eax)
+; WIN32-NEXT: leal -12(%ebp), %esp
+; WIN32-NEXT: popl %esi
+; WIN32-NEXT: popl %edi
+; WIN32-NEXT: popl %ebx
+; WIN32-NEXT: popl %ebp
+; WIN32-NEXT: retl
+; WIN32-NEXT: LBB1_17:
+; WIN32-NEXT: movl %edi, %ecx
+; WIN32-NEXT: movb $1, %al
+; WIN32-NEXT: jmp LBB1_19
+; WIN32-NEXT: LBB1_27:
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: jmp LBB1_25
+; WIN32-NEXT: LBB1_46:
+; WIN32-NEXT: movb $1, %al
+; WIN32-NEXT: jmp LBB1_48
+; WIN32-NEXT: LBB1_56:
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload
+; WIN32-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
+; WIN32-NEXT: jmp LBB1_54
+; WIN32-NEXT: LBB1_22:
+; WIN32-NEXT: movl 36(%ebp), %ecx
+; WIN32-NEXT: jmp LBB1_29
+; WIN32-NEXT: LBB1_51:
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
+; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload
+; WIN32-NEXT: jmp LBB1_58
+ %q = udiv i128 %n, %d
+ %r = urem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
diff --git a/llvm/test/CodeGen/X86/i128-divrem-libcall-x86-64.ll b/llvm/test/CodeGen/X86/i128-divrem-libcall-x86-64.ll
new file mode 100644
index 0000000000000..0921ed6a98b32
--- /dev/null
+++ b/llvm/test/CodeGen/X86/i128-divrem-libcall-x86-64.ll
@@ -0,0 +1,598 @@
+; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6
+; RUN: llc < %s -mtriple=x86_64-linux-gnu | FileCheck %s --check-prefix=LINUX-X64
+; RUN: llc < %s -mtriple=x86_64-linux-gnux32 | FileCheck %s --check-prefix=LINUX-X32
+; RUN: llc < %s -mtriple=x86_64-apple-macosx | FileCheck %s --check-prefix=DARWIN-X64
+; RUN: llc < %s -mtriple=x86_64-w64-mingw32 | FileCheck %s --check-prefix=MINGW-X64
+; RUN: llc < %s -mtriple=x86_64-pc-windows-msvc | FileCheck %s --check-prefix=WIN64
+
+define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; LINUX-X64-LABEL: sdivrem_i128:
+; LINUX-X64: # %bb.0:
+; LINUX-X64-NEXT: pushq %rbp
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 16
+; LINUX-X64-NEXT: pushq %r15
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 24
+; LINUX-X64-NEXT: pushq %r14
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 32
+; LINUX-X64-NEXT: pushq %r13
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 40
+; LINUX-X64-NEXT: pushq %r12
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X64-NEXT: pushq %rbx
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 56
+; LINUX-X64-NEXT: subq $24, %rsp
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 80
+; LINUX-X64-NEXT: .cfi_offset %rbx, -56
+; LINUX-X64-NEXT: .cfi_offset %r12, -48
+; LINUX-X64-NEXT: .cfi_offset %r13, -40
+; LINUX-X64-NEXT: .cfi_offset %r14, -32
+; LINUX-X64-NEXT: .cfi_offset %r15, -24
+; LINUX-X64-NEXT: .cfi_offset %rbp, -16
+; LINUX-X64-NEXT: movq %r9, %rbx
+; LINUX-X64-NEXT: movq %r8, %r14
+; LINUX-X64-NEXT: movq %rcx, %r15
+; LINUX-X64-NEXT: movq %rdx, %r12
+; LINUX-X64-NEXT: movq %rsi, %r13
+; LINUX-X64-NEXT: movq %rdi, %rbp
+; LINUX-X64-NEXT: movq %rdx, %rdi
+; LINUX-X64-NEXT: movq %rcx, %rsi
+; LINUX-X64-NEXT: movq %r8, %rdx
+; LINUX-X64-NEXT: movq %r9, %rcx
+; LINUX-X64-NEXT: callq __divti3 at PLT
+; LINUX-X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; LINUX-X64-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; LINUX-X64-NEXT: movq %r12, %rdi
+; LINUX-X64-NEXT: movq %r15, %rsi
+; LINUX-X64-NEXT: movq %r14, %rdx
+; LINUX-X64-NEXT: movq %rbx, %rcx
+; LINUX-X64-NEXT: callq __modti3 at PLT
+; LINUX-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
+; LINUX-X64-NEXT: movq %rcx, (%rbp)
+; LINUX-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
+; LINUX-X64-NEXT: movq %rcx, 8(%rbp)
+; LINUX-X64-NEXT: movq %rax, (%r13)
+; LINUX-X64-NEXT: movq %rdx, 8(%r13)
+; LINUX-X64-NEXT: addq $24, %rsp
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 56
+; LINUX-X64-NEXT: popq %rbx
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X64-NEXT: popq %r12
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 40
+; LINUX-X64-NEXT: popq %r13
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 32
+; LINUX-X64-NEXT: popq %r14
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 24
+; LINUX-X64-NEXT: popq %r15
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 16
+; LINUX-X64-NEXT: popq %rbp
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 8
+; LINUX-X64-NEXT: retq
+;
+; LINUX-X32-LABEL: sdivrem_i128:
+; LINUX-X32: # %bb.0:
+; LINUX-X32-NEXT: pushq %rbp
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 16
+; LINUX-X32-NEXT: pushq %r15
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 24
+; LINUX-X32-NEXT: pushq %r14
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 32
+; LINUX-X32-NEXT: pushq %r13
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 40
+; LINUX-X32-NEXT: pushq %r12
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X32-NEXT: pushq %rbx
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 56
+; LINUX-X32-NEXT: subl $24, %esp
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 80
+; LINUX-X32-NEXT: .cfi_offset %rbx, -56
+; LINUX-X32-NEXT: .cfi_offset %r12, -48
+; LINUX-X32-NEXT: .cfi_offset %r13, -40
+; LINUX-X32-NEXT: .cfi_offset %r14, -32
+; LINUX-X32-NEXT: .cfi_offset %r15, -24
+; LINUX-X32-NEXT: .cfi_offset %rbp, -16
+; LINUX-X32-NEXT: movq %r9, %rbx
+; LINUX-X32-NEXT: movq %r8, %r14
+; LINUX-X32-NEXT: movq %rcx, %r15
+; LINUX-X32-NEXT: movq %rdx, %r12
+; LINUX-X32-NEXT: movq %rsi, %r13
+; LINUX-X32-NEXT: movq %rdi, %rbp
+; LINUX-X32-NEXT: movq %rdx, %rdi
+; LINUX-X32-NEXT: movq %rcx, %rsi
+; LINUX-X32-NEXT: movq %r8, %rdx
+; LINUX-X32-NEXT: movq %r9, %rcx
+; LINUX-X32-NEXT: callq __divti3 at PLT
+; LINUX-X32-NEXT: movq %rax, {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Spill
+; LINUX-X32-NEXT: movq %rdx, {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Spill
+; LINUX-X32-NEXT: movq %r12, %rdi
+; LINUX-X32-NEXT: movq %r15, %rsi
+; LINUX-X32-NEXT: movq %r14, %rdx
+; LINUX-X32-NEXT: movq %rbx, %rcx
+; LINUX-X32-NEXT: callq __modti3 at PLT
+; LINUX-X32-NEXT: movq {{[-0-9]+}}(%e{{[sb]}}p), %rcx # 8-byte Reload
+; LINUX-X32-NEXT: movq %rcx, (%ebp)
+; LINUX-X32-NEXT: movq {{[-0-9]+}}(%e{{[sb]}}p), %rcx # 8-byte Reload
+; LINUX-X32-NEXT: movq %rcx, 8(%ebp)
+; LINUX-X32-NEXT: movq %rax, (%r13d)
+; LINUX-X32-NEXT: movq %rdx, 8(%r13d)
+; LINUX-X32-NEXT: addl $24, %esp
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 56
+; LINUX-X32-NEXT: popq %rbx
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X32-NEXT: popq %r12
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 40
+; LINUX-X32-NEXT: popq %r13
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 32
+; LINUX-X32-NEXT: popq %r14
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 24
+; LINUX-X32-NEXT: popq %r15
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 16
+; LINUX-X32-NEXT: popq %rbp
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 8
+; LINUX-X32-NEXT: retq
+;
+; DARWIN-X64-LABEL: sdivrem_i128:
+; DARWIN-X64: ## %bb.0:
+; DARWIN-X64-NEXT: pushq %rbp
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 16
+; DARWIN-X64-NEXT: pushq %r15
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 24
+; DARWIN-X64-NEXT: pushq %r14
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 32
+; DARWIN-X64-NEXT: pushq %r13
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 40
+; DARWIN-X64-NEXT: pushq %r12
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 48
+; DARWIN-X64-NEXT: pushq %rbx
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 56
+; DARWIN-X64-NEXT: subq $24, %rsp
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 80
+; DARWIN-X64-NEXT: .cfi_offset %rbx, -56
+; DARWIN-X64-NEXT: .cfi_offset %r12, -48
+; DARWIN-X64-NEXT: .cfi_offset %r13, -40
+; DARWIN-X64-NEXT: .cfi_offset %r14, -32
+; DARWIN-X64-NEXT: .cfi_offset %r15, -24
+; DARWIN-X64-NEXT: .cfi_offset %rbp, -16
+; DARWIN-X64-NEXT: movq %r9, %rbx
+; DARWIN-X64-NEXT: movq %r8, %r14
+; DARWIN-X64-NEXT: movq %rcx, %r15
+; DARWIN-X64-NEXT: movq %rdx, %r12
+; DARWIN-X64-NEXT: movq %rsi, %r13
+; DARWIN-X64-NEXT: movq %rdi, %rbp
+; DARWIN-X64-NEXT: movq %rdx, %rdi
+; DARWIN-X64-NEXT: movq %rcx, %rsi
+; DARWIN-X64-NEXT: movq %r8, %rdx
+; DARWIN-X64-NEXT: movq %r9, %rcx
+; DARWIN-X64-NEXT: callq ___divti3
+; DARWIN-X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
+; DARWIN-X64-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
+; DARWIN-X64-NEXT: movq %r12, %rdi
+; DARWIN-X64-NEXT: movq %r15, %rsi
+; DARWIN-X64-NEXT: movq %r14, %rdx
+; DARWIN-X64-NEXT: movq %rbx, %rcx
+; DARWIN-X64-NEXT: callq ___modti3
+; DARWIN-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
+; DARWIN-X64-NEXT: movq %rcx, (%rbp)
+; DARWIN-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
+; DARWIN-X64-NEXT: movq %rcx, 8(%rbp)
+; DARWIN-X64-NEXT: movq %rax, (%r13)
+; DARWIN-X64-NEXT: movq %rdx, 8(%r13)
+; DARWIN-X64-NEXT: addq $24, %rsp
+; DARWIN-X64-NEXT: popq %rbx
+; DARWIN-X64-NEXT: popq %r12
+; DARWIN-X64-NEXT: popq %r13
+; DARWIN-X64-NEXT: popq %r14
+; DARWIN-X64-NEXT: popq %r15
+; DARWIN-X64-NEXT: popq %rbp
+; DARWIN-X64-NEXT: retq
+;
+; MINGW-X64-LABEL: sdivrem_i128:
+; MINGW-X64: # %bb.0:
+; MINGW-X64-NEXT: pushq %r15
+; MINGW-X64-NEXT: .seh_pushreg %r15
+; MINGW-X64-NEXT: pushq %r14
+; MINGW-X64-NEXT: .seh_pushreg %r14
+; MINGW-X64-NEXT: pushq %r12
+; MINGW-X64-NEXT: .seh_pushreg %r12
+; MINGW-X64-NEXT: pushq %rsi
+; MINGW-X64-NEXT: .seh_pushreg %rsi
+; MINGW-X64-NEXT: pushq %rdi
+; MINGW-X64-NEXT: .seh_pushreg %rdi
+; MINGW-X64-NEXT: pushq %rbx
+; MINGW-X64-NEXT: .seh_pushreg %rbx
+; MINGW-X64-NEXT: subq $120, %rsp
+; MINGW-X64-NEXT: .seh_stackalloc 120
+; MINGW-X64-NEXT: movaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; MINGW-X64-NEXT: .seh_savexmm %xmm6, 96
+; MINGW-X64-NEXT: .seh_endprologue
+; MINGW-X64-NEXT: movq %r9, %rsi
+; MINGW-X64-NEXT: movq %r8, %rdi
+; MINGW-X64-NEXT: movq %rdx, %rbx
+; MINGW-X64-NEXT: movq %rcx, %r14
+; MINGW-X64-NEXT: movq {{[0-9]+}}(%rsp), %r15
+; MINGW-X64-NEXT: movq {{[0-9]+}}(%rsp), %r12
+; MINGW-X64-NEXT: movq %r9, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movq %r8, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
+; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
+; MINGW-X64-NEXT: callq __divti3
+; MINGW-X64-NEXT: movaps %xmm0, %xmm6
+; MINGW-X64-NEXT: movq %rsi, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movq %rdi, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
+; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
+; MINGW-X64-NEXT: callq __modti3
+; MINGW-X64-NEXT: movaps %xmm6, (%r14)
+; MINGW-X64-NEXT: movaps %xmm0, (%rbx)
+; MINGW-X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload
+; MINGW-X64-NEXT: .seh_startepilogue
+; MINGW-X64-NEXT: addq $120, %rsp
+; MINGW-X64-NEXT: popq %rbx
+; MINGW-X64-NEXT: popq %rdi
+; MINGW-X64-NEXT: popq %rsi
+; MINGW-X64-NEXT: popq %r12
+; MINGW-X64-NEXT: popq %r14
+; MINGW-X64-NEXT: popq %r15
+; MINGW-X64-NEXT: .seh_endepilogue
+; MINGW-X64-NEXT: retq
+; MINGW-X64-NEXT: .seh_endproc
+;
+; WIN64-LABEL: sdivrem_i128:
+; WIN64: # %bb.0:
+; WIN64-NEXT: pushq %r15
+; WIN64-NEXT: .seh_pushreg %r15
+; WIN64-NEXT: pushq %r14
+; WIN64-NEXT: .seh_pushreg %r14
+; WIN64-NEXT: pushq %r12
+; WIN64-NEXT: .seh_pushreg %r12
+; WIN64-NEXT: pushq %rsi
+; WIN64-NEXT: .seh_pushreg %rsi
+; WIN64-NEXT: pushq %rdi
+; WIN64-NEXT: .seh_pushreg %rdi
+; WIN64-NEXT: pushq %rbx
+; WIN64-NEXT: .seh_pushreg %rbx
+; WIN64-NEXT: subq $120, %rsp
+; WIN64-NEXT: .seh_stackalloc 120
+; WIN64-NEXT: movaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; WIN64-NEXT: .seh_savexmm %xmm6, 96
+; WIN64-NEXT: .seh_endprologue
+; WIN64-NEXT: movq %r9, %rsi
+; WIN64-NEXT: movq %r8, %rdi
+; WIN64-NEXT: movq %rdx, %rbx
+; WIN64-NEXT: movq %rcx, %r14
+; WIN64-NEXT: movq {{[0-9]+}}(%rsp), %r15
+; WIN64-NEXT: movq {{[0-9]+}}(%rsp), %r12
+; WIN64-NEXT: movq %r9, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movq %r8, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
+; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
+; WIN64-NEXT: callq __divti3
+; WIN64-NEXT: movaps %xmm0, %xmm6
+; WIN64-NEXT: movq %rsi, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movq %rdi, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
+; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
+; WIN64-NEXT: callq __modti3
+; WIN64-NEXT: movaps %xmm6, (%r14)
+; WIN64-NEXT: movaps %xmm0, (%rbx)
+; WIN64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload
+; WIN64-NEXT: .seh_startepilogue
+; WIN64-NEXT: addq $120, %rsp
+; WIN64-NEXT: popq %rbx
+; WIN64-NEXT: popq %rdi
+; WIN64-NEXT: popq %rsi
+; WIN64-NEXT: popq %r12
+; WIN64-NEXT: popq %r14
+; WIN64-NEXT: popq %r15
+; WIN64-NEXT: .seh_endepilogue
+; WIN64-NEXT: retq
+; WIN64-NEXT: .seh_endproc
+ %q = sdiv i128 %n, %d
+ %r = srem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
+
+define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
+; LINUX-X64-LABEL: udivrem_i128:
+; LINUX-X64: # %bb.0:
+; LINUX-X64-NEXT: pushq %rbp
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 16
+; LINUX-X64-NEXT: pushq %r15
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 24
+; LINUX-X64-NEXT: pushq %r14
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 32
+; LINUX-X64-NEXT: pushq %r13
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 40
+; LINUX-X64-NEXT: pushq %r12
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X64-NEXT: pushq %rbx
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 56
+; LINUX-X64-NEXT: subq $24, %rsp
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 80
+; LINUX-X64-NEXT: .cfi_offset %rbx, -56
+; LINUX-X64-NEXT: .cfi_offset %r12, -48
+; LINUX-X64-NEXT: .cfi_offset %r13, -40
+; LINUX-X64-NEXT: .cfi_offset %r14, -32
+; LINUX-X64-NEXT: .cfi_offset %r15, -24
+; LINUX-X64-NEXT: .cfi_offset %rbp, -16
+; LINUX-X64-NEXT: movq %r9, %rbx
+; LINUX-X64-NEXT: movq %r8, %r14
+; LINUX-X64-NEXT: movq %rcx, %r15
+; LINUX-X64-NEXT: movq %rdx, %r12
+; LINUX-X64-NEXT: movq %rsi, %r13
+; LINUX-X64-NEXT: movq %rdi, %rbp
+; LINUX-X64-NEXT: movq %rdx, %rdi
+; LINUX-X64-NEXT: movq %rcx, %rsi
+; LINUX-X64-NEXT: movq %r8, %rdx
+; LINUX-X64-NEXT: movq %r9, %rcx
+; LINUX-X64-NEXT: callq __udivti3 at PLT
+; LINUX-X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; LINUX-X64-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
+; LINUX-X64-NEXT: movq %r12, %rdi
+; LINUX-X64-NEXT: movq %r15, %rsi
+; LINUX-X64-NEXT: movq %r14, %rdx
+; LINUX-X64-NEXT: movq %rbx, %rcx
+; LINUX-X64-NEXT: callq __umodti3 at PLT
+; LINUX-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
+; LINUX-X64-NEXT: movq %rcx, (%rbp)
+; LINUX-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
+; LINUX-X64-NEXT: movq %rcx, 8(%rbp)
+; LINUX-X64-NEXT: movq %rax, (%r13)
+; LINUX-X64-NEXT: movq %rdx, 8(%r13)
+; LINUX-X64-NEXT: addq $24, %rsp
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 56
+; LINUX-X64-NEXT: popq %rbx
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X64-NEXT: popq %r12
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 40
+; LINUX-X64-NEXT: popq %r13
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 32
+; LINUX-X64-NEXT: popq %r14
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 24
+; LINUX-X64-NEXT: popq %r15
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 16
+; LINUX-X64-NEXT: popq %rbp
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 8
+; LINUX-X64-NEXT: retq
+;
+; LINUX-X32-LABEL: udivrem_i128:
+; LINUX-X32: # %bb.0:
+; LINUX-X32-NEXT: pushq %rbp
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 16
+; LINUX-X32-NEXT: pushq %r15
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 24
+; LINUX-X32-NEXT: pushq %r14
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 32
+; LINUX-X32-NEXT: pushq %r13
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 40
+; LINUX-X32-NEXT: pushq %r12
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X32-NEXT: pushq %rbx
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 56
+; LINUX-X32-NEXT: subl $24, %esp
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 80
+; LINUX-X32-NEXT: .cfi_offset %rbx, -56
+; LINUX-X32-NEXT: .cfi_offset %r12, -48
+; LINUX-X32-NEXT: .cfi_offset %r13, -40
+; LINUX-X32-NEXT: .cfi_offset %r14, -32
+; LINUX-X32-NEXT: .cfi_offset %r15, -24
+; LINUX-X32-NEXT: .cfi_offset %rbp, -16
+; LINUX-X32-NEXT: movq %r9, %rbx
+; LINUX-X32-NEXT: movq %r8, %r14
+; LINUX-X32-NEXT: movq %rcx, %r15
+; LINUX-X32-NEXT: movq %rdx, %r12
+; LINUX-X32-NEXT: movq %rsi, %r13
+; LINUX-X32-NEXT: movq %rdi, %rbp
+; LINUX-X32-NEXT: movq %rdx, %rdi
+; LINUX-X32-NEXT: movq %rcx, %rsi
+; LINUX-X32-NEXT: movq %r8, %rdx
+; LINUX-X32-NEXT: movq %r9, %rcx
+; LINUX-X32-NEXT: callq __udivti3 at PLT
+; LINUX-X32-NEXT: movq %rax, {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Spill
+; LINUX-X32-NEXT: movq %rdx, {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Spill
+; LINUX-X32-NEXT: movq %r12, %rdi
+; LINUX-X32-NEXT: movq %r15, %rsi
+; LINUX-X32-NEXT: movq %r14, %rdx
+; LINUX-X32-NEXT: movq %rbx, %rcx
+; LINUX-X32-NEXT: callq __umodti3 at PLT
+; LINUX-X32-NEXT: movq {{[-0-9]+}}(%e{{[sb]}}p), %rcx # 8-byte Reload
+; LINUX-X32-NEXT: movq %rcx, (%ebp)
+; LINUX-X32-NEXT: movq {{[-0-9]+}}(%e{{[sb]}}p), %rcx # 8-byte Reload
+; LINUX-X32-NEXT: movq %rcx, 8(%ebp)
+; LINUX-X32-NEXT: movq %rax, (%r13d)
+; LINUX-X32-NEXT: movq %rdx, 8(%r13d)
+; LINUX-X32-NEXT: addl $24, %esp
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 56
+; LINUX-X32-NEXT: popq %rbx
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X32-NEXT: popq %r12
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 40
+; LINUX-X32-NEXT: popq %r13
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 32
+; LINUX-X32-NEXT: popq %r14
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 24
+; LINUX-X32-NEXT: popq %r15
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 16
+; LINUX-X32-NEXT: popq %rbp
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 8
+; LINUX-X32-NEXT: retq
+;
+; DARWIN-X64-LABEL: udivrem_i128:
+; DARWIN-X64: ## %bb.0:
+; DARWIN-X64-NEXT: pushq %rbp
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 16
+; DARWIN-X64-NEXT: pushq %r15
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 24
+; DARWIN-X64-NEXT: pushq %r14
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 32
+; DARWIN-X64-NEXT: pushq %r13
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 40
+; DARWIN-X64-NEXT: pushq %r12
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 48
+; DARWIN-X64-NEXT: pushq %rbx
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 56
+; DARWIN-X64-NEXT: subq $24, %rsp
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 80
+; DARWIN-X64-NEXT: .cfi_offset %rbx, -56
+; DARWIN-X64-NEXT: .cfi_offset %r12, -48
+; DARWIN-X64-NEXT: .cfi_offset %r13, -40
+; DARWIN-X64-NEXT: .cfi_offset %r14, -32
+; DARWIN-X64-NEXT: .cfi_offset %r15, -24
+; DARWIN-X64-NEXT: .cfi_offset %rbp, -16
+; DARWIN-X64-NEXT: movq %r9, %rbx
+; DARWIN-X64-NEXT: movq %r8, %r14
+; DARWIN-X64-NEXT: movq %rcx, %r15
+; DARWIN-X64-NEXT: movq %rdx, %r12
+; DARWIN-X64-NEXT: movq %rsi, %r13
+; DARWIN-X64-NEXT: movq %rdi, %rbp
+; DARWIN-X64-NEXT: movq %rdx, %rdi
+; DARWIN-X64-NEXT: movq %rcx, %rsi
+; DARWIN-X64-NEXT: movq %r8, %rdx
+; DARWIN-X64-NEXT: movq %r9, %rcx
+; DARWIN-X64-NEXT: callq ___udivti3
+; DARWIN-X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
+; DARWIN-X64-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
+; DARWIN-X64-NEXT: movq %r12, %rdi
+; DARWIN-X64-NEXT: movq %r15, %rsi
+; DARWIN-X64-NEXT: movq %r14, %rdx
+; DARWIN-X64-NEXT: movq %rbx, %rcx
+; DARWIN-X64-NEXT: callq ___umodti3
+; DARWIN-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
+; DARWIN-X64-NEXT: movq %rcx, (%rbp)
+; DARWIN-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
+; DARWIN-X64-NEXT: movq %rcx, 8(%rbp)
+; DARWIN-X64-NEXT: movq %rax, (%r13)
+; DARWIN-X64-NEXT: movq %rdx, 8(%r13)
+; DARWIN-X64-NEXT: addq $24, %rsp
+; DARWIN-X64-NEXT: popq %rbx
+; DARWIN-X64-NEXT: popq %r12
+; DARWIN-X64-NEXT: popq %r13
+; DARWIN-X64-NEXT: popq %r14
+; DARWIN-X64-NEXT: popq %r15
+; DARWIN-X64-NEXT: popq %rbp
+; DARWIN-X64-NEXT: retq
+;
+; MINGW-X64-LABEL: udivrem_i128:
+; MINGW-X64: # %bb.0:
+; MINGW-X64-NEXT: pushq %r15
+; MINGW-X64-NEXT: .seh_pushreg %r15
+; MINGW-X64-NEXT: pushq %r14
+; MINGW-X64-NEXT: .seh_pushreg %r14
+; MINGW-X64-NEXT: pushq %r12
+; MINGW-X64-NEXT: .seh_pushreg %r12
+; MINGW-X64-NEXT: pushq %rsi
+; MINGW-X64-NEXT: .seh_pushreg %rsi
+; MINGW-X64-NEXT: pushq %rdi
+; MINGW-X64-NEXT: .seh_pushreg %rdi
+; MINGW-X64-NEXT: pushq %rbx
+; MINGW-X64-NEXT: .seh_pushreg %rbx
+; MINGW-X64-NEXT: subq $120, %rsp
+; MINGW-X64-NEXT: .seh_stackalloc 120
+; MINGW-X64-NEXT: movaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; MINGW-X64-NEXT: .seh_savexmm %xmm6, 96
+; MINGW-X64-NEXT: .seh_endprologue
+; MINGW-X64-NEXT: movq %r9, %rsi
+; MINGW-X64-NEXT: movq %r8, %rdi
+; MINGW-X64-NEXT: movq %rdx, %rbx
+; MINGW-X64-NEXT: movq %rcx, %r14
+; MINGW-X64-NEXT: movq {{[0-9]+}}(%rsp), %r15
+; MINGW-X64-NEXT: movq {{[0-9]+}}(%rsp), %r12
+; MINGW-X64-NEXT: movq %r9, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movq %r8, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
+; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
+; MINGW-X64-NEXT: callq __udivti3
+; MINGW-X64-NEXT: movaps %xmm0, %xmm6
+; MINGW-X64-NEXT: movq %rsi, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movq %rdi, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
+; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
+; MINGW-X64-NEXT: callq __umodti3
+; MINGW-X64-NEXT: movaps %xmm6, (%r14)
+; MINGW-X64-NEXT: movaps %xmm0, (%rbx)
+; MINGW-X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload
+; MINGW-X64-NEXT: .seh_startepilogue
+; MINGW-X64-NEXT: addq $120, %rsp
+; MINGW-X64-NEXT: popq %rbx
+; MINGW-X64-NEXT: popq %rdi
+; MINGW-X64-NEXT: popq %rsi
+; MINGW-X64-NEXT: popq %r12
+; MINGW-X64-NEXT: popq %r14
+; MINGW-X64-NEXT: popq %r15
+; MINGW-X64-NEXT: .seh_endepilogue
+; MINGW-X64-NEXT: retq
+; MINGW-X64-NEXT: .seh_endproc
+;
+; WIN64-LABEL: udivrem_i128:
+; WIN64: # %bb.0:
+; WIN64-NEXT: pushq %r15
+; WIN64-NEXT: .seh_pushreg %r15
+; WIN64-NEXT: pushq %r14
+; WIN64-NEXT: .seh_pushreg %r14
+; WIN64-NEXT: pushq %r12
+; WIN64-NEXT: .seh_pushreg %r12
+; WIN64-NEXT: pushq %rsi
+; WIN64-NEXT: .seh_pushreg %rsi
+; WIN64-NEXT: pushq %rdi
+; WIN64-NEXT: .seh_pushreg %rdi
+; WIN64-NEXT: pushq %rbx
+; WIN64-NEXT: .seh_pushreg %rbx
+; WIN64-NEXT: subq $120, %rsp
+; WIN64-NEXT: .seh_stackalloc 120
+; WIN64-NEXT: movaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
+; WIN64-NEXT: .seh_savexmm %xmm6, 96
+; WIN64-NEXT: .seh_endprologue
+; WIN64-NEXT: movq %r9, %rsi
+; WIN64-NEXT: movq %r8, %rdi
+; WIN64-NEXT: movq %rdx, %rbx
+; WIN64-NEXT: movq %rcx, %r14
+; WIN64-NEXT: movq {{[0-9]+}}(%rsp), %r15
+; WIN64-NEXT: movq {{[0-9]+}}(%rsp), %r12
+; WIN64-NEXT: movq %r9, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movq %r8, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
+; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
+; WIN64-NEXT: callq __udivti3
+; WIN64-NEXT: movaps %xmm0, %xmm6
+; WIN64-NEXT: movq %rsi, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movq %rdi, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
+; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
+; WIN64-NEXT: callq __umodti3
+; WIN64-NEXT: movaps %xmm6, (%r14)
+; WIN64-NEXT: movaps %xmm0, (%rbx)
+; WIN64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload
+; WIN64-NEXT: .seh_startepilogue
+; WIN64-NEXT: addq $120, %rsp
+; WIN64-NEXT: popq %rbx
+; WIN64-NEXT: popq %rdi
+; WIN64-NEXT: popq %rsi
+; WIN64-NEXT: popq %r12
+; WIN64-NEXT: popq %r14
+; WIN64-NEXT: popq %r15
+; WIN64-NEXT: .seh_endepilogue
+; WIN64-NEXT: retq
+; WIN64-NEXT: .seh_endproc
+ %q = udiv i128 %n, %d
+ %r = urem i128 %n, %d
+ store i128 %q, ptr %q_out
+ store i128 %r, ptr %r_out
+ ret void
+}
>From f965422146f9649b92e14475a39f756cace5a57f Mon Sep 17 00:00:00 2001
From: Takashiidobe <idobetakashi at gmail.com>
Date: Fri, 1 May 2026 07:59:23 -0400
Subject: [PATCH 2/2] fuse i128 divrem into divmodti4
---
llvm/include/llvm/IR/RuntimeLibcalls.td | 2 +
llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp | 5 +-
.../SelectionDAG/LegalizeIntegerTypes.cpp | 68 ++
llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h | 3 +
llvm/lib/Target/X86/X86ISelLowering.cpp | 73 +++
llvm/lib/Target/X86/X86ISelLowering.h | 2 +
.../CodeGen/AArch64/i128-divrem-libcall.ll | 204 ++----
.../CodeGen/LoongArch/i128-divrem-libcall.ll | 136 ++--
.../CodeGen/PowerPC/i128-divrem-libcall.ll | 132 ++--
.../CodeGen/RISCV/i128-divrem-libcall-rv64.ll | 146 ++---
.../test/CodeGen/SPARC/i128-divrem-libcall.ll | 56 +-
.../CodeGen/SystemZ/i128-divrem-libcall.ll | 114 ++--
.../WebAssembly/i128-divrem-libcall.ll | 76 +--
.../CodeGen/X86/i128-divrem-libcall-x86-64.ll | 582 +++++-------------
14 files changed, 598 insertions(+), 1001 deletions(-)
diff --git a/llvm/include/llvm/IR/RuntimeLibcalls.td b/llvm/include/llvm/IR/RuntimeLibcalls.td
index a09825dfa43dc..7ef564bfea176 100644
--- a/llvm/include/llvm/IR/RuntimeLibcalls.td
+++ b/llvm/include/llvm/IR/RuntimeLibcalls.td
@@ -1788,6 +1788,8 @@ defset list<RuntimeLibcallImpl> Int128RTLibcalls = {
def __lshrti3 : RuntimeLibcallImpl<SRL_I128>;
def __ashrti3 : RuntimeLibcallImpl<SRA_I128>;
def __multi3 : RuntimeLibcallImpl<MUL_I128>;
+ def __divmodti4 : RuntimeLibcallImpl<SDIVREM_I128>;
+ def __udivmodti4 : RuntimeLibcallImpl<UDIVREM_I128>;
}
//--------------------------------------------------------------------
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index 974a6db97e122..8baddd62b1f93 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -5110,7 +5110,10 @@ SDValue DAGCombiner::useDivRem(SDNode *Node) {
if (VT.isVector() || !VT.isInteger())
return SDValue();
- if (!TLI.isTypeLegal(VT) && !TLI.isOperationCustom(DivRemOpc, VT))
+ // for non-legal types, only form DIVREM if the expander can handle it
+ // ExpandIntRes_DIVREM currently only handles i128.
+ if (!TLI.isTypeLegal(VT) && !TLI.isOperationCustom(DivRemOpc, VT) &&
+ (VT != MVT::i128 || !isDivRemLibcallAvailable(Node, isSigned, DAG)))
return SDValue();
// If DIVREM is going to get expanded into a libcall,
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
index e7bf5a74cba34..7f525574e82d5 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeIntegerTypes.cpp
@@ -3165,6 +3165,10 @@ void DAGTypeLegalizer::ExpandIntegerResult(SDNode *N, unsigned ResNo) {
case ISD::READCYCLECOUNTER:
case ISD::READSTEADYCOUNTER: ExpandIntRes_READCOUNTER(N, Lo, Hi); break;
case ISD::SDIV: ExpandIntRes_SDIV(N, Lo, Hi); break;
+ case ISD::SDIVREM:
+ case ISD::UDIVREM:
+ ExpandIntRes_DIVREM(N, ResNo, Lo, Hi);
+ break;
case ISD::SIGN_EXTEND: ExpandIntRes_SIGN_EXTEND(N, Lo, Hi); break;
case ISD::SIGN_EXTEND_INREG: ExpandIntRes_SIGN_EXTEND_INREG(N, Lo, Hi); break;
case ISD::SREM: ExpandIntRes_SREM(N, Lo, Hi); break;
@@ -4952,6 +4956,70 @@ void DAGTypeLegalizer::ExpandIntRes_SADDSUBO(SDNode *Node,
ReplaceValueWith(SDValue(Node, 1), Ovf);
}
+void DAGTypeLegalizer::ExpandIntRes_DIVREM(SDNode *N, unsigned ResNo,
+ SDValue &Lo, SDValue &Hi) {
+ SDLoc dl(N);
+ EVT VT = N->getValueType(0);
+ bool IsSigned = (N->getOpcode() == ISD::SDIVREM);
+
+ RTLIB::Libcall LC = IsSigned ? RTLIB::SDIVREM_I128 : RTLIB::UDIVREM_I128;
+ assert(VT == MVT::i128 && "ExpandIntRes_DIVREM only handles i128");
+
+ // fall back to separate div and rem if no fused libcall is available.
+ if (VT != MVT::i128 ||
+ DAG.getLibcalls().getLibcallImpl(LC) == RTLIB::Unsupported) {
+ unsigned DivOp = IsSigned ? ISD::SDIV : ISD::UDIV;
+ unsigned RemOp = IsSigned ? ISD::SREM : ISD::UREM;
+ SDValue Ops[2] = {N->getOperand(0), N->getOperand(1)};
+ SDValue Q = DAG.getNode(DivOp, dl, VT, Ops);
+ SDValue R = DAG.getNode(RemOp, dl, VT, Ops);
+ assert(ResNo == 0 && "Legalizer always starts with first illegal result");
+ SplitInteger(Q, Lo, Hi);
+ ReplaceValueWith(SDValue(N, 1), R);
+ return;
+ }
+
+ // emit __divmodti4 / __udivmodti4:
+ // RetTy libcall(RetTy a, RetTy b, RetTy *rem)
+ // the quotient is the return value; the remainder is written via pointer.
+ Type *RetTy = VT.getTypeForEVT(*DAG.getContext());
+ TargetLowering::ArgListTy Args;
+ for (const SDValue &Op : N->op_values()) {
+ TargetLowering::ArgListEntry Entry(
+ Op, Op.getValueType().getTypeForEVT(*DAG.getContext()));
+ Entry.IsSExt = IsSigned;
+ Entry.IsZExt = !IsSigned;
+ Args.push_back(Entry);
+ }
+
+ SDValue FIPtr = DAG.CreateStackTemporary(VT);
+ TargetLowering::ArgListEntry PtrEntry(
+ FIPtr, PointerType::getUnqual(RetTy->getContext()));
+ Args.push_back(PtrEntry);
+
+ RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
+ TargetLowering::CallLoweringInfo CLI(DAG);
+ CLI.setDebugLoc(dl)
+ .setChain(DAG.getEntryNode())
+ .setLibCallee(DAG.getLibcalls().getLibcallImplCallingConv(LCImpl), RetTy,
+ DAG.getExternalSymbol(
+ LCImpl, TLI.getProgramPointerTy(DAG.getDataLayout())),
+ std::move(Args))
+ .setSExtResult(IsSigned)
+ .setZExtResult(!IsSigned);
+
+ std::pair<SDValue, SDValue> CallInfo = TLI.LowerCallTo(CLI);
+
+ int FI = cast<FrameIndexSDNode>(FIPtr)->getIndex();
+ SDValue Rem = DAG.getLoad(
+ VT, dl, CallInfo.second, FIPtr,
+ MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), FI));
+
+ assert(ResNo == 0 && "Legalizer always starts with first illegal result");
+ SplitInteger(CallInfo.first, Lo, Hi);
+ ReplaceValueWith(SDValue(N, 1), Rem);
+}
+
void DAGTypeLegalizer::ExpandIntRes_SDIV(SDNode *N,
SDValue &Lo, SDValue &Hi) {
EVT VT = N->getValueType(0);
diff --git a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
index 89698a2c77123..2c9de5e98b4f1 100644
--- a/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
+++ b/llvm/lib/CodeGen/SelectionDAG/LegalizeTypes.h
@@ -444,6 +444,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
// Integer Result Expansion.
void ExpandIntegerResult(SDNode *N, unsigned ResNo);
+ // clang-format off
void ExpandIntRes_ANY_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_AssertSext (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_AssertZext (SDNode *N, SDValue &Lo, SDValue &Hi);
@@ -475,6 +476,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
void ExpandIntRes_BSWAP (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_PARITY (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_MUL (SDNode *N, SDValue &Lo, SDValue &Hi);
+ void ExpandIntRes_DIVREM (SDNode *N, unsigned ResNo, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_SDIV (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_SREM (SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_UDIV (SDNode *N, SDValue &Lo, SDValue &Hi);
@@ -504,6 +506,7 @@ class LLVM_LIBRARY_VISIBILITY DAGTypeLegalizer {
void ExpandIntRes_CLMUL(SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_VSCALE (SDNode *N, SDValue &Lo, SDValue &Hi);
+ // clang-format on
void ExpandIntRes_READ_REGISTER(SDNode *N, SDValue &Lo, SDValue &Hi);
void ExpandIntRes_CTTZ_ELTS(SDNode *N, SDValue &Lo, SDValue &Hi);
diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp
index 39e229fcedbbe..c081d64037044 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.cpp
+++ b/llvm/lib/Target/X86/X86ISelLowering.cpp
@@ -2683,6 +2683,8 @@ X86TargetLowering::X86TargetLowering(const X86TargetMachine &TM,
setOperationAction(ISD::UDIV, MVT::i128, Custom);
setOperationAction(ISD::SREM, MVT::i128, Custom);
setOperationAction(ISD::UREM, MVT::i128, Custom);
+ setOperationAction(ISD::SDIVREM, MVT::i128, Custom);
+ setOperationAction(ISD::UDIVREM, MVT::i128, Custom);
setOperationAction(ISD::FP_TO_SINT, MVT::i128, Custom);
setOperationAction(ISD::FP_TO_UINT, MVT::i128, Custom);
setOperationAction(ISD::SINT_TO_FP, MVT::i128, Custom);
@@ -30748,6 +30750,68 @@ SDValue X86TargetLowering::LowerWin64_i128OP(SDValue Op, SelectionDAG &DAG) cons
return DAG.getBitcast(VT, CallInfo.first);
}
+void X86TargetLowering::LowerWin64_i128DIVREM(SDNode *N, SelectionDAG &DAG,
+ SDValue &Quot,
+ SDValue &Rem) const {
+ assert(Subtarget.isTargetWin64() && "Unexpected target");
+ EVT VT = N->getValueType(0);
+ assert(VT == MVT::i128 && "Unexpected type");
+
+ bool IsSigned = N->getOpcode() == ISD::SDIVREM;
+ RTLIB::Libcall LC = IsSigned ? RTLIB::SDIVREM_I128 : RTLIB::UDIVREM_I128;
+ RTLIB::LibcallImpl LCImpl = DAG.getLibcalls().getLibcallImpl(LC);
+
+ SDLoc dl(N);
+
+ // If no fused divrem libcall is available, fall back to separate div and rem.
+ if (LCImpl == RTLIB::Unsupported) {
+ unsigned DivOp = IsSigned ? ISD::SDIV : ISD::UDIV;
+ unsigned RemOp = IsSigned ? ISD::SREM : ISD::UREM;
+ Quot = DAG.getNode(DivOp, dl, VT, N->getOperand(0), N->getOperand(1));
+ Rem = DAG.getNode(RemOp, dl, VT, N->getOperand(0), N->getOperand(1));
+ return;
+ }
+ SDValue InChain = DAG.getEntryNode();
+
+ TargetLowering::ArgListTy Args;
+
+ // Spill both i128 inputs to stack temporaries and pass as pointers
+ for (unsigned i = 0; i < 2; ++i) {
+ EVT ArgVT = N->getOperand(i).getValueType();
+ assert(ArgVT == MVT::i128 && "Unexpected argument type");
+ SDValue StackPtr = DAG.CreateStackTemporary(ArgVT, 16);
+ int SPFI = cast<FrameIndexSDNode>(StackPtr.getNode())->getIndex();
+ MachinePointerInfo MPI =
+ MachinePointerInfo::getFixedStack(DAG.getMachineFunction(), SPFI);
+ InChain =
+ DAG.getStore(InChain, dl, N->getOperand(i), StackPtr, MPI, Align(16));
+ Args.emplace_back(StackPtr, PointerType::get(*DAG.getContext(), 0));
+ }
+
+ SDValue RemPtr = DAG.CreateStackTemporary(MVT::i128, 16);
+ int RemFI = cast<FrameIndexSDNode>(RemPtr.getNode())->getIndex();
+ MachineFunction &MF = DAG.getMachineFunction();
+ Args.emplace_back(RemPtr, PointerType::get(*DAG.getContext(), 0));
+
+ SDValue Callee =
+ DAG.getExternalSymbol(LCImpl, getProgramPointerTy(DAG.getDataLayout()));
+
+ TargetLowering::CallLoweringInfo CLI(DAG);
+ CLI.setDebugLoc(dl)
+ .setChain(InChain)
+ .setLibCallee(DAG.getLibcalls().getLibcallImplCallingConv(LCImpl),
+ EVT(MVT::v2i64).getTypeForEVT(*DAG.getContext()), Callee,
+ std::move(Args))
+ .setInRegister()
+ .setSExtResult(IsSigned)
+ .setZExtResult(!IsSigned);
+
+ std::pair<SDValue, SDValue> CallInfo = LowerCallTo(CLI);
+ Quot = DAG.getBitcast(VT, CallInfo.first);
+ Rem = DAG.getLoad(VT, dl, CallInfo.second, RemPtr,
+ MachinePointerInfo::getFixedStack(MF, RemFI), Align(16));
+}
+
SDValue X86TargetLowering::LowerWin64_FP_TO_INT128(SDValue Op,
SelectionDAG &DAG,
SDValue &Chain) const {
@@ -35141,6 +35205,15 @@ void X86TargetLowering::ReplaceNodeResults(SDNode *N,
Results.push_back(V);
return;
}
+ case ISD::SDIVREM:
+ case ISD::UDIVREM: {
+ assert(N->getValueType(0) == MVT::i128 && Subtarget.isTargetWin64());
+ SDValue Q, R;
+ LowerWin64_i128DIVREM(N, DAG, Q, R);
+ Results.push_back(Q);
+ Results.push_back(R);
+ return;
+ }
case ISD::TRUNCATE: {
MVT VT = N->getSimpleValueType(0);
if (getTypeAction(*DAG.getContext(), VT) != TypeWidenVector)
diff --git a/llvm/lib/Target/X86/X86ISelLowering.h b/llvm/lib/Target/X86/X86ISelLowering.h
index 515f28122a00a..c52a28a0d44c8 100644
--- a/llvm/lib/Target/X86/X86ISelLowering.h
+++ b/llvm/lib/Target/X86/X86ISelLowering.h
@@ -832,6 +832,8 @@ namespace llvm {
SDValue LowerSET_FPENV_MEM(SDValue Op, SelectionDAG &DAG) const;
SDValue LowerRESET_FPENV(SDValue Op, SelectionDAG &DAG) const;
SDValue LowerWin64_i128OP(SDValue Op, SelectionDAG &DAG) const;
+ void LowerWin64_i128DIVREM(SDNode *N, SelectionDAG &DAG, SDValue &Quot,
+ SDValue &Rem) const;
SDValue LowerWin64_FP_TO_INT128(SDValue Op, SelectionDAG &DAG,
SDValue &Chain) const;
SDValue LowerWin64_INT128_TO_FP(SDValue Op, SelectionDAG &DAG) const;
diff --git a/llvm/test/CodeGen/AArch64/i128-divrem-libcall.ll b/llvm/test/CodeGen/AArch64/i128-divrem-libcall.ll
index 21ca0e76a37dc..9fa2f4754acc0 100644
--- a/llvm/test/CodeGen/AArch64/i128-divrem-libcall.ll
+++ b/llvm/test/CodeGen/AArch64/i128-divrem-libcall.ll
@@ -6,91 +6,55 @@
define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; LINUX-A64-LABEL: sdivrem_i128:
; LINUX-A64: // %bb.0:
-; LINUX-A64-NEXT: str x30, [sp, #-80]! // 8-byte Folded Spill
-; LINUX-A64-NEXT: stp x26, x25, [sp, #16] // 16-byte Folded Spill
-; LINUX-A64-NEXT: stp x24, x23, [sp, #32] // 16-byte Folded Spill
-; LINUX-A64-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill
-; LINUX-A64-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill
-; LINUX-A64-NEXT: .cfi_def_cfa_offset 80
+; LINUX-A64-NEXT: sub sp, sp, #48
+; LINUX-A64-NEXT: str x30, [sp, #16] // 8-byte Spill
+; LINUX-A64-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
+; LINUX-A64-NEXT: .cfi_def_cfa_offset 48
; LINUX-A64-NEXT: .cfi_offset w19, -8
; LINUX-A64-NEXT: .cfi_offset w20, -16
-; LINUX-A64-NEXT: .cfi_offset w21, -24
-; LINUX-A64-NEXT: .cfi_offset w22, -32
-; LINUX-A64-NEXT: .cfi_offset w23, -40
-; LINUX-A64-NEXT: .cfi_offset w24, -48
-; LINUX-A64-NEXT: .cfi_offset w25, -56
-; LINUX-A64-NEXT: .cfi_offset w26, -64
-; LINUX-A64-NEXT: .cfi_offset w30, -80
-; LINUX-A64-NEXT: mov x21, x3
-; LINUX-A64-NEXT: mov x22, x2
-; LINUX-A64-NEXT: mov x23, x1
-; LINUX-A64-NEXT: mov x24, x0
+; LINUX-A64-NEXT: .cfi_offset w30, -32
+; LINUX-A64-NEXT: mov x8, x4
+; LINUX-A64-NEXT: mov x19, x1
+; LINUX-A64-NEXT: mov x20, x0
+; LINUX-A64-NEXT: mov x4, sp
; LINUX-A64-NEXT: mov x0, x2
; LINUX-A64-NEXT: mov x1, x3
-; LINUX-A64-NEXT: mov x2, x4
+; LINUX-A64-NEXT: mov x2, x8
; LINUX-A64-NEXT: mov x3, x5
-; LINUX-A64-NEXT: mov x19, x5
-; LINUX-A64-NEXT: mov x20, x4
-; LINUX-A64-NEXT: bl __divti3
-; LINUX-A64-NEXT: mov x25, x0
-; LINUX-A64-NEXT: mov x26, x1
-; LINUX-A64-NEXT: mov x0, x22
-; LINUX-A64-NEXT: mov x1, x21
-; LINUX-A64-NEXT: mov x2, x20
-; LINUX-A64-NEXT: mov x3, x19
-; LINUX-A64-NEXT: bl __modti3
-; LINUX-A64-NEXT: stp x25, x26, [x24]
-; LINUX-A64-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload
-; LINUX-A64-NEXT: stp x0, x1, [x23]
-; LINUX-A64-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload
-; LINUX-A64-NEXT: ldp x24, x23, [sp, #32] // 16-byte Folded Reload
-; LINUX-A64-NEXT: ldp x26, x25, [sp, #16] // 16-byte Folded Reload
-; LINUX-A64-NEXT: ldr x30, [sp], #80 // 8-byte Folded Reload
+; LINUX-A64-NEXT: bl __divmodti4
+; LINUX-A64-NEXT: ldp x9, x8, [sp]
+; LINUX-A64-NEXT: stp x0, x1, [x20]
+; LINUX-A64-NEXT: ldr x30, [sp, #16] // 8-byte Reload
+; LINUX-A64-NEXT: stp x9, x8, [x19]
+; LINUX-A64-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
+; LINUX-A64-NEXT: add sp, sp, #48
; LINUX-A64-NEXT: ret
;
; DARWIN-A64-LABEL: sdivrem_i128:
; DARWIN-A64: ; %bb.0:
-; DARWIN-A64-NEXT: stp x26, x25, [sp, #-80]! ; 16-byte Folded Spill
-; DARWIN-A64-NEXT: stp x24, x23, [sp, #16] ; 16-byte Folded Spill
-; DARWIN-A64-NEXT: stp x22, x21, [sp, #32] ; 16-byte Folded Spill
-; DARWIN-A64-NEXT: stp x20, x19, [sp, #48] ; 16-byte Folded Spill
-; DARWIN-A64-NEXT: stp x29, x30, [sp, #64] ; 16-byte Folded Spill
-; DARWIN-A64-NEXT: .cfi_def_cfa_offset 80
+; DARWIN-A64-NEXT: sub sp, sp, #48
+; DARWIN-A64-NEXT: stp x20, x19, [sp, #16] ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: .cfi_def_cfa_offset 48
; DARWIN-A64-NEXT: .cfi_offset w30, -8
; DARWIN-A64-NEXT: .cfi_offset w29, -16
; DARWIN-A64-NEXT: .cfi_offset w19, -24
; DARWIN-A64-NEXT: .cfi_offset w20, -32
-; DARWIN-A64-NEXT: .cfi_offset w21, -40
-; DARWIN-A64-NEXT: .cfi_offset w22, -48
-; DARWIN-A64-NEXT: .cfi_offset w23, -56
-; DARWIN-A64-NEXT: .cfi_offset w24, -64
-; DARWIN-A64-NEXT: .cfi_offset w25, -72
-; DARWIN-A64-NEXT: .cfi_offset w26, -80
-; DARWIN-A64-NEXT: mov x21, x3
-; DARWIN-A64-NEXT: mov x22, x2
-; DARWIN-A64-NEXT: mov x23, x1
-; DARWIN-A64-NEXT: mov x24, x0
+; DARWIN-A64-NEXT: mov x8, x4
+; DARWIN-A64-NEXT: mov x19, x1
+; DARWIN-A64-NEXT: mov x20, x0
+; DARWIN-A64-NEXT: mov x4, sp
; DARWIN-A64-NEXT: mov x0, x2
; DARWIN-A64-NEXT: mov x1, x3
-; DARWIN-A64-NEXT: mov x2, x4
+; DARWIN-A64-NEXT: mov x2, x8
; DARWIN-A64-NEXT: mov x3, x5
-; DARWIN-A64-NEXT: mov x19, x5
-; DARWIN-A64-NEXT: mov x20, x4
-; DARWIN-A64-NEXT: bl ___divti3
-; DARWIN-A64-NEXT: mov x25, x0
-; DARWIN-A64-NEXT: mov x26, x1
-; DARWIN-A64-NEXT: mov x0, x22
-; DARWIN-A64-NEXT: mov x1, x21
-; DARWIN-A64-NEXT: mov x2, x20
-; DARWIN-A64-NEXT: mov x3, x19
-; DARWIN-A64-NEXT: bl ___modti3
-; DARWIN-A64-NEXT: stp x25, x26, [x24]
-; DARWIN-A64-NEXT: ldp x29, x30, [sp, #64] ; 16-byte Folded Reload
-; DARWIN-A64-NEXT: stp x0, x1, [x23]
-; DARWIN-A64-NEXT: ldp x20, x19, [sp, #48] ; 16-byte Folded Reload
-; DARWIN-A64-NEXT: ldp x22, x21, [sp, #32] ; 16-byte Folded Reload
-; DARWIN-A64-NEXT: ldp x24, x23, [sp, #16] ; 16-byte Folded Reload
-; DARWIN-A64-NEXT: ldp x26, x25, [sp], #80 ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: bl ___divmodti4
+; DARWIN-A64-NEXT: ldp x9, x8, [sp]
+; DARWIN-A64-NEXT: stp x0, x1, [x20]
+; DARWIN-A64-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: stp x9, x8, [x19]
+; DARWIN-A64-NEXT: ldp x20, x19, [sp, #16] ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: add sp, sp, #48
; DARWIN-A64-NEXT: ret
;
; WATCHOS-LABEL: sdivrem_i128:
@@ -147,91 +111,55 @@ define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; LINUX-A64-LABEL: udivrem_i128:
; LINUX-A64: // %bb.0:
-; LINUX-A64-NEXT: str x30, [sp, #-80]! // 8-byte Folded Spill
-; LINUX-A64-NEXT: stp x26, x25, [sp, #16] // 16-byte Folded Spill
-; LINUX-A64-NEXT: stp x24, x23, [sp, #32] // 16-byte Folded Spill
-; LINUX-A64-NEXT: stp x22, x21, [sp, #48] // 16-byte Folded Spill
-; LINUX-A64-NEXT: stp x20, x19, [sp, #64] // 16-byte Folded Spill
-; LINUX-A64-NEXT: .cfi_def_cfa_offset 80
+; LINUX-A64-NEXT: sub sp, sp, #48
+; LINUX-A64-NEXT: str x30, [sp, #16] // 8-byte Spill
+; LINUX-A64-NEXT: stp x20, x19, [sp, #32] // 16-byte Folded Spill
+; LINUX-A64-NEXT: .cfi_def_cfa_offset 48
; LINUX-A64-NEXT: .cfi_offset w19, -8
; LINUX-A64-NEXT: .cfi_offset w20, -16
-; LINUX-A64-NEXT: .cfi_offset w21, -24
-; LINUX-A64-NEXT: .cfi_offset w22, -32
-; LINUX-A64-NEXT: .cfi_offset w23, -40
-; LINUX-A64-NEXT: .cfi_offset w24, -48
-; LINUX-A64-NEXT: .cfi_offset w25, -56
-; LINUX-A64-NEXT: .cfi_offset w26, -64
-; LINUX-A64-NEXT: .cfi_offset w30, -80
-; LINUX-A64-NEXT: mov x21, x3
-; LINUX-A64-NEXT: mov x22, x2
-; LINUX-A64-NEXT: mov x23, x1
-; LINUX-A64-NEXT: mov x24, x0
+; LINUX-A64-NEXT: .cfi_offset w30, -32
+; LINUX-A64-NEXT: mov x8, x4
+; LINUX-A64-NEXT: mov x19, x1
+; LINUX-A64-NEXT: mov x20, x0
+; LINUX-A64-NEXT: mov x4, sp
; LINUX-A64-NEXT: mov x0, x2
; LINUX-A64-NEXT: mov x1, x3
-; LINUX-A64-NEXT: mov x2, x4
+; LINUX-A64-NEXT: mov x2, x8
; LINUX-A64-NEXT: mov x3, x5
-; LINUX-A64-NEXT: mov x19, x5
-; LINUX-A64-NEXT: mov x20, x4
-; LINUX-A64-NEXT: bl __udivti3
-; LINUX-A64-NEXT: mov x25, x0
-; LINUX-A64-NEXT: mov x26, x1
-; LINUX-A64-NEXT: mov x0, x22
-; LINUX-A64-NEXT: mov x1, x21
-; LINUX-A64-NEXT: mov x2, x20
-; LINUX-A64-NEXT: mov x3, x19
-; LINUX-A64-NEXT: bl __umodti3
-; LINUX-A64-NEXT: stp x25, x26, [x24]
-; LINUX-A64-NEXT: ldp x20, x19, [sp, #64] // 16-byte Folded Reload
-; LINUX-A64-NEXT: stp x0, x1, [x23]
-; LINUX-A64-NEXT: ldp x22, x21, [sp, #48] // 16-byte Folded Reload
-; LINUX-A64-NEXT: ldp x24, x23, [sp, #32] // 16-byte Folded Reload
-; LINUX-A64-NEXT: ldp x26, x25, [sp, #16] // 16-byte Folded Reload
-; LINUX-A64-NEXT: ldr x30, [sp], #80 // 8-byte Folded Reload
+; LINUX-A64-NEXT: bl __udivmodti4
+; LINUX-A64-NEXT: ldp x9, x8, [sp]
+; LINUX-A64-NEXT: stp x0, x1, [x20]
+; LINUX-A64-NEXT: ldr x30, [sp, #16] // 8-byte Reload
+; LINUX-A64-NEXT: stp x9, x8, [x19]
+; LINUX-A64-NEXT: ldp x20, x19, [sp, #32] // 16-byte Folded Reload
+; LINUX-A64-NEXT: add sp, sp, #48
; LINUX-A64-NEXT: ret
;
; DARWIN-A64-LABEL: udivrem_i128:
; DARWIN-A64: ; %bb.0:
-; DARWIN-A64-NEXT: stp x26, x25, [sp, #-80]! ; 16-byte Folded Spill
-; DARWIN-A64-NEXT: stp x24, x23, [sp, #16] ; 16-byte Folded Spill
-; DARWIN-A64-NEXT: stp x22, x21, [sp, #32] ; 16-byte Folded Spill
-; DARWIN-A64-NEXT: stp x20, x19, [sp, #48] ; 16-byte Folded Spill
-; DARWIN-A64-NEXT: stp x29, x30, [sp, #64] ; 16-byte Folded Spill
-; DARWIN-A64-NEXT: .cfi_def_cfa_offset 80
+; DARWIN-A64-NEXT: sub sp, sp, #48
+; DARWIN-A64-NEXT: stp x20, x19, [sp, #16] ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: stp x29, x30, [sp, #32] ; 16-byte Folded Spill
+; DARWIN-A64-NEXT: .cfi_def_cfa_offset 48
; DARWIN-A64-NEXT: .cfi_offset w30, -8
; DARWIN-A64-NEXT: .cfi_offset w29, -16
; DARWIN-A64-NEXT: .cfi_offset w19, -24
; DARWIN-A64-NEXT: .cfi_offset w20, -32
-; DARWIN-A64-NEXT: .cfi_offset w21, -40
-; DARWIN-A64-NEXT: .cfi_offset w22, -48
-; DARWIN-A64-NEXT: .cfi_offset w23, -56
-; DARWIN-A64-NEXT: .cfi_offset w24, -64
-; DARWIN-A64-NEXT: .cfi_offset w25, -72
-; DARWIN-A64-NEXT: .cfi_offset w26, -80
-; DARWIN-A64-NEXT: mov x21, x3
-; DARWIN-A64-NEXT: mov x22, x2
-; DARWIN-A64-NEXT: mov x23, x1
-; DARWIN-A64-NEXT: mov x24, x0
+; DARWIN-A64-NEXT: mov x8, x4
+; DARWIN-A64-NEXT: mov x19, x1
+; DARWIN-A64-NEXT: mov x20, x0
+; DARWIN-A64-NEXT: mov x4, sp
; DARWIN-A64-NEXT: mov x0, x2
; DARWIN-A64-NEXT: mov x1, x3
-; DARWIN-A64-NEXT: mov x2, x4
+; DARWIN-A64-NEXT: mov x2, x8
; DARWIN-A64-NEXT: mov x3, x5
-; DARWIN-A64-NEXT: mov x19, x5
-; DARWIN-A64-NEXT: mov x20, x4
-; DARWIN-A64-NEXT: bl ___udivti3
-; DARWIN-A64-NEXT: mov x25, x0
-; DARWIN-A64-NEXT: mov x26, x1
-; DARWIN-A64-NEXT: mov x0, x22
-; DARWIN-A64-NEXT: mov x1, x21
-; DARWIN-A64-NEXT: mov x2, x20
-; DARWIN-A64-NEXT: mov x3, x19
-; DARWIN-A64-NEXT: bl ___umodti3
-; DARWIN-A64-NEXT: stp x25, x26, [x24]
-; DARWIN-A64-NEXT: ldp x29, x30, [sp, #64] ; 16-byte Folded Reload
-; DARWIN-A64-NEXT: stp x0, x1, [x23]
-; DARWIN-A64-NEXT: ldp x20, x19, [sp, #48] ; 16-byte Folded Reload
-; DARWIN-A64-NEXT: ldp x22, x21, [sp, #32] ; 16-byte Folded Reload
-; DARWIN-A64-NEXT: ldp x24, x23, [sp, #16] ; 16-byte Folded Reload
-; DARWIN-A64-NEXT: ldp x26, x25, [sp], #80 ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: bl ___udivmodti4
+; DARWIN-A64-NEXT: ldp x9, x8, [sp]
+; DARWIN-A64-NEXT: stp x0, x1, [x20]
+; DARWIN-A64-NEXT: ldp x29, x30, [sp, #32] ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: stp x9, x8, [x19]
+; DARWIN-A64-NEXT: ldp x20, x19, [sp, #16] ; 16-byte Folded Reload
+; DARWIN-A64-NEXT: add sp, sp, #48
; DARWIN-A64-NEXT: ret
;
; WATCHOS-LABEL: udivrem_i128:
diff --git a/llvm/test/CodeGen/LoongArch/i128-divrem-libcall.ll b/llvm/test/CodeGen/LoongArch/i128-divrem-libcall.ll
index 47ac12c03638a..8365395f357a6 100644
--- a/llvm/test/CodeGen/LoongArch/i128-divrem-libcall.ll
+++ b/llvm/test/CodeGen/LoongArch/i128-divrem-libcall.ll
@@ -4,60 +4,34 @@
define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; CHECK-LABEL: sdivrem_i128:
; CHECK: # %bb.0:
-; CHECK-NEXT: addi.d $sp, $sp, -80
-; CHECK-NEXT: .cfi_def_cfa_offset 80
-; CHECK-NEXT: st.d $ra, $sp, 72 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $fp, $sp, 64 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s0, $sp, 56 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s1, $sp, 48 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s2, $sp, 40 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s3, $sp, 32 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s4, $sp, 24 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s5, $sp, 16 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s6, $sp, 8 # 8-byte Folded Spill
+; CHECK-NEXT: addi.d $sp, $sp, -48
+; CHECK-NEXT: .cfi_def_cfa_offset 48
+; CHECK-NEXT: st.d $ra, $sp, 40 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $fp, $sp, 32 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s0, $sp, 24 # 8-byte Folded Spill
; CHECK-NEXT: .cfi_offset 1, -8
; CHECK-NEXT: .cfi_offset 22, -16
; CHECK-NEXT: .cfi_offset 23, -24
-; CHECK-NEXT: .cfi_offset 24, -32
-; CHECK-NEXT: .cfi_offset 25, -40
-; CHECK-NEXT: .cfi_offset 26, -48
-; CHECK-NEXT: .cfi_offset 27, -56
-; CHECK-NEXT: .cfi_offset 28, -64
-; CHECK-NEXT: .cfi_offset 29, -72
-; CHECK-NEXT: move $fp, $a5
-; CHECK-NEXT: move $s0, $a4
-; CHECK-NEXT: move $s1, $a3
-; CHECK-NEXT: move $s2, $a2
-; CHECK-NEXT: move $s3, $a1
-; CHECK-NEXT: move $s4, $a0
+; CHECK-NEXT: move $a6, $a4
+; CHECK-NEXT: move $fp, $a1
+; CHECK-NEXT: move $s0, $a0
+; CHECK-NEXT: addi.d $a4, $sp, 0
; CHECK-NEXT: move $a0, $a2
; CHECK-NEXT: move $a1, $a3
-; CHECK-NEXT: move $a2, $a4
+; CHECK-NEXT: move $a2, $a6
; CHECK-NEXT: move $a3, $a5
-; CHECK-NEXT: pcaddu18i $ra, %call36(__divti3)
+; CHECK-NEXT: pcaddu18i $ra, %call36(__divmodti4)
; CHECK-NEXT: jirl $ra, $ra, 0
-; CHECK-NEXT: move $s5, $a0
-; CHECK-NEXT: move $s6, $a1
-; CHECK-NEXT: move $a0, $s2
-; CHECK-NEXT: move $a1, $s1
-; CHECK-NEXT: move $a2, $s0
-; CHECK-NEXT: move $a3, $fp
-; CHECK-NEXT: pcaddu18i $ra, %call36(__modti3)
-; CHECK-NEXT: jirl $ra, $ra, 0
-; CHECK-NEXT: st.d $s5, $s4, 0
-; CHECK-NEXT: st.d $s6, $s4, 8
-; CHECK-NEXT: st.d $a0, $s3, 0
-; CHECK-NEXT: st.d $a1, $s3, 8
-; CHECK-NEXT: ld.d $s6, $sp, 8 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $s5, $sp, 16 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $s4, $sp, 24 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $s3, $sp, 32 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $s2, $sp, 40 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $s1, $sp, 48 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $s0, $sp, 56 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $fp, $sp, 64 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $ra, $sp, 72 # 8-byte Folded Reload
-; CHECK-NEXT: addi.d $sp, $sp, 80
+; CHECK-NEXT: ld.d $a2, $sp, 0
+; CHECK-NEXT: ld.d $a3, $sp, 8
+; CHECK-NEXT: st.d $a0, $s0, 0
+; CHECK-NEXT: st.d $a1, $s0, 8
+; CHECK-NEXT: st.d $a2, $fp, 0
+; CHECK-NEXT: st.d $a3, $fp, 8
+; CHECK-NEXT: ld.d $s0, $sp, 24 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $fp, $sp, 32 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $ra, $sp, 40 # 8-byte Folded Reload
+; CHECK-NEXT: addi.d $sp, $sp, 48
; CHECK-NEXT: ret
%q = sdiv i128 %n, %d
%r = srem i128 %n, %d
@@ -69,60 +43,34 @@ define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; CHECK-LABEL: udivrem_i128:
; CHECK: # %bb.0:
-; CHECK-NEXT: addi.d $sp, $sp, -80
-; CHECK-NEXT: .cfi_def_cfa_offset 80
-; CHECK-NEXT: st.d $ra, $sp, 72 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $fp, $sp, 64 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s0, $sp, 56 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s1, $sp, 48 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s2, $sp, 40 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s3, $sp, 32 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s4, $sp, 24 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s5, $sp, 16 # 8-byte Folded Spill
-; CHECK-NEXT: st.d $s6, $sp, 8 # 8-byte Folded Spill
+; CHECK-NEXT: addi.d $sp, $sp, -48
+; CHECK-NEXT: .cfi_def_cfa_offset 48
+; CHECK-NEXT: st.d $ra, $sp, 40 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $fp, $sp, 32 # 8-byte Folded Spill
+; CHECK-NEXT: st.d $s0, $sp, 24 # 8-byte Folded Spill
; CHECK-NEXT: .cfi_offset 1, -8
; CHECK-NEXT: .cfi_offset 22, -16
; CHECK-NEXT: .cfi_offset 23, -24
-; CHECK-NEXT: .cfi_offset 24, -32
-; CHECK-NEXT: .cfi_offset 25, -40
-; CHECK-NEXT: .cfi_offset 26, -48
-; CHECK-NEXT: .cfi_offset 27, -56
-; CHECK-NEXT: .cfi_offset 28, -64
-; CHECK-NEXT: .cfi_offset 29, -72
-; CHECK-NEXT: move $fp, $a5
-; CHECK-NEXT: move $s0, $a4
-; CHECK-NEXT: move $s1, $a3
-; CHECK-NEXT: move $s2, $a2
-; CHECK-NEXT: move $s3, $a1
-; CHECK-NEXT: move $s4, $a0
+; CHECK-NEXT: move $a6, $a4
+; CHECK-NEXT: move $fp, $a1
+; CHECK-NEXT: move $s0, $a0
+; CHECK-NEXT: addi.d $a4, $sp, 0
; CHECK-NEXT: move $a0, $a2
; CHECK-NEXT: move $a1, $a3
-; CHECK-NEXT: move $a2, $a4
+; CHECK-NEXT: move $a2, $a6
; CHECK-NEXT: move $a3, $a5
-; CHECK-NEXT: pcaddu18i $ra, %call36(__udivti3)
-; CHECK-NEXT: jirl $ra, $ra, 0
-; CHECK-NEXT: move $s5, $a0
-; CHECK-NEXT: move $s6, $a1
-; CHECK-NEXT: move $a0, $s2
-; CHECK-NEXT: move $a1, $s1
-; CHECK-NEXT: move $a2, $s0
-; CHECK-NEXT: move $a3, $fp
-; CHECK-NEXT: pcaddu18i $ra, %call36(__umodti3)
+; CHECK-NEXT: pcaddu18i $ra, %call36(__udivmodti4)
; CHECK-NEXT: jirl $ra, $ra, 0
-; CHECK-NEXT: st.d $s5, $s4, 0
-; CHECK-NEXT: st.d $s6, $s4, 8
-; CHECK-NEXT: st.d $a0, $s3, 0
-; CHECK-NEXT: st.d $a1, $s3, 8
-; CHECK-NEXT: ld.d $s6, $sp, 8 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $s5, $sp, 16 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $s4, $sp, 24 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $s3, $sp, 32 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $s2, $sp, 40 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $s1, $sp, 48 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $s0, $sp, 56 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $fp, $sp, 64 # 8-byte Folded Reload
-; CHECK-NEXT: ld.d $ra, $sp, 72 # 8-byte Folded Reload
-; CHECK-NEXT: addi.d $sp, $sp, 80
+; CHECK-NEXT: ld.d $a2, $sp, 0
+; CHECK-NEXT: ld.d $a3, $sp, 8
+; CHECK-NEXT: st.d $a0, $s0, 0
+; CHECK-NEXT: st.d $a1, $s0, 8
+; CHECK-NEXT: st.d $a2, $fp, 0
+; CHECK-NEXT: st.d $a3, $fp, 8
+; CHECK-NEXT: ld.d $s0, $sp, 24 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $fp, $sp, 32 # 8-byte Folded Reload
+; CHECK-NEXT: ld.d $ra, $sp, 40 # 8-byte Folded Reload
+; CHECK-NEXT: addi.d $sp, $sp, 48
; CHECK-NEXT: ret
%q = udiv i128 %n, %d
%r = urem i128 %n, %d
diff --git a/llvm/test/CodeGen/PowerPC/i128-divrem-libcall.ll b/llvm/test/CodeGen/PowerPC/i128-divrem-libcall.ll
index 289d40b0f6c80..7e26ac0384c3b 100644
--- a/llvm/test/CodeGen/PowerPC/i128-divrem-libcall.ll
+++ b/llvm/test/CodeGen/PowerPC/i128-divrem-libcall.ll
@@ -5,59 +5,33 @@ define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; CHECK-LABEL: sdivrem_i128:
; CHECK: # %bb.0:
; CHECK-NEXT: mflr 0
-; CHECK-NEXT: stdu 1, -192(1)
-; CHECK-NEXT: std 0, 208(1)
-; CHECK-NEXT: .cfi_def_cfa_offset 192
+; CHECK-NEXT: stdu 1, -160(1)
+; CHECK-NEXT: std 0, 176(1)
+; CHECK-NEXT: .cfi_def_cfa_offset 160
; CHECK-NEXT: .cfi_offset lr, 16
-; CHECK-NEXT: .cfi_offset r23, -72
-; CHECK-NEXT: .cfi_offset r24, -64
-; CHECK-NEXT: .cfi_offset r25, -56
-; CHECK-NEXT: .cfi_offset r26, -48
-; CHECK-NEXT: .cfi_offset r27, -40
-; CHECK-NEXT: .cfi_offset r28, -32
; CHECK-NEXT: .cfi_offset r29, -24
; CHECK-NEXT: .cfi_offset r30, -16
-; CHECK-NEXT: std 25, 136(1) # 8-byte Folded Spill
-; CHECK-NEXT: mr 25, 3
+; CHECK-NEXT: mr 9, 7
+; CHECK-NEXT: std 29, 136(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 29, 3
+; CHECK-NEXT: addi 7, 1, 112
; CHECK-NEXT: mr 3, 5
-; CHECK-NEXT: std 26, 144(1) # 8-byte Folded Spill
-; CHECK-NEXT: mr 26, 4
+; CHECK-NEXT: std 30, 144(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 30, 4
; CHECK-NEXT: mr 4, 6
-; CHECK-NEXT: std 27, 152(1) # 8-byte Folded Spill
-; CHECK-NEXT: mr 27, 5
-; CHECK-NEXT: mr 5, 7
-; CHECK-NEXT: std 28, 160(1) # 8-byte Folded Spill
-; CHECK-NEXT: mr 28, 6
+; CHECK-NEXT: mr 5, 9
; CHECK-NEXT: mr 6, 8
-; CHECK-NEXT: std 23, 120(1) # 8-byte Folded Spill
-; CHECK-NEXT: std 24, 128(1) # 8-byte Folded Spill
-; CHECK-NEXT: std 29, 168(1) # 8-byte Folded Spill
-; CHECK-NEXT: mr 29, 7
-; CHECK-NEXT: std 30, 176(1) # 8-byte Folded Spill
-; CHECK-NEXT: mr 30, 8
-; CHECK-NEXT: bl __divti3
+; CHECK-NEXT: bl __divmodti4
; CHECK-NEXT: nop
-; CHECK-NEXT: mr 24, 3
-; CHECK-NEXT: mr 23, 4
-; CHECK-NEXT: mr 3, 27
-; CHECK-NEXT: mr 4, 28
-; CHECK-NEXT: mr 5, 29
-; CHECK-NEXT: mr 6, 30
-; CHECK-NEXT: bl __modti3
-; CHECK-NEXT: nop
-; CHECK-NEXT: std 24, 0(25)
-; CHECK-NEXT: std 23, 8(25)
-; CHECK-NEXT: std 3, 0(26)
-; CHECK-NEXT: std 4, 8(26)
-; CHECK-NEXT: ld 30, 176(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 29, 168(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 28, 160(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 27, 152(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 26, 144(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 25, 136(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 24, 128(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 23, 120(1) # 8-byte Folded Reload
-; CHECK-NEXT: addi 1, 1, 192
+; CHECK-NEXT: ld 5, 120(1)
+; CHECK-NEXT: ld 6, 112(1)
+; CHECK-NEXT: std 3, 0(29)
+; CHECK-NEXT: std 4, 8(29)
+; CHECK-NEXT: std 6, 0(30)
+; CHECK-NEXT: std 5, 8(30)
+; CHECK-NEXT: ld 30, 144(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 29, 136(1) # 8-byte Folded Reload
+; CHECK-NEXT: addi 1, 1, 160
; CHECK-NEXT: ld 0, 16(1)
; CHECK-NEXT: mtlr 0
; CHECK-NEXT: blr
@@ -72,59 +46,33 @@ define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; CHECK-LABEL: udivrem_i128:
; CHECK: # %bb.0:
; CHECK-NEXT: mflr 0
-; CHECK-NEXT: stdu 1, -192(1)
-; CHECK-NEXT: std 0, 208(1)
-; CHECK-NEXT: .cfi_def_cfa_offset 192
+; CHECK-NEXT: stdu 1, -160(1)
+; CHECK-NEXT: std 0, 176(1)
+; CHECK-NEXT: .cfi_def_cfa_offset 160
; CHECK-NEXT: .cfi_offset lr, 16
-; CHECK-NEXT: .cfi_offset r23, -72
-; CHECK-NEXT: .cfi_offset r24, -64
-; CHECK-NEXT: .cfi_offset r25, -56
-; CHECK-NEXT: .cfi_offset r26, -48
-; CHECK-NEXT: .cfi_offset r27, -40
-; CHECK-NEXT: .cfi_offset r28, -32
; CHECK-NEXT: .cfi_offset r29, -24
; CHECK-NEXT: .cfi_offset r30, -16
-; CHECK-NEXT: std 25, 136(1) # 8-byte Folded Spill
-; CHECK-NEXT: mr 25, 3
+; CHECK-NEXT: mr 9, 7
+; CHECK-NEXT: std 29, 136(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 29, 3
+; CHECK-NEXT: addi 7, 1, 112
; CHECK-NEXT: mr 3, 5
-; CHECK-NEXT: std 26, 144(1) # 8-byte Folded Spill
-; CHECK-NEXT: mr 26, 4
+; CHECK-NEXT: std 30, 144(1) # 8-byte Folded Spill
+; CHECK-NEXT: mr 30, 4
; CHECK-NEXT: mr 4, 6
-; CHECK-NEXT: std 27, 152(1) # 8-byte Folded Spill
-; CHECK-NEXT: mr 27, 5
-; CHECK-NEXT: mr 5, 7
-; CHECK-NEXT: std 28, 160(1) # 8-byte Folded Spill
-; CHECK-NEXT: mr 28, 6
+; CHECK-NEXT: mr 5, 9
; CHECK-NEXT: mr 6, 8
-; CHECK-NEXT: std 23, 120(1) # 8-byte Folded Spill
-; CHECK-NEXT: std 24, 128(1) # 8-byte Folded Spill
-; CHECK-NEXT: std 29, 168(1) # 8-byte Folded Spill
-; CHECK-NEXT: mr 29, 7
-; CHECK-NEXT: std 30, 176(1) # 8-byte Folded Spill
-; CHECK-NEXT: mr 30, 8
-; CHECK-NEXT: bl __udivti3
-; CHECK-NEXT: nop
-; CHECK-NEXT: mr 24, 3
-; CHECK-NEXT: mr 23, 4
-; CHECK-NEXT: mr 3, 27
-; CHECK-NEXT: mr 4, 28
-; CHECK-NEXT: mr 5, 29
-; CHECK-NEXT: mr 6, 30
-; CHECK-NEXT: bl __umodti3
+; CHECK-NEXT: bl __udivmodti4
; CHECK-NEXT: nop
-; CHECK-NEXT: std 24, 0(25)
-; CHECK-NEXT: std 23, 8(25)
-; CHECK-NEXT: std 3, 0(26)
-; CHECK-NEXT: std 4, 8(26)
-; CHECK-NEXT: ld 30, 176(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 29, 168(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 28, 160(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 27, 152(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 26, 144(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 25, 136(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 24, 128(1) # 8-byte Folded Reload
-; CHECK-NEXT: ld 23, 120(1) # 8-byte Folded Reload
-; CHECK-NEXT: addi 1, 1, 192
+; CHECK-NEXT: ld 5, 120(1)
+; CHECK-NEXT: ld 6, 112(1)
+; CHECK-NEXT: std 3, 0(29)
+; CHECK-NEXT: std 4, 8(29)
+; CHECK-NEXT: std 6, 0(30)
+; CHECK-NEXT: std 5, 8(30)
+; CHECK-NEXT: ld 30, 144(1) # 8-byte Folded Reload
+; CHECK-NEXT: ld 29, 136(1) # 8-byte Folded Reload
+; CHECK-NEXT: addi 1, 1, 160
; CHECK-NEXT: ld 0, 16(1)
; CHECK-NEXT: mtlr 0
; CHECK-NEXT: blr
diff --git a/llvm/test/CodeGen/RISCV/i128-divrem-libcall-rv64.ll b/llvm/test/CodeGen/RISCV/i128-divrem-libcall-rv64.ll
index f50a71ac17527..c8201d869b9db 100644
--- a/llvm/test/CodeGen/RISCV/i128-divrem-libcall-rv64.ll
+++ b/llvm/test/CodeGen/RISCV/i128-divrem-libcall-rv64.ll
@@ -5,67 +5,36 @@
define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; RV64-LABEL: sdivrem_i128:
; RV64: # %bb.0:
-; RV64-NEXT: addi sp, sp, -80
-; RV64-NEXT: .cfi_def_cfa_offset 80
-; RV64-NEXT: sd ra, 72(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s0, 64(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s1, 56(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s2, 48(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s3, 40(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s4, 32(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s5, 24(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s6, 16(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s7, 8(sp) # 8-byte Folded Spill
+; RV64-NEXT: addi sp, sp, -48
+; RV64-NEXT: .cfi_def_cfa_offset 48
+; RV64-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64-NEXT: .cfi_offset ra, -8
; RV64-NEXT: .cfi_offset s0, -16
; RV64-NEXT: .cfi_offset s1, -24
-; RV64-NEXT: .cfi_offset s2, -32
-; RV64-NEXT: .cfi_offset s3, -40
-; RV64-NEXT: .cfi_offset s4, -48
-; RV64-NEXT: .cfi_offset s5, -56
-; RV64-NEXT: .cfi_offset s6, -64
-; RV64-NEXT: .cfi_offset s7, -72
-; RV64-NEXT: mv s0, a5
-; RV64-NEXT: mv s1, a4
-; RV64-NEXT: mv s2, a3
-; RV64-NEXT: mv s3, a2
-; RV64-NEXT: mv s4, a1
-; RV64-NEXT: mv s5, a0
+; RV64-NEXT: mv a6, a4
+; RV64-NEXT: mv s0, a1
+; RV64-NEXT: mv s1, a0
+; RV64-NEXT: mv a4, sp
; RV64-NEXT: mv a0, a2
; RV64-NEXT: mv a1, a3
-; RV64-NEXT: mv a2, a4
+; RV64-NEXT: mv a2, a6
; RV64-NEXT: mv a3, a5
-; RV64-NEXT: call __divti3
-; RV64-NEXT: mv s6, a0
-; RV64-NEXT: mv s7, a1
-; RV64-NEXT: mv a0, s3
-; RV64-NEXT: mv a1, s2
-; RV64-NEXT: mv a2, s1
-; RV64-NEXT: mv a3, s0
-; RV64-NEXT: call __modti3
-; RV64-NEXT: sd s6, 0(s5)
-; RV64-NEXT: sd s7, 8(s5)
-; RV64-NEXT: sd a0, 0(s4)
-; RV64-NEXT: sd a1, 8(s4)
-; RV64-NEXT: ld ra, 72(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s0, 64(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s1, 56(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s2, 48(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s3, 40(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s4, 32(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s5, 24(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s6, 16(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s7, 8(sp) # 8-byte Folded Reload
+; RV64-NEXT: call __divmodti4
+; RV64-NEXT: ld a2, 0(sp)
+; RV64-NEXT: ld a3, 8(sp)
+; RV64-NEXT: sd a0, 0(s1)
+; RV64-NEXT: sd a1, 8(s1)
+; RV64-NEXT: sd a2, 0(s0)
+; RV64-NEXT: sd a3, 8(s0)
+; RV64-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64-NEXT: .cfi_restore ra
; RV64-NEXT: .cfi_restore s0
; RV64-NEXT: .cfi_restore s1
-; RV64-NEXT: .cfi_restore s2
-; RV64-NEXT: .cfi_restore s3
-; RV64-NEXT: .cfi_restore s4
-; RV64-NEXT: .cfi_restore s5
-; RV64-NEXT: .cfi_restore s6
-; RV64-NEXT: .cfi_restore s7
-; RV64-NEXT: addi sp, sp, 80
+; RV64-NEXT: addi sp, sp, 48
; RV64-NEXT: .cfi_def_cfa_offset 0
; RV64-NEXT: ret
%q = sdiv i128 %n, %d
@@ -78,67 +47,36 @@ define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; RV64-LABEL: udivrem_i128:
; RV64: # %bb.0:
-; RV64-NEXT: addi sp, sp, -80
-; RV64-NEXT: .cfi_def_cfa_offset 80
-; RV64-NEXT: sd ra, 72(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s0, 64(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s1, 56(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s2, 48(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s3, 40(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s4, 32(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s5, 24(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s6, 16(sp) # 8-byte Folded Spill
-; RV64-NEXT: sd s7, 8(sp) # 8-byte Folded Spill
+; RV64-NEXT: addi sp, sp, -48
+; RV64-NEXT: .cfi_def_cfa_offset 48
+; RV64-NEXT: sd ra, 40(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s0, 32(sp) # 8-byte Folded Spill
+; RV64-NEXT: sd s1, 24(sp) # 8-byte Folded Spill
; RV64-NEXT: .cfi_offset ra, -8
; RV64-NEXT: .cfi_offset s0, -16
; RV64-NEXT: .cfi_offset s1, -24
-; RV64-NEXT: .cfi_offset s2, -32
-; RV64-NEXT: .cfi_offset s3, -40
-; RV64-NEXT: .cfi_offset s4, -48
-; RV64-NEXT: .cfi_offset s5, -56
-; RV64-NEXT: .cfi_offset s6, -64
-; RV64-NEXT: .cfi_offset s7, -72
-; RV64-NEXT: mv s0, a5
-; RV64-NEXT: mv s1, a4
-; RV64-NEXT: mv s2, a3
-; RV64-NEXT: mv s3, a2
-; RV64-NEXT: mv s4, a1
-; RV64-NEXT: mv s5, a0
+; RV64-NEXT: mv a6, a4
+; RV64-NEXT: mv s0, a1
+; RV64-NEXT: mv s1, a0
+; RV64-NEXT: mv a4, sp
; RV64-NEXT: mv a0, a2
; RV64-NEXT: mv a1, a3
-; RV64-NEXT: mv a2, a4
+; RV64-NEXT: mv a2, a6
; RV64-NEXT: mv a3, a5
-; RV64-NEXT: call __udivti3
-; RV64-NEXT: mv s6, a0
-; RV64-NEXT: mv s7, a1
-; RV64-NEXT: mv a0, s3
-; RV64-NEXT: mv a1, s2
-; RV64-NEXT: mv a2, s1
-; RV64-NEXT: mv a3, s0
-; RV64-NEXT: call __umodti3
-; RV64-NEXT: sd s6, 0(s5)
-; RV64-NEXT: sd s7, 8(s5)
-; RV64-NEXT: sd a0, 0(s4)
-; RV64-NEXT: sd a1, 8(s4)
-; RV64-NEXT: ld ra, 72(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s0, 64(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s1, 56(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s2, 48(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s3, 40(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s4, 32(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s5, 24(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s6, 16(sp) # 8-byte Folded Reload
-; RV64-NEXT: ld s7, 8(sp) # 8-byte Folded Reload
+; RV64-NEXT: call __udivmodti4
+; RV64-NEXT: ld a2, 0(sp)
+; RV64-NEXT: ld a3, 8(sp)
+; RV64-NEXT: sd a0, 0(s1)
+; RV64-NEXT: sd a1, 8(s1)
+; RV64-NEXT: sd a2, 0(s0)
+; RV64-NEXT: sd a3, 8(s0)
+; RV64-NEXT: ld ra, 40(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s0, 32(sp) # 8-byte Folded Reload
+; RV64-NEXT: ld s1, 24(sp) # 8-byte Folded Reload
; RV64-NEXT: .cfi_restore ra
; RV64-NEXT: .cfi_restore s0
; RV64-NEXT: .cfi_restore s1
-; RV64-NEXT: .cfi_restore s2
-; RV64-NEXT: .cfi_restore s3
-; RV64-NEXT: .cfi_restore s4
-; RV64-NEXT: .cfi_restore s5
-; RV64-NEXT: .cfi_restore s6
-; RV64-NEXT: .cfi_restore s7
-; RV64-NEXT: addi sp, sp, 80
+; RV64-NEXT: addi sp, sp, 48
; RV64-NEXT: .cfi_def_cfa_offset 0
; RV64-NEXT: ret
%q = udiv i128 %n, %d
diff --git a/llvm/test/CodeGen/SPARC/i128-divrem-libcall.ll b/llvm/test/CodeGen/SPARC/i128-divrem-libcall.ll
index 9e7c240cd4388..932e9a6ccbc90 100644
--- a/llvm/test/CodeGen/SPARC/i128-divrem-libcall.ll
+++ b/llvm/test/CodeGen/SPARC/i128-divrem-libcall.ll
@@ -5,26 +5,24 @@ define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; CHECK-LABEL: sdivrem_i128:
; CHECK: .cfi_startproc
; CHECK-NEXT: ! %bb.0:
-; CHECK-NEXT: save %sp, -176, %sp
+; CHECK-NEXT: save %sp, -192, %sp
; CHECK-NEXT: .cfi_def_cfa_register %fp
; CHECK-NEXT: .cfi_window_save
; CHECK-NEXT: .cfi_register %o7, %i7
-; CHECK-NEXT: mov %i2, %o0
-; CHECK-NEXT: mov %i3, %o1
-; CHECK-NEXT: mov %i4, %o2
-; CHECK-NEXT: call __divti3
; CHECK-NEXT: mov %i5, %o3
-; CHECK-NEXT: mov %o0, %l0
-; CHECK-NEXT: mov %o1, %l1
-; CHECK-NEXT: mov %i2, %o0
-; CHECK-NEXT: mov %i3, %o1
; CHECK-NEXT: mov %i4, %o2
-; CHECK-NEXT: call __modti3
-; CHECK-NEXT: mov %i5, %o3
-; CHECK-NEXT: stx %l0, [%i0]
-; CHECK-NEXT: stx %l1, [%i0+8]
-; CHECK-NEXT: stx %o0, [%i1]
-; CHECK-NEXT: stx %o1, [%i1+8]
+; CHECK-NEXT: mov %i3, %o1
+; CHECK-NEXT: mov %i2, %o0
+; CHECK-NEXT: add %fp, 2031, %i2
+; CHECK-NEXT: call __divmodti4
+; CHECK-NEXT: mov %i2, %o4
+; CHECK-NEXT: or %i2, 8, %i2
+; CHECK-NEXT: ldx [%fp+2031], %i3
+; CHECK-NEXT: ldx [%i2], %i2
+; CHECK-NEXT: stx %o0, [%i0]
+; CHECK-NEXT: stx %o1, [%i0+8]
+; CHECK-NEXT: stx %i3, [%i1]
+; CHECK-NEXT: stx %i2, [%i1+8]
; CHECK-NEXT: ret
; CHECK-NEXT: restore
%q = sdiv i128 %n, %d
@@ -38,26 +36,24 @@ define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; CHECK-LABEL: udivrem_i128:
; CHECK: .cfi_startproc
; CHECK-NEXT: ! %bb.0:
-; CHECK-NEXT: save %sp, -176, %sp
+; CHECK-NEXT: save %sp, -192, %sp
; CHECK-NEXT: .cfi_def_cfa_register %fp
; CHECK-NEXT: .cfi_window_save
; CHECK-NEXT: .cfi_register %o7, %i7
-; CHECK-NEXT: mov %i2, %o0
-; CHECK-NEXT: mov %i3, %o1
-; CHECK-NEXT: mov %i4, %o2
-; CHECK-NEXT: call __udivti3
; CHECK-NEXT: mov %i5, %o3
-; CHECK-NEXT: mov %o0, %l0
-; CHECK-NEXT: mov %o1, %l1
-; CHECK-NEXT: mov %i2, %o0
-; CHECK-NEXT: mov %i3, %o1
; CHECK-NEXT: mov %i4, %o2
-; CHECK-NEXT: call __umodti3
-; CHECK-NEXT: mov %i5, %o3
-; CHECK-NEXT: stx %l0, [%i0]
-; CHECK-NEXT: stx %l1, [%i0+8]
-; CHECK-NEXT: stx %o0, [%i1]
-; CHECK-NEXT: stx %o1, [%i1+8]
+; CHECK-NEXT: mov %i3, %o1
+; CHECK-NEXT: mov %i2, %o0
+; CHECK-NEXT: add %fp, 2031, %i2
+; CHECK-NEXT: call __udivmodti4
+; CHECK-NEXT: mov %i2, %o4
+; CHECK-NEXT: or %i2, 8, %i2
+; CHECK-NEXT: ldx [%fp+2031], %i3
+; CHECK-NEXT: ldx [%i2], %i2
+; CHECK-NEXT: stx %o0, [%i0]
+; CHECK-NEXT: stx %o1, [%i0+8]
+; CHECK-NEXT: stx %i3, [%i1]
+; CHECK-NEXT: stx %i2, [%i1+8]
; CHECK-NEXT: ret
; CHECK-NEXT: restore
%q = udiv i128 %n, %d
diff --git a/llvm/test/CodeGen/SystemZ/i128-divrem-libcall.ll b/llvm/test/CodeGen/SystemZ/i128-divrem-libcall.ll
index 3355d62de579b..c1d88c679626c 100644
--- a/llvm/test/CodeGen/SystemZ/i128-divrem-libcall.ll
+++ b/llvm/test/CodeGen/SystemZ/i128-divrem-libcall.ll
@@ -6,50 +6,37 @@
define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; CHECK-LABEL: sdivrem_i128:
; CHECK: # %bb.0:
-; CHECK-NEXT: stmg %r6, %r15, 48(%r15)
-; CHECK-NEXT: .cfi_offset %r6, -112
-; CHECK-NEXT: .cfi_offset %r7, -104
-; CHECK-NEXT: .cfi_offset %r8, -96
-; CHECK-NEXT: .cfi_offset %r9, -88
-; CHECK-NEXT: .cfi_offset %r10, -80
-; CHECK-NEXT: .cfi_offset %r11, -72
+; CHECK-NEXT: stmg %r12, %r15, 96(%r15)
; CHECK-NEXT: .cfi_offset %r12, -64
; CHECK-NEXT: .cfi_offset %r13, -56
; CHECK-NEXT: .cfi_offset %r14, -48
; CHECK-NEXT: .cfi_offset %r15, -40
-; CHECK-NEXT: aghi %r15, -256
-; CHECK-NEXT: .cfi_def_cfa_offset 416
+; CHECK-NEXT: aghi %r15, -224
+; CHECK-NEXT: .cfi_def_cfa_offset 384
; CHECK-NEXT: lgr %r13, %r3
; CHECK-NEXT: lgr %r12, %r2
-; CHECK-NEXT: lg %r11, 8(%r5)
-; CHECK-NEXT: lg %r10, 0(%r5)
-; CHECK-NEXT: lg %r9, 8(%r4)
-; CHECK-NEXT: lg %r8, 0(%r4)
-; CHECK-NEXT: stg %r11, 168(%r15)
-; CHECK-NEXT: stg %r10, 160(%r15)
-; CHECK-NEXT: stg %r9, 184(%r15)
+; CHECK-NEXT: lg %r0, 8(%r5)
+; CHECK-NEXT: lg %r1, 0(%r5)
+; CHECK-NEXT: lg %r2, 8(%r4)
+; CHECK-NEXT: lg %r14, 0(%r4)
+; CHECK-NEXT: stg %r0, 168(%r15)
+; CHECK-NEXT: stg %r1, 160(%r15)
+; CHECK-NEXT: stg %r2, 184(%r15)
; CHECK-NEXT: la %r2, 192(%r15)
; CHECK-NEXT: la %r3, 176(%r15)
; CHECK-NEXT: la %r4, 160(%r15)
-; CHECK-NEXT: stg %r8, 176(%r15)
-; CHECK-NEXT: brasl %r14, __divti3 at PLT
-; CHECK-NEXT: lg %r7, 192(%r15)
-; CHECK-NEXT: lg %r6, 200(%r15)
-; CHECK-NEXT: stg %r11, 216(%r15)
-; CHECK-NEXT: stg %r10, 208(%r15)
-; CHECK-NEXT: stg %r9, 232(%r15)
-; CHECK-NEXT: la %r2, 240(%r15)
-; CHECK-NEXT: la %r3, 224(%r15)
-; CHECK-NEXT: la %r4, 208(%r15)
-; CHECK-NEXT: stg %r8, 224(%r15)
-; CHECK-NEXT: brasl %r14, __modti3 at PLT
-; CHECK-NEXT: lg %r0, 248(%r15)
-; CHECK-NEXT: lg %r1, 240(%r15)
-; CHECK-NEXT: stg %r6, 8(%r12)
-; CHECK-NEXT: stg %r7, 0(%r12)
-; CHECK-NEXT: stg %r0, 8(%r13)
-; CHECK-NEXT: stg %r1, 0(%r13)
-; CHECK-NEXT: lmg %r6, %r15, 304(%r15)
+; CHECK-NEXT: la %r5, 208(%r15)
+; CHECK-NEXT: stg %r14, 176(%r15)
+; CHECK-NEXT: brasl %r14, __divmodti4 at PLT
+; CHECK-NEXT: lg %r0, 200(%r15)
+; CHECK-NEXT: lg %r1, 192(%r15)
+; CHECK-NEXT: lg %r2, 216(%r15)
+; CHECK-NEXT: lg %r3, 208(%r15)
+; CHECK-NEXT: stg %r0, 8(%r12)
+; CHECK-NEXT: stg %r1, 0(%r12)
+; CHECK-NEXT: stg %r2, 8(%r13)
+; CHECK-NEXT: stg %r3, 0(%r13)
+; CHECK-NEXT: lmg %r12, %r15, 320(%r15)
; CHECK-NEXT: br %r14
%q = sdiv i128 %n, %d
%r = srem i128 %n, %d
@@ -61,50 +48,37 @@ define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; CHECK-LABEL: udivrem_i128:
; CHECK: # %bb.0:
-; CHECK-NEXT: stmg %r6, %r15, 48(%r15)
-; CHECK-NEXT: .cfi_offset %r6, -112
-; CHECK-NEXT: .cfi_offset %r7, -104
-; CHECK-NEXT: .cfi_offset %r8, -96
-; CHECK-NEXT: .cfi_offset %r9, -88
-; CHECK-NEXT: .cfi_offset %r10, -80
-; CHECK-NEXT: .cfi_offset %r11, -72
+; CHECK-NEXT: stmg %r12, %r15, 96(%r15)
; CHECK-NEXT: .cfi_offset %r12, -64
; CHECK-NEXT: .cfi_offset %r13, -56
; CHECK-NEXT: .cfi_offset %r14, -48
; CHECK-NEXT: .cfi_offset %r15, -40
-; CHECK-NEXT: aghi %r15, -256
-; CHECK-NEXT: .cfi_def_cfa_offset 416
+; CHECK-NEXT: aghi %r15, -224
+; CHECK-NEXT: .cfi_def_cfa_offset 384
; CHECK-NEXT: lgr %r13, %r3
; CHECK-NEXT: lgr %r12, %r2
-; CHECK-NEXT: lg %r11, 8(%r5)
-; CHECK-NEXT: lg %r10, 0(%r5)
-; CHECK-NEXT: lg %r9, 8(%r4)
-; CHECK-NEXT: lg %r8, 0(%r4)
-; CHECK-NEXT: stg %r11, 168(%r15)
-; CHECK-NEXT: stg %r10, 160(%r15)
-; CHECK-NEXT: stg %r9, 184(%r15)
+; CHECK-NEXT: lg %r0, 8(%r5)
+; CHECK-NEXT: lg %r1, 0(%r5)
+; CHECK-NEXT: lg %r2, 8(%r4)
+; CHECK-NEXT: lg %r14, 0(%r4)
+; CHECK-NEXT: stg %r0, 168(%r15)
+; CHECK-NEXT: stg %r1, 160(%r15)
+; CHECK-NEXT: stg %r2, 184(%r15)
; CHECK-NEXT: la %r2, 192(%r15)
; CHECK-NEXT: la %r3, 176(%r15)
; CHECK-NEXT: la %r4, 160(%r15)
-; CHECK-NEXT: stg %r8, 176(%r15)
-; CHECK-NEXT: brasl %r14, __udivti3 at PLT
-; CHECK-NEXT: lg %r7, 192(%r15)
-; CHECK-NEXT: lg %r6, 200(%r15)
-; CHECK-NEXT: stg %r11, 216(%r15)
-; CHECK-NEXT: stg %r10, 208(%r15)
-; CHECK-NEXT: stg %r9, 232(%r15)
-; CHECK-NEXT: la %r2, 240(%r15)
-; CHECK-NEXT: la %r3, 224(%r15)
-; CHECK-NEXT: la %r4, 208(%r15)
-; CHECK-NEXT: stg %r8, 224(%r15)
-; CHECK-NEXT: brasl %r14, __umodti3 at PLT
-; CHECK-NEXT: lg %r0, 248(%r15)
-; CHECK-NEXT: lg %r1, 240(%r15)
-; CHECK-NEXT: stg %r6, 8(%r12)
-; CHECK-NEXT: stg %r7, 0(%r12)
-; CHECK-NEXT: stg %r0, 8(%r13)
-; CHECK-NEXT: stg %r1, 0(%r13)
-; CHECK-NEXT: lmg %r6, %r15, 304(%r15)
+; CHECK-NEXT: la %r5, 208(%r15)
+; CHECK-NEXT: stg %r14, 176(%r15)
+; CHECK-NEXT: brasl %r14, __udivmodti4 at PLT
+; CHECK-NEXT: lg %r0, 200(%r15)
+; CHECK-NEXT: lg %r1, 192(%r15)
+; CHECK-NEXT: lg %r2, 216(%r15)
+; CHECK-NEXT: lg %r3, 208(%r15)
+; CHECK-NEXT: stg %r0, 8(%r12)
+; CHECK-NEXT: stg %r1, 0(%r12)
+; CHECK-NEXT: stg %r2, 8(%r13)
+; CHECK-NEXT: stg %r3, 0(%r13)
+; CHECK-NEXT: lmg %r12, %r15, 320(%r15)
; CHECK-NEXT: br %r14
%q = udiv i128 %n, %d
%r = urem i128 %n, %d
diff --git a/llvm/test/CodeGen/WebAssembly/i128-divrem-libcall.ll b/llvm/test/CodeGen/WebAssembly/i128-divrem-libcall.ll
index e04191dd1d17e..d67089fcd7865 100644
--- a/llvm/test/CodeGen/WebAssembly/i128-divrem-libcall.ll
+++ b/llvm/test/CodeGen/WebAssembly/i128-divrem-libcall.ll
@@ -13,34 +13,29 @@ define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; WASM32-NEXT: local.tee 6
; WASM32-NEXT: global.set __stack_pointer
; WASM32-NEXT: local.get 6
-; WASM32-NEXT: i32.const 16
-; WASM32-NEXT: i32.add
; WASM32-NEXT: local.get 2
; WASM32-NEXT: local.get 3
; WASM32-NEXT: local.get 4
; WASM32-NEXT: local.get 5
-; WASM32-NEXT: call __divti3
; WASM32-NEXT: local.get 6
-; WASM32-NEXT: local.get 2
-; WASM32-NEXT: local.get 3
-; WASM32-NEXT: local.get 4
-; WASM32-NEXT: local.get 5
-; WASM32-NEXT: call __modti3
+; WASM32-NEXT: i32.const 16
+; WASM32-NEXT: i32.add
+; WASM32-NEXT: call __divmodti4
; WASM32-NEXT: local.get 0
; WASM32-NEXT: local.get 6
-; WASM32-NEXT: i64.load 16
+; WASM32-NEXT: i64.load 0
; WASM32-NEXT: i64.store 0
; WASM32-NEXT: local.get 0
; WASM32-NEXT: local.get 6
-; WASM32-NEXT: i64.load 24
+; WASM32-NEXT: i64.load 8
; WASM32-NEXT: i64.store 8
; WASM32-NEXT: local.get 1
; WASM32-NEXT: local.get 6
-; WASM32-NEXT: i64.load 0
+; WASM32-NEXT: i64.load 16
; WASM32-NEXT: i64.store 0
; WASM32-NEXT: local.get 1
; WASM32-NEXT: local.get 6
-; WASM32-NEXT: i64.load 8
+; WASM32-NEXT: i64.load 24
; WASM32-NEXT: i64.store 8
; WASM32-NEXT: local.get 6
; WASM32-NEXT: i32.const 32
@@ -58,34 +53,29 @@ define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; WASM64-NEXT: local.tee 6
; WASM64-NEXT: global.set __stack_pointer
; WASM64-NEXT: local.get 6
-; WASM64-NEXT: i64.const 16
-; WASM64-NEXT: i64.add
; WASM64-NEXT: local.get 2
; WASM64-NEXT: local.get 3
; WASM64-NEXT: local.get 4
; WASM64-NEXT: local.get 5
-; WASM64-NEXT: call __divti3
; WASM64-NEXT: local.get 6
-; WASM64-NEXT: local.get 2
-; WASM64-NEXT: local.get 3
-; WASM64-NEXT: local.get 4
-; WASM64-NEXT: local.get 5
-; WASM64-NEXT: call __modti3
+; WASM64-NEXT: i64.const 16
+; WASM64-NEXT: i64.add
+; WASM64-NEXT: call __divmodti4
; WASM64-NEXT: local.get 0
; WASM64-NEXT: local.get 6
-; WASM64-NEXT: i64.load 16
+; WASM64-NEXT: i64.load 0
; WASM64-NEXT: i64.store 0
; WASM64-NEXT: local.get 0
; WASM64-NEXT: local.get 6
-; WASM64-NEXT: i64.load 24
+; WASM64-NEXT: i64.load 8
; WASM64-NEXT: i64.store 8
; WASM64-NEXT: local.get 1
; WASM64-NEXT: local.get 6
-; WASM64-NEXT: i64.load 0
+; WASM64-NEXT: i64.load 16
; WASM64-NEXT: i64.store 0
; WASM64-NEXT: local.get 1
; WASM64-NEXT: local.get 6
-; WASM64-NEXT: i64.load 8
+; WASM64-NEXT: i64.load 24
; WASM64-NEXT: i64.store 8
; WASM64-NEXT: local.get 6
; WASM64-NEXT: i64.const 32
@@ -110,34 +100,29 @@ define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; WASM32-NEXT: local.tee 6
; WASM32-NEXT: global.set __stack_pointer
; WASM32-NEXT: local.get 6
-; WASM32-NEXT: i32.const 16
-; WASM32-NEXT: i32.add
; WASM32-NEXT: local.get 2
; WASM32-NEXT: local.get 3
; WASM32-NEXT: local.get 4
; WASM32-NEXT: local.get 5
-; WASM32-NEXT: call __udivti3
; WASM32-NEXT: local.get 6
-; WASM32-NEXT: local.get 2
-; WASM32-NEXT: local.get 3
-; WASM32-NEXT: local.get 4
-; WASM32-NEXT: local.get 5
-; WASM32-NEXT: call __umodti3
+; WASM32-NEXT: i32.const 16
+; WASM32-NEXT: i32.add
+; WASM32-NEXT: call __udivmodti4
; WASM32-NEXT: local.get 0
; WASM32-NEXT: local.get 6
-; WASM32-NEXT: i64.load 16
+; WASM32-NEXT: i64.load 0
; WASM32-NEXT: i64.store 0
; WASM32-NEXT: local.get 0
; WASM32-NEXT: local.get 6
-; WASM32-NEXT: i64.load 24
+; WASM32-NEXT: i64.load 8
; WASM32-NEXT: i64.store 8
; WASM32-NEXT: local.get 1
; WASM32-NEXT: local.get 6
-; WASM32-NEXT: i64.load 0
+; WASM32-NEXT: i64.load 16
; WASM32-NEXT: i64.store 0
; WASM32-NEXT: local.get 1
; WASM32-NEXT: local.get 6
-; WASM32-NEXT: i64.load 8
+; WASM32-NEXT: i64.load 24
; WASM32-NEXT: i64.store 8
; WASM32-NEXT: local.get 6
; WASM32-NEXT: i32.const 32
@@ -155,34 +140,29 @@ define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; WASM64-NEXT: local.tee 6
; WASM64-NEXT: global.set __stack_pointer
; WASM64-NEXT: local.get 6
-; WASM64-NEXT: i64.const 16
-; WASM64-NEXT: i64.add
; WASM64-NEXT: local.get 2
; WASM64-NEXT: local.get 3
; WASM64-NEXT: local.get 4
; WASM64-NEXT: local.get 5
-; WASM64-NEXT: call __udivti3
; WASM64-NEXT: local.get 6
-; WASM64-NEXT: local.get 2
-; WASM64-NEXT: local.get 3
-; WASM64-NEXT: local.get 4
-; WASM64-NEXT: local.get 5
-; WASM64-NEXT: call __umodti3
+; WASM64-NEXT: i64.const 16
+; WASM64-NEXT: i64.add
+; WASM64-NEXT: call __udivmodti4
; WASM64-NEXT: local.get 0
; WASM64-NEXT: local.get 6
-; WASM64-NEXT: i64.load 16
+; WASM64-NEXT: i64.load 0
; WASM64-NEXT: i64.store 0
; WASM64-NEXT: local.get 0
; WASM64-NEXT: local.get 6
-; WASM64-NEXT: i64.load 24
+; WASM64-NEXT: i64.load 8
; WASM64-NEXT: i64.store 8
; WASM64-NEXT: local.get 1
; WASM64-NEXT: local.get 6
-; WASM64-NEXT: i64.load 0
+; WASM64-NEXT: i64.load 16
; WASM64-NEXT: i64.store 0
; WASM64-NEXT: local.get 1
; WASM64-NEXT: local.get 6
-; WASM64-NEXT: i64.load 8
+; WASM64-NEXT: i64.load 24
; WASM64-NEXT: i64.store 8
; WASM64-NEXT: local.get 6
; WASM64-NEXT: i64.const 32
diff --git a/llvm/test/CodeGen/X86/i128-divrem-libcall-x86-64.ll b/llvm/test/CodeGen/X86/i128-divrem-libcall-x86-64.ll
index 0921ed6a98b32..8851ad952a995 100644
--- a/llvm/test/CodeGen/X86/i128-divrem-libcall-x86-64.ll
+++ b/llvm/test/CodeGen/X86/i128-divrem-libcall-x86-64.ll
@@ -8,289 +8,156 @@
define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; LINUX-X64-LABEL: sdivrem_i128:
; LINUX-X64: # %bb.0:
-; LINUX-X64-NEXT: pushq %rbp
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 16
-; LINUX-X64-NEXT: pushq %r15
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 24
; LINUX-X64-NEXT: pushq %r14
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 32
-; LINUX-X64-NEXT: pushq %r13
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 40
-; LINUX-X64-NEXT: pushq %r12
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 16
; LINUX-X64-NEXT: pushq %rbx
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 56
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 24
; LINUX-X64-NEXT: subq $24, %rsp
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 80
-; LINUX-X64-NEXT: .cfi_offset %rbx, -56
-; LINUX-X64-NEXT: .cfi_offset %r12, -48
-; LINUX-X64-NEXT: .cfi_offset %r13, -40
-; LINUX-X64-NEXT: .cfi_offset %r14, -32
-; LINUX-X64-NEXT: .cfi_offset %r15, -24
-; LINUX-X64-NEXT: .cfi_offset %rbp, -16
-; LINUX-X64-NEXT: movq %r9, %rbx
-; LINUX-X64-NEXT: movq %r8, %r14
-; LINUX-X64-NEXT: movq %rcx, %r15
-; LINUX-X64-NEXT: movq %rdx, %r12
-; LINUX-X64-NEXT: movq %rsi, %r13
-; LINUX-X64-NEXT: movq %rdi, %rbp
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X64-NEXT: .cfi_offset %rbx, -24
+; LINUX-X64-NEXT: .cfi_offset %r14, -16
+; LINUX-X64-NEXT: movq %r8, %rax
+; LINUX-X64-NEXT: movq %rsi, %rbx
+; LINUX-X64-NEXT: movq %rdi, %r14
+; LINUX-X64-NEXT: movq %rsp, %r8
; LINUX-X64-NEXT: movq %rdx, %rdi
; LINUX-X64-NEXT: movq %rcx, %rsi
-; LINUX-X64-NEXT: movq %r8, %rdx
+; LINUX-X64-NEXT: movq %rax, %rdx
; LINUX-X64-NEXT: movq %r9, %rcx
-; LINUX-X64-NEXT: callq __divti3 at PLT
-; LINUX-X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; LINUX-X64-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; LINUX-X64-NEXT: movq %r12, %rdi
-; LINUX-X64-NEXT: movq %r15, %rsi
-; LINUX-X64-NEXT: movq %r14, %rdx
-; LINUX-X64-NEXT: movq %rbx, %rcx
-; LINUX-X64-NEXT: callq __modti3 at PLT
-; LINUX-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
-; LINUX-X64-NEXT: movq %rcx, (%rbp)
-; LINUX-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
-; LINUX-X64-NEXT: movq %rcx, 8(%rbp)
-; LINUX-X64-NEXT: movq %rax, (%r13)
-; LINUX-X64-NEXT: movq %rdx, 8(%r13)
+; LINUX-X64-NEXT: callq __divmodti4 at PLT
+; LINUX-X64-NEXT: movq (%rsp), %rcx
+; LINUX-X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi
+; LINUX-X64-NEXT: movq %rax, (%r14)
+; LINUX-X64-NEXT: movq %rdx, 8(%r14)
+; LINUX-X64-NEXT: movq %rcx, (%rbx)
+; LINUX-X64-NEXT: movq %rsi, 8(%rbx)
; LINUX-X64-NEXT: addq $24, %rsp
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 56
-; LINUX-X64-NEXT: popq %rbx
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 48
-; LINUX-X64-NEXT: popq %r12
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 40
-; LINUX-X64-NEXT: popq %r13
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 32
-; LINUX-X64-NEXT: popq %r14
; LINUX-X64-NEXT: .cfi_def_cfa_offset 24
-; LINUX-X64-NEXT: popq %r15
+; LINUX-X64-NEXT: popq %rbx
; LINUX-X64-NEXT: .cfi_def_cfa_offset 16
-; LINUX-X64-NEXT: popq %rbp
+; LINUX-X64-NEXT: popq %r14
; LINUX-X64-NEXT: .cfi_def_cfa_offset 8
; LINUX-X64-NEXT: retq
;
; LINUX-X32-LABEL: sdivrem_i128:
; LINUX-X32: # %bb.0:
-; LINUX-X32-NEXT: pushq %rbp
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 16
-; LINUX-X32-NEXT: pushq %r15
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 24
; LINUX-X32-NEXT: pushq %r14
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 32
-; LINUX-X32-NEXT: pushq %r13
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 40
-; LINUX-X32-NEXT: pushq %r12
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 16
; LINUX-X32-NEXT: pushq %rbx
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 56
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 24
; LINUX-X32-NEXT: subl $24, %esp
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 80
-; LINUX-X32-NEXT: .cfi_offset %rbx, -56
-; LINUX-X32-NEXT: .cfi_offset %r12, -48
-; LINUX-X32-NEXT: .cfi_offset %r13, -40
-; LINUX-X32-NEXT: .cfi_offset %r14, -32
-; LINUX-X32-NEXT: .cfi_offset %r15, -24
-; LINUX-X32-NEXT: .cfi_offset %rbp, -16
-; LINUX-X32-NEXT: movq %r9, %rbx
-; LINUX-X32-NEXT: movq %r8, %r14
-; LINUX-X32-NEXT: movq %rcx, %r15
-; LINUX-X32-NEXT: movq %rdx, %r12
-; LINUX-X32-NEXT: movq %rsi, %r13
-; LINUX-X32-NEXT: movq %rdi, %rbp
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X32-NEXT: .cfi_offset %rbx, -24
+; LINUX-X32-NEXT: .cfi_offset %r14, -16
+; LINUX-X32-NEXT: movq %r8, %rax
+; LINUX-X32-NEXT: movq %rsi, %rbx
+; LINUX-X32-NEXT: movq %rdi, %r14
+; LINUX-X32-NEXT: movl %esp, %r8d
; LINUX-X32-NEXT: movq %rdx, %rdi
; LINUX-X32-NEXT: movq %rcx, %rsi
-; LINUX-X32-NEXT: movq %r8, %rdx
+; LINUX-X32-NEXT: movq %rax, %rdx
; LINUX-X32-NEXT: movq %r9, %rcx
-; LINUX-X32-NEXT: callq __divti3 at PLT
-; LINUX-X32-NEXT: movq %rax, {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Spill
-; LINUX-X32-NEXT: movq %rdx, {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Spill
-; LINUX-X32-NEXT: movq %r12, %rdi
-; LINUX-X32-NEXT: movq %r15, %rsi
-; LINUX-X32-NEXT: movq %r14, %rdx
-; LINUX-X32-NEXT: movq %rbx, %rcx
-; LINUX-X32-NEXT: callq __modti3 at PLT
-; LINUX-X32-NEXT: movq {{[-0-9]+}}(%e{{[sb]}}p), %rcx # 8-byte Reload
-; LINUX-X32-NEXT: movq %rcx, (%ebp)
-; LINUX-X32-NEXT: movq {{[-0-9]+}}(%e{{[sb]}}p), %rcx # 8-byte Reload
-; LINUX-X32-NEXT: movq %rcx, 8(%ebp)
-; LINUX-X32-NEXT: movq %rax, (%r13d)
-; LINUX-X32-NEXT: movq %rdx, 8(%r13d)
+; LINUX-X32-NEXT: callq __divmodti4 at PLT
+; LINUX-X32-NEXT: movq (%esp), %rcx
+; LINUX-X32-NEXT: movq {{[0-9]+}}(%esp), %rsi
+; LINUX-X32-NEXT: movq %rax, (%r14d)
+; LINUX-X32-NEXT: movq %rdx, 8(%r14d)
+; LINUX-X32-NEXT: movq %rcx, (%ebx)
+; LINUX-X32-NEXT: movq %rsi, 8(%ebx)
; LINUX-X32-NEXT: addl $24, %esp
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 56
-; LINUX-X32-NEXT: popq %rbx
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 48
-; LINUX-X32-NEXT: popq %r12
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 40
-; LINUX-X32-NEXT: popq %r13
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 32
-; LINUX-X32-NEXT: popq %r14
; LINUX-X32-NEXT: .cfi_def_cfa_offset 24
-; LINUX-X32-NEXT: popq %r15
+; LINUX-X32-NEXT: popq %rbx
; LINUX-X32-NEXT: .cfi_def_cfa_offset 16
-; LINUX-X32-NEXT: popq %rbp
+; LINUX-X32-NEXT: popq %r14
; LINUX-X32-NEXT: .cfi_def_cfa_offset 8
; LINUX-X32-NEXT: retq
;
; DARWIN-X64-LABEL: sdivrem_i128:
; DARWIN-X64: ## %bb.0:
-; DARWIN-X64-NEXT: pushq %rbp
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 16
-; DARWIN-X64-NEXT: pushq %r15
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 24
; DARWIN-X64-NEXT: pushq %r14
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 32
-; DARWIN-X64-NEXT: pushq %r13
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 40
-; DARWIN-X64-NEXT: pushq %r12
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 48
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 16
; DARWIN-X64-NEXT: pushq %rbx
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 56
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 24
; DARWIN-X64-NEXT: subq $24, %rsp
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 80
-; DARWIN-X64-NEXT: .cfi_offset %rbx, -56
-; DARWIN-X64-NEXT: .cfi_offset %r12, -48
-; DARWIN-X64-NEXT: .cfi_offset %r13, -40
-; DARWIN-X64-NEXT: .cfi_offset %r14, -32
-; DARWIN-X64-NEXT: .cfi_offset %r15, -24
-; DARWIN-X64-NEXT: .cfi_offset %rbp, -16
-; DARWIN-X64-NEXT: movq %r9, %rbx
-; DARWIN-X64-NEXT: movq %r8, %r14
-; DARWIN-X64-NEXT: movq %rcx, %r15
-; DARWIN-X64-NEXT: movq %rdx, %r12
-; DARWIN-X64-NEXT: movq %rsi, %r13
-; DARWIN-X64-NEXT: movq %rdi, %rbp
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 48
+; DARWIN-X64-NEXT: .cfi_offset %rbx, -24
+; DARWIN-X64-NEXT: .cfi_offset %r14, -16
+; DARWIN-X64-NEXT: movq %r8, %rax
+; DARWIN-X64-NEXT: movq %rsi, %rbx
+; DARWIN-X64-NEXT: movq %rdi, %r14
+; DARWIN-X64-NEXT: movq %rsp, %r8
; DARWIN-X64-NEXT: movq %rdx, %rdi
; DARWIN-X64-NEXT: movq %rcx, %rsi
-; DARWIN-X64-NEXT: movq %r8, %rdx
+; DARWIN-X64-NEXT: movq %rax, %rdx
; DARWIN-X64-NEXT: movq %r9, %rcx
-; DARWIN-X64-NEXT: callq ___divti3
-; DARWIN-X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
-; DARWIN-X64-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
-; DARWIN-X64-NEXT: movq %r12, %rdi
-; DARWIN-X64-NEXT: movq %r15, %rsi
-; DARWIN-X64-NEXT: movq %r14, %rdx
-; DARWIN-X64-NEXT: movq %rbx, %rcx
-; DARWIN-X64-NEXT: callq ___modti3
-; DARWIN-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
-; DARWIN-X64-NEXT: movq %rcx, (%rbp)
-; DARWIN-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
-; DARWIN-X64-NEXT: movq %rcx, 8(%rbp)
-; DARWIN-X64-NEXT: movq %rax, (%r13)
-; DARWIN-X64-NEXT: movq %rdx, 8(%r13)
+; DARWIN-X64-NEXT: callq ___divmodti4
+; DARWIN-X64-NEXT: movq (%rsp), %rcx
+; DARWIN-X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi
+; DARWIN-X64-NEXT: movq %rax, (%r14)
+; DARWIN-X64-NEXT: movq %rdx, 8(%r14)
+; DARWIN-X64-NEXT: movq %rcx, (%rbx)
+; DARWIN-X64-NEXT: movq %rsi, 8(%rbx)
; DARWIN-X64-NEXT: addq $24, %rsp
; DARWIN-X64-NEXT: popq %rbx
-; DARWIN-X64-NEXT: popq %r12
-; DARWIN-X64-NEXT: popq %r13
; DARWIN-X64-NEXT: popq %r14
-; DARWIN-X64-NEXT: popq %r15
-; DARWIN-X64-NEXT: popq %rbp
; DARWIN-X64-NEXT: retq
;
; MINGW-X64-LABEL: sdivrem_i128:
; MINGW-X64: # %bb.0:
-; MINGW-X64-NEXT: pushq %r15
-; MINGW-X64-NEXT: .seh_pushreg %r15
-; MINGW-X64-NEXT: pushq %r14
-; MINGW-X64-NEXT: .seh_pushreg %r14
-; MINGW-X64-NEXT: pushq %r12
-; MINGW-X64-NEXT: .seh_pushreg %r12
; MINGW-X64-NEXT: pushq %rsi
; MINGW-X64-NEXT: .seh_pushreg %rsi
; MINGW-X64-NEXT: pushq %rdi
; MINGW-X64-NEXT: .seh_pushreg %rdi
-; MINGW-X64-NEXT: pushq %rbx
-; MINGW-X64-NEXT: .seh_pushreg %rbx
-; MINGW-X64-NEXT: subq $120, %rsp
-; MINGW-X64-NEXT: .seh_stackalloc 120
-; MINGW-X64-NEXT: movaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; MINGW-X64-NEXT: .seh_savexmm %xmm6, 96
+; MINGW-X64-NEXT: subq $88, %rsp
+; MINGW-X64-NEXT: .seh_stackalloc 88
; MINGW-X64-NEXT: .seh_endprologue
-; MINGW-X64-NEXT: movq %r9, %rsi
-; MINGW-X64-NEXT: movq %r8, %rdi
-; MINGW-X64-NEXT: movq %rdx, %rbx
-; MINGW-X64-NEXT: movq %rcx, %r14
-; MINGW-X64-NEXT: movq {{[0-9]+}}(%rsp), %r15
-; MINGW-X64-NEXT: movq {{[0-9]+}}(%rsp), %r12
+; MINGW-X64-NEXT: movq %rdx, %rsi
+; MINGW-X64-NEXT: movq %rcx, %rdi
+; MINGW-X64-NEXT: movaps {{[0-9]+}}(%rsp), %xmm0
; MINGW-X64-NEXT: movq %r9, {{[0-9]+}}(%rsp)
; MINGW-X64-NEXT: movq %r8, {{[0-9]+}}(%rsp)
-; MINGW-X64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
-; MINGW-X64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
-; MINGW-X64-NEXT: callq __divti3
-; MINGW-X64-NEXT: movaps %xmm0, %xmm6
-; MINGW-X64-NEXT: movq %rsi, {{[0-9]+}}(%rsp)
-; MINGW-X64-NEXT: movq %rdi, {{[0-9]+}}(%rsp)
-; MINGW-X64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
-; MINGW-X64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
-; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
-; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
-; MINGW-X64-NEXT: callq __modti3
-; MINGW-X64-NEXT: movaps %xmm6, (%r14)
-; MINGW-X64-NEXT: movaps %xmm0, (%rbx)
-; MINGW-X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload
+; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %r8
+; MINGW-X64-NEXT: callq __divmodti4
+; MINGW-X64-NEXT: movaps {{[0-9]+}}(%rsp), %xmm1
+; MINGW-X64-NEXT: movaps %xmm0, (%rdi)
+; MINGW-X64-NEXT: movaps %xmm1, (%rsi)
; MINGW-X64-NEXT: .seh_startepilogue
-; MINGW-X64-NEXT: addq $120, %rsp
-; MINGW-X64-NEXT: popq %rbx
+; MINGW-X64-NEXT: addq $88, %rsp
; MINGW-X64-NEXT: popq %rdi
; MINGW-X64-NEXT: popq %rsi
-; MINGW-X64-NEXT: popq %r12
-; MINGW-X64-NEXT: popq %r14
-; MINGW-X64-NEXT: popq %r15
; MINGW-X64-NEXT: .seh_endepilogue
; MINGW-X64-NEXT: retq
; MINGW-X64-NEXT: .seh_endproc
;
; WIN64-LABEL: sdivrem_i128:
; WIN64: # %bb.0:
-; WIN64-NEXT: pushq %r15
-; WIN64-NEXT: .seh_pushreg %r15
-; WIN64-NEXT: pushq %r14
-; WIN64-NEXT: .seh_pushreg %r14
-; WIN64-NEXT: pushq %r12
-; WIN64-NEXT: .seh_pushreg %r12
; WIN64-NEXT: pushq %rsi
; WIN64-NEXT: .seh_pushreg %rsi
; WIN64-NEXT: pushq %rdi
; WIN64-NEXT: .seh_pushreg %rdi
-; WIN64-NEXT: pushq %rbx
-; WIN64-NEXT: .seh_pushreg %rbx
-; WIN64-NEXT: subq $120, %rsp
-; WIN64-NEXT: .seh_stackalloc 120
-; WIN64-NEXT: movaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; WIN64-NEXT: .seh_savexmm %xmm6, 96
+; WIN64-NEXT: subq $88, %rsp
+; WIN64-NEXT: .seh_stackalloc 88
; WIN64-NEXT: .seh_endprologue
-; WIN64-NEXT: movq %r9, %rsi
-; WIN64-NEXT: movq %r8, %rdi
-; WIN64-NEXT: movq %rdx, %rbx
-; WIN64-NEXT: movq %rcx, %r14
-; WIN64-NEXT: movq {{[0-9]+}}(%rsp), %r15
-; WIN64-NEXT: movq {{[0-9]+}}(%rsp), %r12
+; WIN64-NEXT: movq %rdx, %rsi
+; WIN64-NEXT: movq %rcx, %rdi
+; WIN64-NEXT: movaps {{[0-9]+}}(%rsp), %xmm0
; WIN64-NEXT: movq %r9, {{[0-9]+}}(%rsp)
; WIN64-NEXT: movq %r8, {{[0-9]+}}(%rsp)
-; WIN64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
-; WIN64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
-; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
-; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
-; WIN64-NEXT: callq __divti3
-; WIN64-NEXT: movaps %xmm0, %xmm6
-; WIN64-NEXT: movq %rsi, {{[0-9]+}}(%rsp)
-; WIN64-NEXT: movq %rdi, {{[0-9]+}}(%rsp)
-; WIN64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
-; WIN64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
-; WIN64-NEXT: callq __modti3
-; WIN64-NEXT: movaps %xmm6, (%r14)
-; WIN64-NEXT: movaps %xmm0, (%rbx)
-; WIN64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload
+; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %r8
+; WIN64-NEXT: callq __divmodti4
+; WIN64-NEXT: movaps {{[0-9]+}}(%rsp), %xmm1
+; WIN64-NEXT: movaps %xmm0, (%rdi)
+; WIN64-NEXT: movaps %xmm1, (%rsi)
; WIN64-NEXT: .seh_startepilogue
-; WIN64-NEXT: addq $120, %rsp
-; WIN64-NEXT: popq %rbx
+; WIN64-NEXT: addq $88, %rsp
; WIN64-NEXT: popq %rdi
; WIN64-NEXT: popq %rsi
-; WIN64-NEXT: popq %r12
-; WIN64-NEXT: popq %r14
-; WIN64-NEXT: popq %r15
; WIN64-NEXT: .seh_endepilogue
; WIN64-NEXT: retq
; WIN64-NEXT: .seh_endproc
@@ -304,289 +171,156 @@ define void @sdivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
define void @udivrem_i128(ptr %q_out, ptr %r_out, i128 %n, i128 %d) {
; LINUX-X64-LABEL: udivrem_i128:
; LINUX-X64: # %bb.0:
-; LINUX-X64-NEXT: pushq %rbp
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 16
-; LINUX-X64-NEXT: pushq %r15
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 24
; LINUX-X64-NEXT: pushq %r14
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 32
-; LINUX-X64-NEXT: pushq %r13
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 40
-; LINUX-X64-NEXT: pushq %r12
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 16
; LINUX-X64-NEXT: pushq %rbx
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 56
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 24
; LINUX-X64-NEXT: subq $24, %rsp
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 80
-; LINUX-X64-NEXT: .cfi_offset %rbx, -56
-; LINUX-X64-NEXT: .cfi_offset %r12, -48
-; LINUX-X64-NEXT: .cfi_offset %r13, -40
-; LINUX-X64-NEXT: .cfi_offset %r14, -32
-; LINUX-X64-NEXT: .cfi_offset %r15, -24
-; LINUX-X64-NEXT: .cfi_offset %rbp, -16
-; LINUX-X64-NEXT: movq %r9, %rbx
-; LINUX-X64-NEXT: movq %r8, %r14
-; LINUX-X64-NEXT: movq %rcx, %r15
-; LINUX-X64-NEXT: movq %rdx, %r12
-; LINUX-X64-NEXT: movq %rsi, %r13
-; LINUX-X64-NEXT: movq %rdi, %rbp
+; LINUX-X64-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X64-NEXT: .cfi_offset %rbx, -24
+; LINUX-X64-NEXT: .cfi_offset %r14, -16
+; LINUX-X64-NEXT: movq %r8, %rax
+; LINUX-X64-NEXT: movq %rsi, %rbx
+; LINUX-X64-NEXT: movq %rdi, %r14
+; LINUX-X64-NEXT: movq %rsp, %r8
; LINUX-X64-NEXT: movq %rdx, %rdi
; LINUX-X64-NEXT: movq %rcx, %rsi
-; LINUX-X64-NEXT: movq %r8, %rdx
+; LINUX-X64-NEXT: movq %rax, %rdx
; LINUX-X64-NEXT: movq %r9, %rcx
-; LINUX-X64-NEXT: callq __udivti3 at PLT
-; LINUX-X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; LINUX-X64-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) # 8-byte Spill
-; LINUX-X64-NEXT: movq %r12, %rdi
-; LINUX-X64-NEXT: movq %r15, %rsi
-; LINUX-X64-NEXT: movq %r14, %rdx
-; LINUX-X64-NEXT: movq %rbx, %rcx
-; LINUX-X64-NEXT: callq __umodti3 at PLT
-; LINUX-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
-; LINUX-X64-NEXT: movq %rcx, (%rbp)
-; LINUX-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx # 8-byte Reload
-; LINUX-X64-NEXT: movq %rcx, 8(%rbp)
-; LINUX-X64-NEXT: movq %rax, (%r13)
-; LINUX-X64-NEXT: movq %rdx, 8(%r13)
+; LINUX-X64-NEXT: callq __udivmodti4 at PLT
+; LINUX-X64-NEXT: movq (%rsp), %rcx
+; LINUX-X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi
+; LINUX-X64-NEXT: movq %rax, (%r14)
+; LINUX-X64-NEXT: movq %rdx, 8(%r14)
+; LINUX-X64-NEXT: movq %rcx, (%rbx)
+; LINUX-X64-NEXT: movq %rsi, 8(%rbx)
; LINUX-X64-NEXT: addq $24, %rsp
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 56
-; LINUX-X64-NEXT: popq %rbx
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 48
-; LINUX-X64-NEXT: popq %r12
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 40
-; LINUX-X64-NEXT: popq %r13
-; LINUX-X64-NEXT: .cfi_def_cfa_offset 32
-; LINUX-X64-NEXT: popq %r14
; LINUX-X64-NEXT: .cfi_def_cfa_offset 24
-; LINUX-X64-NEXT: popq %r15
+; LINUX-X64-NEXT: popq %rbx
; LINUX-X64-NEXT: .cfi_def_cfa_offset 16
-; LINUX-X64-NEXT: popq %rbp
+; LINUX-X64-NEXT: popq %r14
; LINUX-X64-NEXT: .cfi_def_cfa_offset 8
; LINUX-X64-NEXT: retq
;
; LINUX-X32-LABEL: udivrem_i128:
; LINUX-X32: # %bb.0:
-; LINUX-X32-NEXT: pushq %rbp
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 16
-; LINUX-X32-NEXT: pushq %r15
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 24
; LINUX-X32-NEXT: pushq %r14
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 32
-; LINUX-X32-NEXT: pushq %r13
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 40
-; LINUX-X32-NEXT: pushq %r12
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 16
; LINUX-X32-NEXT: pushq %rbx
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 56
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 24
; LINUX-X32-NEXT: subl $24, %esp
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 80
-; LINUX-X32-NEXT: .cfi_offset %rbx, -56
-; LINUX-X32-NEXT: .cfi_offset %r12, -48
-; LINUX-X32-NEXT: .cfi_offset %r13, -40
-; LINUX-X32-NEXT: .cfi_offset %r14, -32
-; LINUX-X32-NEXT: .cfi_offset %r15, -24
-; LINUX-X32-NEXT: .cfi_offset %rbp, -16
-; LINUX-X32-NEXT: movq %r9, %rbx
-; LINUX-X32-NEXT: movq %r8, %r14
-; LINUX-X32-NEXT: movq %rcx, %r15
-; LINUX-X32-NEXT: movq %rdx, %r12
-; LINUX-X32-NEXT: movq %rsi, %r13
-; LINUX-X32-NEXT: movq %rdi, %rbp
+; LINUX-X32-NEXT: .cfi_def_cfa_offset 48
+; LINUX-X32-NEXT: .cfi_offset %rbx, -24
+; LINUX-X32-NEXT: .cfi_offset %r14, -16
+; LINUX-X32-NEXT: movq %r8, %rax
+; LINUX-X32-NEXT: movq %rsi, %rbx
+; LINUX-X32-NEXT: movq %rdi, %r14
+; LINUX-X32-NEXT: movl %esp, %r8d
; LINUX-X32-NEXT: movq %rdx, %rdi
; LINUX-X32-NEXT: movq %rcx, %rsi
-; LINUX-X32-NEXT: movq %r8, %rdx
+; LINUX-X32-NEXT: movq %rax, %rdx
; LINUX-X32-NEXT: movq %r9, %rcx
-; LINUX-X32-NEXT: callq __udivti3 at PLT
-; LINUX-X32-NEXT: movq %rax, {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Spill
-; LINUX-X32-NEXT: movq %rdx, {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Spill
-; LINUX-X32-NEXT: movq %r12, %rdi
-; LINUX-X32-NEXT: movq %r15, %rsi
-; LINUX-X32-NEXT: movq %r14, %rdx
-; LINUX-X32-NEXT: movq %rbx, %rcx
-; LINUX-X32-NEXT: callq __umodti3 at PLT
-; LINUX-X32-NEXT: movq {{[-0-9]+}}(%e{{[sb]}}p), %rcx # 8-byte Reload
-; LINUX-X32-NEXT: movq %rcx, (%ebp)
-; LINUX-X32-NEXT: movq {{[-0-9]+}}(%e{{[sb]}}p), %rcx # 8-byte Reload
-; LINUX-X32-NEXT: movq %rcx, 8(%ebp)
-; LINUX-X32-NEXT: movq %rax, (%r13d)
-; LINUX-X32-NEXT: movq %rdx, 8(%r13d)
+; LINUX-X32-NEXT: callq __udivmodti4 at PLT
+; LINUX-X32-NEXT: movq (%esp), %rcx
+; LINUX-X32-NEXT: movq {{[0-9]+}}(%esp), %rsi
+; LINUX-X32-NEXT: movq %rax, (%r14d)
+; LINUX-X32-NEXT: movq %rdx, 8(%r14d)
+; LINUX-X32-NEXT: movq %rcx, (%ebx)
+; LINUX-X32-NEXT: movq %rsi, 8(%ebx)
; LINUX-X32-NEXT: addl $24, %esp
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 56
-; LINUX-X32-NEXT: popq %rbx
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 48
-; LINUX-X32-NEXT: popq %r12
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 40
-; LINUX-X32-NEXT: popq %r13
-; LINUX-X32-NEXT: .cfi_def_cfa_offset 32
-; LINUX-X32-NEXT: popq %r14
; LINUX-X32-NEXT: .cfi_def_cfa_offset 24
-; LINUX-X32-NEXT: popq %r15
+; LINUX-X32-NEXT: popq %rbx
; LINUX-X32-NEXT: .cfi_def_cfa_offset 16
-; LINUX-X32-NEXT: popq %rbp
+; LINUX-X32-NEXT: popq %r14
; LINUX-X32-NEXT: .cfi_def_cfa_offset 8
; LINUX-X32-NEXT: retq
;
; DARWIN-X64-LABEL: udivrem_i128:
; DARWIN-X64: ## %bb.0:
-; DARWIN-X64-NEXT: pushq %rbp
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 16
-; DARWIN-X64-NEXT: pushq %r15
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 24
; DARWIN-X64-NEXT: pushq %r14
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 32
-; DARWIN-X64-NEXT: pushq %r13
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 40
-; DARWIN-X64-NEXT: pushq %r12
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 48
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 16
; DARWIN-X64-NEXT: pushq %rbx
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 56
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 24
; DARWIN-X64-NEXT: subq $24, %rsp
-; DARWIN-X64-NEXT: .cfi_def_cfa_offset 80
-; DARWIN-X64-NEXT: .cfi_offset %rbx, -56
-; DARWIN-X64-NEXT: .cfi_offset %r12, -48
-; DARWIN-X64-NEXT: .cfi_offset %r13, -40
-; DARWIN-X64-NEXT: .cfi_offset %r14, -32
-; DARWIN-X64-NEXT: .cfi_offset %r15, -24
-; DARWIN-X64-NEXT: .cfi_offset %rbp, -16
-; DARWIN-X64-NEXT: movq %r9, %rbx
-; DARWIN-X64-NEXT: movq %r8, %r14
-; DARWIN-X64-NEXT: movq %rcx, %r15
-; DARWIN-X64-NEXT: movq %rdx, %r12
-; DARWIN-X64-NEXT: movq %rsi, %r13
-; DARWIN-X64-NEXT: movq %rdi, %rbp
+; DARWIN-X64-NEXT: .cfi_def_cfa_offset 48
+; DARWIN-X64-NEXT: .cfi_offset %rbx, -24
+; DARWIN-X64-NEXT: .cfi_offset %r14, -16
+; DARWIN-X64-NEXT: movq %r8, %rax
+; DARWIN-X64-NEXT: movq %rsi, %rbx
+; DARWIN-X64-NEXT: movq %rdi, %r14
+; DARWIN-X64-NEXT: movq %rsp, %r8
; DARWIN-X64-NEXT: movq %rdx, %rdi
; DARWIN-X64-NEXT: movq %rcx, %rsi
-; DARWIN-X64-NEXT: movq %r8, %rdx
+; DARWIN-X64-NEXT: movq %rax, %rdx
; DARWIN-X64-NEXT: movq %r9, %rcx
-; DARWIN-X64-NEXT: callq ___udivti3
-; DARWIN-X64-NEXT: movq %rax, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
-; DARWIN-X64-NEXT: movq %rdx, {{[-0-9]+}}(%r{{[sb]}}p) ## 8-byte Spill
-; DARWIN-X64-NEXT: movq %r12, %rdi
-; DARWIN-X64-NEXT: movq %r15, %rsi
-; DARWIN-X64-NEXT: movq %r14, %rdx
-; DARWIN-X64-NEXT: movq %rbx, %rcx
-; DARWIN-X64-NEXT: callq ___umodti3
-; DARWIN-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
-; DARWIN-X64-NEXT: movq %rcx, (%rbp)
-; DARWIN-X64-NEXT: movq {{[-0-9]+}}(%r{{[sb]}}p), %rcx ## 8-byte Reload
-; DARWIN-X64-NEXT: movq %rcx, 8(%rbp)
-; DARWIN-X64-NEXT: movq %rax, (%r13)
-; DARWIN-X64-NEXT: movq %rdx, 8(%r13)
+; DARWIN-X64-NEXT: callq ___udivmodti4
+; DARWIN-X64-NEXT: movq (%rsp), %rcx
+; DARWIN-X64-NEXT: movq {{[0-9]+}}(%rsp), %rsi
+; DARWIN-X64-NEXT: movq %rax, (%r14)
+; DARWIN-X64-NEXT: movq %rdx, 8(%r14)
+; DARWIN-X64-NEXT: movq %rcx, (%rbx)
+; DARWIN-X64-NEXT: movq %rsi, 8(%rbx)
; DARWIN-X64-NEXT: addq $24, %rsp
; DARWIN-X64-NEXT: popq %rbx
-; DARWIN-X64-NEXT: popq %r12
-; DARWIN-X64-NEXT: popq %r13
; DARWIN-X64-NEXT: popq %r14
-; DARWIN-X64-NEXT: popq %r15
-; DARWIN-X64-NEXT: popq %rbp
; DARWIN-X64-NEXT: retq
;
; MINGW-X64-LABEL: udivrem_i128:
; MINGW-X64: # %bb.0:
-; MINGW-X64-NEXT: pushq %r15
-; MINGW-X64-NEXT: .seh_pushreg %r15
-; MINGW-X64-NEXT: pushq %r14
-; MINGW-X64-NEXT: .seh_pushreg %r14
-; MINGW-X64-NEXT: pushq %r12
-; MINGW-X64-NEXT: .seh_pushreg %r12
; MINGW-X64-NEXT: pushq %rsi
; MINGW-X64-NEXT: .seh_pushreg %rsi
; MINGW-X64-NEXT: pushq %rdi
; MINGW-X64-NEXT: .seh_pushreg %rdi
-; MINGW-X64-NEXT: pushq %rbx
-; MINGW-X64-NEXT: .seh_pushreg %rbx
-; MINGW-X64-NEXT: subq $120, %rsp
-; MINGW-X64-NEXT: .seh_stackalloc 120
-; MINGW-X64-NEXT: movaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; MINGW-X64-NEXT: .seh_savexmm %xmm6, 96
+; MINGW-X64-NEXT: subq $88, %rsp
+; MINGW-X64-NEXT: .seh_stackalloc 88
; MINGW-X64-NEXT: .seh_endprologue
-; MINGW-X64-NEXT: movq %r9, %rsi
-; MINGW-X64-NEXT: movq %r8, %rdi
-; MINGW-X64-NEXT: movq %rdx, %rbx
-; MINGW-X64-NEXT: movq %rcx, %r14
-; MINGW-X64-NEXT: movq {{[0-9]+}}(%rsp), %r15
-; MINGW-X64-NEXT: movq {{[0-9]+}}(%rsp), %r12
+; MINGW-X64-NEXT: movq %rdx, %rsi
+; MINGW-X64-NEXT: movq %rcx, %rdi
+; MINGW-X64-NEXT: movaps {{[0-9]+}}(%rsp), %xmm0
; MINGW-X64-NEXT: movq %r9, {{[0-9]+}}(%rsp)
; MINGW-X64-NEXT: movq %r8, {{[0-9]+}}(%rsp)
-; MINGW-X64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
-; MINGW-X64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
+; MINGW-X64-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
-; MINGW-X64-NEXT: callq __udivti3
-; MINGW-X64-NEXT: movaps %xmm0, %xmm6
-; MINGW-X64-NEXT: movq %rsi, {{[0-9]+}}(%rsp)
-; MINGW-X64-NEXT: movq %rdi, {{[0-9]+}}(%rsp)
-; MINGW-X64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
-; MINGW-X64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
-; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
-; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
-; MINGW-X64-NEXT: callq __umodti3
-; MINGW-X64-NEXT: movaps %xmm6, (%r14)
-; MINGW-X64-NEXT: movaps %xmm0, (%rbx)
-; MINGW-X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload
+; MINGW-X64-NEXT: leaq {{[0-9]+}}(%rsp), %r8
+; MINGW-X64-NEXT: callq __udivmodti4
+; MINGW-X64-NEXT: movaps {{[0-9]+}}(%rsp), %xmm1
+; MINGW-X64-NEXT: movaps %xmm0, (%rdi)
+; MINGW-X64-NEXT: movaps %xmm1, (%rsi)
; MINGW-X64-NEXT: .seh_startepilogue
-; MINGW-X64-NEXT: addq $120, %rsp
-; MINGW-X64-NEXT: popq %rbx
+; MINGW-X64-NEXT: addq $88, %rsp
; MINGW-X64-NEXT: popq %rdi
; MINGW-X64-NEXT: popq %rsi
-; MINGW-X64-NEXT: popq %r12
-; MINGW-X64-NEXT: popq %r14
-; MINGW-X64-NEXT: popq %r15
; MINGW-X64-NEXT: .seh_endepilogue
; MINGW-X64-NEXT: retq
; MINGW-X64-NEXT: .seh_endproc
;
; WIN64-LABEL: udivrem_i128:
; WIN64: # %bb.0:
-; WIN64-NEXT: pushq %r15
-; WIN64-NEXT: .seh_pushreg %r15
-; WIN64-NEXT: pushq %r14
-; WIN64-NEXT: .seh_pushreg %r14
-; WIN64-NEXT: pushq %r12
-; WIN64-NEXT: .seh_pushreg %r12
; WIN64-NEXT: pushq %rsi
; WIN64-NEXT: .seh_pushreg %rsi
; WIN64-NEXT: pushq %rdi
; WIN64-NEXT: .seh_pushreg %rdi
-; WIN64-NEXT: pushq %rbx
-; WIN64-NEXT: .seh_pushreg %rbx
-; WIN64-NEXT: subq $120, %rsp
-; WIN64-NEXT: .seh_stackalloc 120
-; WIN64-NEXT: movaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
-; WIN64-NEXT: .seh_savexmm %xmm6, 96
+; WIN64-NEXT: subq $88, %rsp
+; WIN64-NEXT: .seh_stackalloc 88
; WIN64-NEXT: .seh_endprologue
-; WIN64-NEXT: movq %r9, %rsi
-; WIN64-NEXT: movq %r8, %rdi
-; WIN64-NEXT: movq %rdx, %rbx
-; WIN64-NEXT: movq %rcx, %r14
-; WIN64-NEXT: movq {{[0-9]+}}(%rsp), %r15
-; WIN64-NEXT: movq {{[0-9]+}}(%rsp), %r12
+; WIN64-NEXT: movq %rdx, %rsi
+; WIN64-NEXT: movq %rcx, %rdi
+; WIN64-NEXT: movaps {{[0-9]+}}(%rsp), %xmm0
; WIN64-NEXT: movq %r9, {{[0-9]+}}(%rsp)
; WIN64-NEXT: movq %r8, {{[0-9]+}}(%rsp)
-; WIN64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
-; WIN64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
-; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
-; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
-; WIN64-NEXT: callq __udivti3
-; WIN64-NEXT: movaps %xmm0, %xmm6
-; WIN64-NEXT: movq %rsi, {{[0-9]+}}(%rsp)
-; WIN64-NEXT: movq %rdi, {{[0-9]+}}(%rsp)
-; WIN64-NEXT: movq %r12, {{[0-9]+}}(%rsp)
-; WIN64-NEXT: movq %r15, {{[0-9]+}}(%rsp)
+; WIN64-NEXT: movaps %xmm0, {{[0-9]+}}(%rsp)
; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rcx
; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %rdx
-; WIN64-NEXT: callq __umodti3
-; WIN64-NEXT: movaps %xmm6, (%r14)
-; WIN64-NEXT: movaps %xmm0, (%rbx)
-; WIN64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload
+; WIN64-NEXT: leaq {{[0-9]+}}(%rsp), %r8
+; WIN64-NEXT: callq __udivmodti4
+; WIN64-NEXT: movaps {{[0-9]+}}(%rsp), %xmm1
+; WIN64-NEXT: movaps %xmm0, (%rdi)
+; WIN64-NEXT: movaps %xmm1, (%rsi)
; WIN64-NEXT: .seh_startepilogue
-; WIN64-NEXT: addq $120, %rsp
-; WIN64-NEXT: popq %rbx
+; WIN64-NEXT: addq $88, %rsp
; WIN64-NEXT: popq %rdi
; WIN64-NEXT: popq %rsi
-; WIN64-NEXT: popq %r12
-; WIN64-NEXT: popq %r14
-; WIN64-NEXT: popq %r15
; WIN64-NEXT: .seh_endepilogue
; WIN64-NEXT: retq
; WIN64-NEXT: .seh_endproc
More information about the llvm-commits
mailing list