void mp_unsgn_idiv(int n, double dradix, int in1[], double din2, int out[]) {
  int j, ix, carry, shift;
  double x, d1_in2;
  short int *in1dgt, *outdgt;
  in1dgt = (short int *)&in1[1];
  outdgt = (short int *)&out[1];
  d1_in2 = (double)1 / din2;
  shift = -1;
  x = 0;
  do {
    shift++;
    x *= dradix;
    if (shift < n) {
      x += in1dgt[shift];
    }
  } while (x < din2 - ((double)0.5));
  x += ((double)0.5);
  ix = (int)(d1_in2 * x);
  carry = (int)(x - din2 * ix);
  outdgt[0] = (short int)ix;
  out[0] = in1[0] - shift;
  if (shift >= n) {
    shift = n - 1;
  }
  for (j = 1; j < n - shift; j++) {
    x = in1dgt[j + shift] + dradix * carry + ((double)0.5);
    ix = (int)(d1_in2 * x);
    carry = (int)(x - din2 * ix);
    outdgt[j] = (short int)ix;
  }
  for (j = n - shift; j < n; j++) {
    x = dradix * carry + ((double)0.5);
    ix = (int)(d1_in2 * x);
    carry = (int)(x - din2 * ix);
    outdgt[j] = (short int)ix;
  }
}


