#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef int v;
typedef int uint8_t;
typedef int uint64_t;
typedef int u1_0;

/* Variables and functions */
int /*<<< orphan*/ UINT32_C(int);
int UINT64_C(int);
int nlz(int);
uint64_t divu(uint64_t uhi, uint64_t ulo, uint64_t v, uint64_t *q) {
  if (uhi >= v)
    return UINT64_C(-1);
  uint8_t s = nlz(v);
  v <<= s;
  uint64_t vhi = ((v) >> 32), vlo = ((v)&UINT32_C(-1));
  uint64_t u3_2 = (uhi << s);
  if (s)
    u3_2 |= ulo >> (64 - s);
  uint64_t u1_0 = ulo << s;
  uint64_t u1 = ((u1_0) >> 32), u0 = ((u1_0)&UINT32_C(-1));
  const uint64_t b = UINT64_C(0x100000000);
  uint64_t qhi = u3_2 / vhi;
  uint64_t r_est = u3_2 - qhi * vhi;
  while (qhi >= b || qhi * vlo > b * r_est + u1) {
    --qhi;
    r_est += vhi;
    if (r_est >= b)
      break;
  }
  uint64_t u2_1 = u3_2 * b + u1 - qhi * v;
  uint64_t qlo = u2_1 / vhi;
  r_est = u2_1 - qlo * vhi;
  while (qlo >= b || qlo * vlo > b * r_est + u0) {
    --qlo;
    r_est += vhi;
    if (r_est >= b)
      break;
  }
  *q = qhi * b + qlo;
  return (u2_1 * b + u0 - qlo * v) >> s;
}