x86 assembly (clang, -O0):
<mp_unsgn_idiv>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movsd  %xmm0,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movsd  %xmm1,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
mov    -0x18(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x50(%rbp)
mov    -0x28(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x58(%rbp)
movsd  0xec7(%rip),%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0xffffffff,-0x38(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1190 <mp_unsgn_idiv+0x90>
mov    -0x50(%rbp),%rax
movslq -0x38(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
jmp    1195 <mp_unsgn_idiv+0x95>
movsd  -0x40(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
movsd  0xe61(%rip),%xmm2
subsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
ja     1152 <mp_unsgn_idiv+0x52>
movsd  0xe4b(%rip),%xmm0
addsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x30(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
cvtsi2sdl -0x30(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%eax
mov    %ax,%cx
mov    -0x58(%rbp),%rax
mov    %cx,(%rax)
mov    -0x18(%rbp),%rax
mov    (%rax),%ecx
sub    -0x38(%rbp),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x38(%rbp),%eax
cmp    -0x4(%rbp),%eax
jl     123e <mp_unsgn_idiv+0x13e>
mov    -0x4(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x38(%rbp)
movl   $0x1,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    -0x4(%rbp),%ecx
sub    -0x38(%rbp),%ecx
cmp    %ecx,%eax
jge    12f4 <mp_unsgn_idiv+0x1f4>
mov    -0x50(%rbp),%rax
mov    -0x2c(%rbp),%ecx
add    -0x38(%rbp),%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2sd %eax,%xmm1
movsd  -0x10(%rbp),%xmm0
cvtsi2sdl -0x34(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0xd83(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x30(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
cvtsi2sdl -0x30(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%eax
mov    %ax,%dx
mov    -0x58(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1245 <mp_unsgn_idiv+0x145>
mov    -0x4(%rbp),%eax
sub    -0x38(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    138e <mp_unsgn_idiv+0x28e>
movsd  -0x10(%rbp),%xmm0
cvtsi2sdl -0x34(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xce9(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x48(%rbp),%xmm0
mulsd  -0x40(%rbp),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x30(%rbp)
movsd  -0x40(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
cvtsi2sdl -0x30(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%eax
mov    %ax,%dx
mov    -0x58(%rbp),%rax
movslq -0x2c(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    12fd <mp_unsgn_idiv+0x1fd>
pop    %rbp
ret

x86 assembly (clang, -O2):
<mp_unsgn_idiv>:
movsd  0xef8(%rip),%xmm2
addsd  %xmm1,%xmm2
movslq %edi,%r11
xorpd  %xmm4,%xmm4
mov    $0xffffffff,%edi
xor    %ecx,%ecx
jmp    112d <mp_unsgn_idiv+0x2d>
nopl   0x0(%rax)
add    $0x1,%edi
lea    0x1(%rax),%rcx
ucomisd %xmm4,%xmm2
jbe    114b <mp_unsgn_idiv+0x4b>
mov    %rcx,%rax
mulsd  %xmm0,%xmm4
cmp    %r11,%rcx
jge    1120 <mp_unsgn_idiv+0x20>
movswl 0x4(%rsi,%rax,2),%ecx
xorps  %xmm3,%xmm3
cvtsi2sd %ecx,%xmm3
addsd  %xmm3,%xmm4
jmp    1120 <mp_unsgn_idiv+0x20>
movsd  0xeb5(%rip),%xmm2
addsd  0xeb5(%rip),%xmm4
divsd  %xmm1,%xmm2
movapd %xmm2,%xmm3
mulsd  %xmm4,%xmm3
cvttsd2si %xmm3,%ecx
mov    %cx,0x4(%rdx)
mov    (%rsi),%ecx
sub    %edi,%ecx
lea    -0x1(%r11),%r8d
cvttpd2dq %xmm3,%xmm3
cvtdq2pd %xmm3,%xmm5
cmp    %r11,%rax
movapd 0xe96(%rip),%xmm3
xorpd  %xmm1,%xmm3
mulsd  %xmm1,%xmm5
subsd  %xmm5,%xmm4
mov    %ecx,(%rdx)
cmovl  %edi,%r8d
mov    %r11d,%r9d
sub    %r8d,%r9d
cvttsd2si %xmm4,%ecx
cmp    $0x2,%r9d
jl     121d <mp_unsgn_idiv+0x11d>
movslq %r8d,%rax
mov    %r9d,%edi
lea    (%rsi,%rax,2),%r10
add    $0x6,%r10
add    $0xffffffffffffffff,%rdi
xor    %esi,%esi
movsd  0xe48(%rip),%xmm1
nopl   0x0(%rax,%rax,1)
movswl (%r10,%rsi,2),%eax
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
xorps  %xmm5,%xmm5
cvtsi2sd %ecx,%xmm5
mulsd  %xmm0,%xmm5
addsd  %xmm4,%xmm5
addsd  %xmm1,%xmm5
movapd %xmm2,%xmm4
mulsd  %xmm5,%xmm4
cvttsd2si %xmm4,%eax
cvttpd2dq %xmm4,%xmm4
cvtdq2pd %xmm4,%xmm4
mulsd  %xmm3,%xmm4
addsd  %xmm5,%xmm4
mov    %ax,0x6(%rdx,%rsi,2)
cvttsd2si %xmm4,%ecx
add    $0x1,%rsi
cmp    %rsi,%rdi
jne    11d0 <mp_unsgn_idiv+0xd0>
test   %r8d,%r8d
jle    126d <mp_unsgn_idiv+0x16d>
movslq %r9d,%rsi
movsd  0xde3(%rip),%xmm1
nopl   (%rax)
xorps  %xmm4,%xmm4
cvtsi2sd %ecx,%xmm4
mulsd  %xmm0,%xmm4
addsd  %xmm1,%xmm4
movapd %xmm2,%xmm5
mulsd  %xmm4,%xmm5
cvttsd2si %xmm5,%eax
cvttpd2dq %xmm5,%xmm5
cvtdq2pd %xmm5,%xmm5
mulsd  %xmm3,%xmm5
addsd  %xmm4,%xmm5
cvttsd2si %xmm5,%ecx
mov    %ax,0x4(%rdx,%rsi,2)
add    $0x1,%rsi
cmp    %r11,%rsi
jl     1230 <mp_unsgn_idiv+0x130>
ret

LLVM IR (-O0):
define void @mp_unsgn_idiv(i32 %0, double %1, i32* %2, double %3, i32* %4) {
%6 = alloca i32
%7 = alloca double
%8 = alloca i32*
%9 = alloca double
%10 = alloca i32*
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca double
%16 = alloca double
%17 = alloca i16*
%18 = alloca i16*
store i32 %0, i32* %6
store double %1, double* %7
store i32* %2, i32** %8
store double %3, double* %9
store i32* %4, i32** %10
%19 = load i32*, i32** %8
%20 = getelementptr inbounds i32, i32* %19, i64 1
%21 = bitcast i32* %20 to i16*
store i16* %21, i16** %17
%22 = load i32*, i32** %10
%23 = getelementptr inbounds i32, i32* %22, i64 1
%24 = bitcast i32* %23 to i16*
store i16* %24, i16** %18
%25 = load double, double* %9
%26 = fdiv double 1.000000e+00, %25
store double %26, double* %16
store i32 -1, i32* %14
store double 0.000000e+00, double* %15
br label %27
27: ; preds = %47, %5
%28 = load i32, i32* %14
%29 = add nsw i32 %28, 1
store i32 %29, i32* %14
%30 = load double, double* %7
%31 = load double, double* %15
%32 = fmul double %31, %30
store double %32, double* %15
%33 = load i32, i32* %14
%34 = load i32, i32* %6
%35 = icmp slt i32 %33, %34
br i1 %35, label %36, label %46
36: ; preds = %27
%37 = load i16*, i16** %17
%38 = load i32, i32* %14
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i16, i16* %37, i64 %39
%41 = load i16, i16* %40
%42 = sext i16 %41 to i32
%43 = sitofp i32 %42 to double
%44 = load double, double* %15
%45 = fadd double %44, %43
store double %45, double* %15
br label %46
46: ; preds = %36, %27
br label %47
47: ; preds = %46
%48 = load double, double* %15
%49 = load double, double* %9
%50 = fsub double %49, 5.000000e-01
%51 = fcmp olt double %48, %50
br i1 %51, label %27, label %52
52: ; preds = %47
%53 = load double, double* %15
%54 = fadd double %53, 5.000000e-01
store double %54, double* %15
%55 = load double, double* %16
%56 = load double, double* %15
%57 = fmul double %55, %56
%58 = fptosi double %57 to i32
store i32 %58, i32* %12
%59 = load double, double* %15
%60 = load double, double* %9
%61 = load i32, i32* %12
%62 = sitofp i32 %61 to double
%63 = fneg double %60
%64 = call double @llvm.fmuladd.f64(double %63, double %62, double %59)
%65 = fptosi double %64 to i32
store i32 %65, i32* %13
%66 = load i32, i32* %12
%67 = trunc i32 %66 to i16
%68 = load i16*, i16** %18
%69 = getelementptr inbounds i16, i16* %68, i64 0
store i16 %67, i16* %69
%70 = load i32*, i32** %8
%71 = getelementptr inbounds i32, i32* %70, i64 0
%72 = load i32, i32* %71
%73 = load i32, i32* %14
%74 = sub nsw i32 %72, %73
%75 = load i32*, i32** %10
%76 = getelementptr inbounds i32, i32* %75, i64 0
store i32 %74, i32* %76
%77 = load i32, i32* %14
%78 = load i32, i32* %6
%79 = icmp sge i32 %77, %78
br i1 %79, label %80, label %83
80: ; preds = %52
%81 = load i32, i32* %6
%82 = sub nsw i32 %81, 1
store i32 %82, i32* %14
br label %83
83: ; preds = %80, %52
store i32 1, i32* %11
br label %84
84: ; preds = %122, %83
%85 = load i32, i32* %11
%86 = load i32, i32* %6
%87 = load i32, i32* %14
%88 = sub nsw i32 %86, %87
%89 = icmp slt i32 %85, %88
br i1 %89, label %90, label %125
90: ; preds = %84
%91 = load i16*, i16** %17
%92 = load i32, i32* %11
%93 = load i32, i32* %14
%94 = add nsw i32 %92, %93
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds i16, i16* %91, i64 %95
%97 = load i16, i16* %96
%98 = sext i16 %97 to i32
%99 = sitofp i32 %98 to double
%100 = load double, double* %7
%101 = load i32, i32* %13
%102 = sitofp i32 %101 to double
%103 = call double @llvm.fmuladd.f64(double %100, double %102, double %99)
%104 = fadd double %103, 5.000000e-01
store double %104, double* %15
%105 = load double, double* %16
%106 = load double, double* %15
%107 = fmul double %105, %106
%108 = fptosi double %107 to i32
store i32 %108, i32* %12
%109 = load double, double* %15
%110 = load double, double* %9
%111 = load i32, i32* %12
%112 = sitofp i32 %111 to double
%113 = fneg double %110
%114 = call double @llvm.fmuladd.f64(double %113, double %112, double %109)
%115 = fptosi double %114 to i32
store i32 %115, i32* %13
%116 = load i32, i32* %12
%117 = trunc i32 %116 to i16
%118 = load i16*, i16** %18
%119 = load i32, i32* %11
%120 = sext i32 %119 to i64
%121 = getelementptr inbounds i16, i16* %118, i64 %120
store i16 %117, i16* %121
br label %122
122: ; preds = %90
%123 = load i32, i32* %11
%124 = add nsw i32 %123, 1
store i32 %124, i32* %11
br label %84
125: ; preds = %84
%126 = load i32, i32* %6
%127 = load i32, i32* %14
%128 = sub nsw i32 %126, %127
store i32 %128, i32* %11
br label %129
129: ; preds = %155, %125
%130 = load i32, i32* %11
%131 = load i32, i32* %6
%132 = icmp slt i32 %130, %131
br i1 %132, label %133, label %158
133: ; preds = %129
%134 = load double, double* %7
%135 = load i32, i32* %13
%136 = sitofp i32 %135 to double
%137 = call double @llvm.fmuladd.f64(double %134, double %136, double 5.000000e-01)
store double %137, double* %15
%138 = load double, double* %16
%139 = load double, double* %15
%140 = fmul double %138, %139
%141 = fptosi double %140 to i32
store i32 %141, i32* %12
%142 = load double, double* %15
%143 = load double, double* %9
%144 = load i32, i32* %12
%145 = sitofp i32 %144 to double
%146 = fneg double %143
%147 = call double @llvm.fmuladd.f64(double %146, double %145, double %142)
%148 = fptosi double %147 to i32
store i32 %148, i32* %13
%149 = load i32, i32* %12
%150 = trunc i32 %149 to i16
%151 = load i16*, i16** %18
%152 = load i32, i32* %11
%153 = sext i32 %152 to i64
%154 = getelementptr inbounds i16, i16* %151, i64 %153
store i16 %150, i16* %154
br label %155
155: ; preds = %133
%156 = load i32, i32* %11
%157 = add nsw i32 %156, 1
store i32 %157, i32* %11
br label %129
158: ; preds = %129
ret void
}

LLVM IR (-O2):
define void @mp_unsgn_idiv(i32 %0, double %1, i32* nocapture %2, double %3, i32* nocapture writeonly %4) {
%6 = getelementptr inbounds i32, i32* %2, i64 1
%7 = bitcast i32* %6 to i16*
%8 = getelementptr inbounds i32, i32* %4, i64 1
%9 = bitcast i32* %8 to i16*
%10 = fadd double %3, -5.000000e-01
%11 = sext i32 %0 to i64
br label %12
12: ; preds = %23, %5
%13 = phi i64 [ %15, %23 ], [ -1, %5 ]
%14 = phi double [ %24, %23 ], [ 0.000000e+00, %5 ]
%15 = add i64 %13, 1
%16 = fmul double %14, %1
%17 = icmp slt i64 %15, %11
br i1 %17, label %18, label %23
18: ; preds = %12
%19 = getelementptr inbounds i16, i16* %7, i64 %15
%20 = load i16, i16* %19
%21 = sitofp i16 %20 to double
%22 = fadd double %16, %21
br label %23
23: ; preds = %12, %18
%24 = phi double [ %22, %18 ], [ %16, %12 ]
%25 = fcmp olt double %24, %10
br i1 %25, label %12, label %26
26: ; preds = %23
%27 = fdiv double 1.000000e+00, %3
%28 = trunc i64 %15 to i32
%29 = fadd double %24, 5.000000e-01
%30 = fmul double %27, %29
%31 = fptosi double %30 to i32
%32 = sitofp i32 %31 to double
%33 = fneg double %3
%34 = tail call double @llvm.fmuladd.f64(double %33, double %32, double %29)
%35 = trunc i32 %31 to i16
store i16 %35, i16* %9
%36 = load i32, i32* %2
%37 = sub nsw i32 %36, %28
store i32 %37, i32* %4
%38 = add nsw i32 %0, -1
%39 = select i1 %17, i32 %28, i32 %38
%40 = sub i32 %0, %39
%41 = fptosi double %34 to i32
%42 = icmp sgt i32 %40, 1
br i1 %42, label %43, label %46
43: ; preds = %26
%44 = sext i32 %39 to i64
%45 = zext i32 %40 to i64
br label %51
46: ; preds = %51, %26
%47 = phi i32 [ %41, %26 ], [ %68, %51 ]
%48 = icmp sgt i32 %39, 0
br i1 %48, label %49, label %84
49: ; preds = %46
%50 = sext i32 %40 to i64
br label %70
51: ; preds = %43, %51
%52 = phi i64 [ 1, %43 ], [ %67, %51 ]
%53 = phi i32 [ %41, %43 ], [ %68, %51 ]
%54 = add nsw i64 %52, %44
%55 = getelementptr inbounds i16, i16* %7, i64 %54
%56 = load i16, i16* %55
%57 = sitofp i16 %56 to double
%58 = sitofp i32 %53 to double
%59 = tail call double @llvm.fmuladd.f64(double %1, double %58, double %57)
%60 = fadd double %59, 5.000000e-01
%61 = fmul double %27, %60
%62 = fptosi double %61 to i32
%63 = sitofp i32 %62 to double
%64 = tail call double @llvm.fmuladd.f64(double %33, double %63, double %60)
%65 = trunc i32 %62 to i16
%66 = getelementptr inbounds i16, i16* %9, i64 %52
store i16 %65, i16* %66
%67 = add nuw nsw i64 %52, 1
%68 = fptosi double %64 to i32
%69 = icmp eq i64 %67, %45
br i1 %69, label %46, label %51
70: ; preds = %49, %70
%71 = phi i64 [ %50, %49 ], [ %82, %70 ]
%72 = phi i32 [ %47, %49 ], [ %79, %70 ]
%73 = sitofp i32 %72 to double
%74 = tail call double @llvm.fmuladd.f64(double %1, double %73, double 5.000000e-01)
%75 = fmul double %27, %74
%76 = fptosi double %75 to i32
%77 = sitofp i32 %76 to double
%78 = tail call double @llvm.fmuladd.f64(double %33, double %77, double %74)
%79 = fptosi double %78 to i32
%80 = trunc i32 %76 to i16
%81 = getelementptr inbounds i16, i16* %9, i64 %71
store i16 %80, i16* %81
%82 = add nsw i64 %71, 1
%83 = icmp slt i64 %82, %11
br i1 %83, label %70, label %84
84: ; preds = %70, %46
ret void
}