x86 assembly (clang, -O0):
<divu>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0x10(%rbp),%eax
jl     1163 <divu+0x33>
mov    $0xffffffff,%edi
call   1030 <UINT64_C@plt>
mov    %eax,-0x4(%rbp)
jmp    133b <divu+0x20b>
mov    -0x10(%rbp),%edi
call   1040 <nlz@plt>
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%ecx
mov    -0x10(%rbp),%eax
shl    %cl,%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    $0x20,%ecx
sar    %cl,%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    $0xffffffff,%edi
call   1050 <UINT32_C@plt>
mov    %eax,%ecx
mov    -0x4c(%rbp),%eax
and    %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%eax
mov    -0x1c(%rbp),%ecx
shl    %cl,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     11c8 <divu+0x98>
mov    -0xc(%rbp),%eax
mov    $0x40,%ecx
sub    -0x1c(%rbp),%ecx
sar    %cl,%eax
or     -0x28(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0xc(%rbp),%eax
mov    -0x1c(%rbp),%ecx
shl    %cl,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    $0x20,%ecx
sar    %cl,%eax
mov    %eax,-0x30(%rbp)
mov    -0x2c(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    $0xffffffff,%edi
call   1050 <UINT32_C@plt>
mov    %eax,%ecx
mov    -0x50(%rbp),%eax
and    %ecx,%eax
mov    %eax,-0x34(%rbp)
xor    %edi,%edi
call   1030 <UINT64_C@plt>
mov    %eax,-0x38(%rbp)
mov    -0x28(%rbp),%eax
cltd
idivl  -0x20(%rbp)
mov    %eax,-0x3c(%rbp)
mov    -0x28(%rbp),%eax
mov    -0x3c(%rbp),%ecx
imul   -0x20(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x40(%rbp)
mov    -0x3c(%rbp),%ecx
mov    $0x1,%al
cmp    -0x38(%rbp),%ecx
mov    %al,-0x51(%rbp)
jge    1247 <divu+0x117>
mov    -0x3c(%rbp),%eax
imul   -0x24(%rbp),%eax
mov    -0x38(%rbp),%ecx
imul   -0x40(%rbp),%ecx
add    -0x30(%rbp),%ecx
cmp    %ecx,%eax
setg   %al
mov    %al,-0x51(%rbp)
mov    -0x51(%rbp),%al
test   $0x1,%al
jne    1257 <divu+0x127>
jmp    127f <divu+0x14f>
mov    -0x3c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x20(%rbp),%eax
add    -0x40(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x38(%rbp),%eax
jl     127a <divu+0x14a>
jmp    127f <divu+0x14f>
jmp    121d <divu+0xed>
mov    -0x28(%rbp),%eax
imul   -0x38(%rbp),%eax
add    -0x30(%rbp),%eax
mov    -0x3c(%rbp),%ecx
imul   -0x10(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cltd
idivl  -0x20(%rbp)
mov    %eax,-0x48(%rbp)
mov    -0x44(%rbp),%eax
mov    -0x48(%rbp),%ecx
imul   -0x20(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x40(%rbp)
mov    -0x48(%rbp),%ecx
mov    $0x1,%al
cmp    -0x38(%rbp),%ecx
mov    %al,-0x52(%rbp)
jge    12d8 <divu+0x1a8>
mov    -0x48(%rbp),%eax
imul   -0x24(%rbp),%eax
mov    -0x38(%rbp),%ecx
imul   -0x40(%rbp),%ecx
add    -0x34(%rbp),%ecx
cmp    %ecx,%eax
setg   %al
mov    %al,-0x52(%rbp)
mov    -0x52(%rbp),%al
test   $0x1,%al
jne    12e8 <divu+0x1b8>
jmp    1310 <divu+0x1e0>
mov    -0x48(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x48(%rbp)
mov    -0x20(%rbp),%eax
add    -0x40(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    -0x38(%rbp),%eax
jl     130b <divu+0x1db>
jmp    1310 <divu+0x1e0>
jmp    12ae <divu+0x17e>
mov    -0x3c(%rbp),%ecx
imul   -0x38(%rbp),%ecx
add    -0x48(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x44(%rbp),%eax
imul   -0x38(%rbp),%eax
add    -0x34(%rbp),%eax
mov    -0x48(%rbp),%ecx
imul   -0x10(%rbp),%ecx
sub    %ecx,%eax
mov    -0x1c(%rbp),%ecx
sar    %cl,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<divu>:
cmp    %edx,%edi
jge    1158 <divu+0x28>
push   %rax
mov    %edx,%edi
call   1040 <nlz@plt>
mov    $0xffffffff,%edi
call   1050 <UINT32_C@plt>
mov    $0xffffffff,%edi
call   1050 <UINT32_C@plt>
xor    %edi,%edi
pop    %rax
jmp    1030 <UINT64_C@plt>
mov    $0xffffffff,%edi
jmp    1030 <UINT64_C@plt>

LLVM IR (-O0):
define i32 @divu(i32 %0, i32 %1, i32 %2, i32* %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32*
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32* %3, i32** %9
%22 = load i32, i32* %6
%23 = load i32, i32* %8
%24 = icmp sge i32 %22, %23
br i1 %24, label %25, label %27
25: ; preds = %4
%26 = call i32 @UINT64_C(i32 -1)
store i32 %26, i32* %5
br label %158
27: ; preds = %4
%28 = load i32, i32* %8
%29 = call i32 @nlz(i32 %28)
store i32 %29, i32* %10
%30 = load i32, i32* %10
%31 = load i32, i32* %8
%32 = shl i32 %31, %30
store i32 %32, i32* %8
%33 = load i32, i32* %8
%34 = ashr i32 %33, 32
store i32 %34, i32* %11
%35 = load i32, i32* %8
%36 = call i32 @UINT32_C(i32 -1)
%37 = and i32 %35, %36
store i32 %37, i32* %12
%38 = load i32, i32* %6
%39 = load i32, i32* %10
%40 = shl i32 %38, %39
store i32 %40, i32* %13
%41 = load i32, i32* %10
%42 = icmp ne i32 %41, 0
br i1 %42, label %43, label %50
43: ; preds = %27
%44 = load i32, i32* %7
%45 = load i32, i32* %10
%46 = sub nsw i32 64, %45
%47 = ashr i32 %44, %46
%48 = load i32, i32* %13
%49 = or i32 %48, %47
store i32 %49, i32* %13
br label %50
50: ; preds = %43, %27
%51 = load i32, i32* %7
%52 = load i32, i32* %10
%53 = shl i32 %51, %52
store i32 %53, i32* %14
%54 = load i32, i32* %14
%55 = ashr i32 %54, 32
store i32 %55, i32* %15
%56 = load i32, i32* %14
%57 = call i32 @UINT32_C(i32 -1)
%58 = and i32 %56, %57
store i32 %58, i32* %16
%59 = call i32 @UINT64_C(i32 0)
store i32 %59, i32* %17
%60 = load i32, i32* %13
%61 = load i32, i32* %11
%62 = sdiv i32 %60, %61
store i32 %62, i32* %18
%63 = load i32, i32* %13
%64 = load i32, i32* %18
%65 = load i32, i32* %11
%66 = mul nsw i32 %64, %65
%67 = sub nsw i32 %63, %66
store i32 %67, i32* %19
br label %68
68: ; preds = %94, %50
%69 = load i32, i32* %18
%70 = load i32, i32* %17
%71 = icmp sge i32 %69, %70
br i1 %71, label %82, label %72
72: ; preds = %68
%73 = load i32, i32* %18
%74 = load i32, i32* %12
%75 = mul nsw i32 %73, %74
%76 = load i32, i32* %17
%77 = load i32, i32* %19
%78 = mul nsw i32 %76, %77
%79 = load i32, i32* %15
%80 = add nsw i32 %78, %79
%81 = icmp sgt i32 %75, %80
br label %82
82: ; preds = %72, %68
%83 = phi i1 [ true, %68 ], [ %81, %72 ]
br i1 %83, label %84, label %95
84: ; preds = %82
%85 = load i32, i32* %18
%86 = add nsw i32 %85, -1
store i32 %86, i32* %18
%87 = load i32, i32* %11
%88 = load i32, i32* %19
%89 = add nsw i32 %88, %87
store i32 %89, i32* %19
%90 = load i32, i32* %19
%91 = load i32, i32* %17
%92 = icmp sge i32 %90, %91
br i1 %92, label %93, label %94
93: ; preds = %84
br label %95
94: ; preds = %84
br label %68
95: ; preds = %93, %82
%96 = load i32, i32* %13
%97 = load i32, i32* %17
%98 = mul nsw i32 %96, %97
%99 = load i32, i32* %15
%100 = add nsw i32 %98, %99
%101 = load i32, i32* %18
%102 = load i32, i32* %8
%103 = mul nsw i32 %101, %102
%104 = sub nsw i32 %100, %103
store i32 %104, i32* %20
%105 = load i32, i32* %20
%106 = load i32, i32* %11
%107 = sdiv i32 %105, %106
store i32 %107, i32* %21
%108 = load i32, i32* %20
%109 = load i32, i32* %21
%110 = load i32, i32* %11
%111 = mul nsw i32 %109, %110
%112 = sub nsw i32 %108, %111
store i32 %112, i32* %19
br label %113
113: ; preds = %139, %95
%114 = load i32, i32* %21
%115 = load i32, i32* %17
%116 = icmp sge i32 %114, %115
br i1 %116, label %127, label %117
117: ; preds = %113
%118 = load i32, i32* %21
%119 = load i32, i32* %12
%120 = mul nsw i32 %118, %119
%121 = load i32, i32* %17
%122 = load i32, i32* %19
%123 = mul nsw i32 %121, %122
%124 = load i32, i32* %16
%125 = add nsw i32 %123, %124
%126 = icmp sgt i32 %120, %125
br label %127
127: ; preds = %117, %113
%128 = phi i1 [ true, %113 ], [ %126, %117 ]
br i1 %128, label %129, label %140
129: ; preds = %127
%130 = load i32, i32* %21
%131 = add nsw i32 %130, -1
store i32 %131, i32* %21
%132 = load i32, i32* %11
%133 = load i32, i32* %19
%134 = add nsw i32 %133, %132
store i32 %134, i32* %19
%135 = load i32, i32* %19
%136 = load i32, i32* %17
%137 = icmp sge i32 %135, %136
br i1 %137, label %138, label %139
138: ; preds = %129
br label %140
139: ; preds = %129
br label %113
140: ; preds = %138, %127
%141 = load i32, i32* %18
%142 = load i32, i32* %17
%143 = mul nsw i32 %141, %142
%144 = load i32, i32* %21
%145 = add nsw i32 %143, %144
%146 = load i32*, i32** %9
store i32 %145, i32* %146
%147 = load i32, i32* %20
%148 = load i32, i32* %17
%149 = mul nsw i32 %147, %148
%150 = load i32, i32* %16
%151 = add nsw i32 %149, %150
%152 = load i32, i32* %21
%153 = load i32, i32* %8
%154 = mul nsw i32 %152, %153
%155 = sub nsw i32 %151, %154
%156 = load i32, i32* %10
%157 = ashr i32 %155, %156
store i32 %157, i32* %5
br label %158
158: ; preds = %140, %25
%159 = load i32, i32* %5
ret i32 %159
}

LLVM IR (-O2):
define i32 @divu(i32 %0, i32 %1, i32 %2, i32* nocapture writeonly %3) {
%5 = icmp slt i32 %0, %2
br i1 %5, label %8, label %6
6: ; preds = %4
%7 = tail call i32 @UINT64_C(i32 -1)
br label %13
8: ; preds = %4
%9 = tail call i32 @nlz(i32 %2)
%10 = tail call i32 @UINT32_C(i32 -1)
%11 = tail call i32 @UINT32_C(i32 -1)
%12 = tail call i32 @UINT64_C(i32 0)
br label %13
13: ; preds = %8, %6
%14 = phi i32 [ %7, %6 ], [ poison, %8 ]
ret i32 %14
}