double MaskDigit(arg, exponent)
double *arg;
int exponent;
{
  double base, val;
  int index;
  val = *arg;
  if (exponent < 0) {
    for (index = exponent; index < 0; index++) {
      val *= 10.0;
    }
  } else {
    for (index = 0; index < exponent; index++) {
      val /= 10.0;
    }
  }
  if (val < 0)
    val = -floor(-val);
  else
    val = floor(val);
  base = val;
  if (exponent < 0)
    for (index = exponent; index < 0; index++)
      val /= 10.0;
  else
    for (index = 0; index < exponent; index++)
      val *= 10.0;
  *arg = val;
  return (base);
}


x86 assembly (clang, -O0):
<MaskDigit>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x20(%rbp)
cmpl   $0x0,-0xc(%rbp)
jge    116b <MaskDigit+0x5b>
mov    -0xc(%rbp),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jge    1166 <MaskDigit+0x56>
movsd  0xeb2(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    113c <MaskDigit+0x2c>
jmp    11a7 <MaskDigit+0x97>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11a2 <MaskDigit+0x92>
movsd  -0x20(%rbp),%xmm0
movsd  0xe75(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1172 <MaskDigit+0x62>
jmp    11a7 <MaskDigit+0x97>
xorps  %xmm0,%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    11f7 <MaskDigit+0xe7>
movsd  -0x20(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
call   1030 <floor@plt>
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1206 <MaskDigit+0xf6>
movsd  -0x20(%rbp),%xmm0
call   1030 <floor@plt>
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
cmpl   $0x0,-0xc(%rbp)
jge    1253 <MaskDigit+0x143>
mov    -0xc(%rbp),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jge    124e <MaskDigit+0x13e>
movsd  -0x20(%rbp),%xmm0
movsd  0xdc9(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1220 <MaskDigit+0x110>
jmp    128b <MaskDigit+0x17b>
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1286 <MaskDigit+0x176>
movsd  0xd92(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    125a <MaskDigit+0x14a>
jmp    128b <MaskDigit+0x17b>
movsd  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x18(%rbp),%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<MaskDigit>:
push   %r14
push   %rbx
push   %rax
mov    %esi,%ebx
mov    %rdi,%r14
movsd  (%rdi),%xmm0
test   %esi,%esi
js     118b <MaskDigit+0x7b>
je     11f5 <MaskDigit+0xe5>
lea    -0x1(%rbx),%ecx
mov    %ebx,%eax
and    $0x3,%eax
cmp    $0x3,%ecx
jb     1165 <MaskDigit+0x55>
mov    %ebx,%ecx
and    $0xfffffffc,%ecx
movsd  0xebf(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
divsd  %xmm1,%xmm0
divsd  %xmm1,%xmm0
divsd  %xmm1,%xmm0
divsd  %xmm1,%xmm0
add    $0xfffffffc,%ecx
jne    1150 <MaskDigit+0x40>
test   %eax,%eax
je     11f5 <MaskDigit+0xe5>
movsd  0xe8b(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nop
divsd  %xmm1,%xmm0
add    $0xffffffff,%eax
jne    1180 <MaskDigit+0x70>
jmp    11f5 <MaskDigit+0xe5>
mov    %ebx,%eax
neg    %eax
and    $0x7,%eax
je     11b6 <MaskDigit+0xa6>
neg    %eax
xor    %ecx,%ecx
movsd  0xe60(%rip),%xmm1
mulsd  %xmm1,%xmm0
add    $0xffffffff,%ecx
cmp    %ecx,%eax
jne    11a0 <MaskDigit+0x90>
mov    %ebx,%eax
sub    %ecx,%eax
cmp    $0xfffffff8,%ebx
jbe    11bd <MaskDigit+0xad>
jmp    11f5 <MaskDigit+0xe5>
mov    %ebx,%eax
cmp    $0xfffffff8,%ebx
ja     11f5 <MaskDigit+0xe5>
movsd  0xe3b(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
nop
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
mulsd  %xmm1,%xmm0
add    $0x8,%eax
jne    11d0 <MaskDigit+0xc0>
xorpd  %xmm1,%xmm1
ucomisd %xmm0,%xmm1
jbe    129b <MaskDigit+0x18b>
xorpd  0xe05(%rip),%xmm0
call   1030 <floor@plt>
xorpd  0xdf8(%rip),%xmm0
test   %ebx,%ebx
js     12a8 <MaskDigit+0x198>
movapd %xmm0,%xmm1
je     1315 <MaskDigit+0x205>
lea    -0x1(%rbx),%ecx
mov    %ebx,%eax
and    $0x7,%eax
movapd %xmm0,%xmm1
cmp    $0x7,%ecx
jb     1275 <MaskDigit+0x165>
and    $0xfffffff8,%ebx
movsd  0xdba(%rip),%xmm2
movapd %xmm0,%xmm1
nopw   0x0(%rax,%rax,1)
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
mulsd  %xmm2,%xmm1
add    $0xfffffff8,%ebx
jne    1250 <MaskDigit+0x140>
test   %eax,%eax
je     1315 <MaskDigit+0x205>
movsd  0xd7b(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
nop
mulsd  %xmm2,%xmm1
add    $0xffffffff,%eax
jne    1290 <MaskDigit+0x180>
jmp    1315 <MaskDigit+0x205>
call   1030 <floor@plt>
test   %ebx,%ebx
jns    1220 <MaskDigit+0x110>
mov    %ebx,%eax
neg    %eax
and    $0x3,%eax
je     12e6 <MaskDigit+0x1d6>
neg    %eax
xor    %ecx,%ecx
movsd  0xd43(%rip),%xmm2
movapd %xmm0,%xmm1
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
divsd  %xmm2,%xmm1
add    $0xffffffff,%ecx
cmp    %ecx,%eax
jne    12d0 <MaskDigit+0x1c0>
mov    %ebx,%eax
sub    %ecx,%eax
cmp    $0xfffffffc,%ebx
jbe    12f1 <MaskDigit+0x1e1>
jmp    1315 <MaskDigit+0x205>
mov    %ebx,%eax
movapd %xmm0,%xmm1
cmp    $0xfffffffc,%ebx
ja     1315 <MaskDigit+0x205>
movsd  0xd07(%rip),%xmm2
nopl   0x0(%rax)
divsd  %xmm2,%xmm1
divsd  %xmm2,%xmm1
divsd  %xmm2,%xmm1
divsd  %xmm2,%xmm1
add    $0x4,%eax
jne    1300 <MaskDigit+0x1f0>
movsd  %xmm1,(%r14)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define double @MaskDigit(double* %0, i32 %1) {
%3 = alloca double*
%4 = alloca i32
%5 = alloca double
%6 = alloca double
%7 = alloca i32
store double* %0, double** %3
store i32 %1, i32* %4
%8 = load double*, double** %3
%9 = load double, double* %8
store double %9, double* %6
%10 = load i32, i32* %4
%11 = icmp slt i32 %10, 0
br i1 %11, label %12, label %24
12: ; preds = %2
%13 = load i32, i32* %4
store i32 %13, i32* %7
br label %14
14: ; preds = %20, %12
%15 = load i32, i32* %7
%16 = icmp slt i32 %15, 0
br i1 %16, label %17, label %23
17: ; preds = %14
%18 = load double, double* %6
%19 = fmul double %18, 1.000000e+01
store double %19, double* %6
br label %20
20: ; preds = %17
%21 = load i32, i32* %7
%22 = add nsw i32 %21, 1
store i32 %22, i32* %7
br label %14
23: ; preds = %14
br label %36
24: ; preds = %2
store i32 0, i32* %7
br label %25
25: ; preds = %32, %24
%26 = load i32, i32* %7
%27 = load i32, i32* %4
%28 = icmp slt i32 %26, %27
br i1 %28, label %29, label %35
29: ; preds = %25
%30 = load double, double* %6
%31 = fdiv double %30, 1.000000e+01
store double %31, double* %6
br label %32
32: ; preds = %29
%33 = load i32, i32* %7
%34 = add nsw i32 %33, 1
store i32 %34, i32* %7
br label %25
35: ; preds = %25
br label %36
36: ; preds = %35, %23
%37 = load double, double* %6
%38 = fcmp olt double %37, 0.000000e+00
br i1 %38, label %39, label %44
39: ; preds = %36
%40 = load double, double* %6
%41 = fneg double %40
%42 = call double @llvm.floor.f64(double %41)
%43 = fneg double %42
store double %43, double* %6
br label %47
44: ; preds = %36
%45 = load double, double* %6
%46 = call double @llvm.floor.f64(double %45)
store double %46, double* %6
br label %47
47: ; preds = %44, %39
%48 = load double, double* %6
store double %48, double* %5
%49 = load i32, i32* %4
%50 = icmp slt i32 %49, 0
br i1 %50, label %51, label %63
51: ; preds = %47
%52 = load i32, i32* %4
store i32 %52, i32* %7
br label %53
53: ; preds = %59, %51
%54 = load i32, i32* %7
%55 = icmp slt i32 %54, 0
br i1 %55, label %56, label %62
56: ; preds = %53
%57 = load double, double* %6
%58 = fdiv double %57, 1.000000e+01
store double %58, double* %6
br label %59
59: ; preds = %56
%60 = load i32, i32* %7
%61 = add nsw i32 %60, 1
store i32 %61, i32* %7
br label %53
62: ; preds = %53
br label %75
63: ; preds = %47
store i32 0, i32* %7
br label %64
64: ; preds = %71, %63
%65 = load i32, i32* %7
%66 = load i32, i32* %4
%67 = icmp slt i32 %65, %66
br i1 %67, label %68, label %74
68: ; preds = %64
%69 = load double, double* %6
%70 = fmul double %69, 1.000000e+01
store double %70, double* %6
br label %71
71: ; preds = %68
%72 = load i32, i32* %7
%73 = add nsw i32 %72, 1
store i32 %73, i32* %7
br label %64
74: ; preds = %64
br label %75
75: ; preds = %74, %62
%76 = load double, double* %6
%77 = load double*, double** %3
store double %76, double* %77
%78 = load double, double* %5
ret double %78
}

LLVM IR (-O2):
define double @MaskDigit(double* nocapture %0, i32 %1) {
%3 = load double, double* %0
%4 = icmp slt i32 %1, 0
br i1 %4, label %5, label %22
5: ; preds = %2
%6 = sub i32 0, %1
%7 = and i32 %6, 7
%8 = icmp eq i32 %7, 0
br i1 %8, label %17, label %9
9: ; preds = %5, %9
%10 = phi i32 [ %14, %9 ], [ %1, %5 ]
%11 = phi double [ %13, %9 ], [ %3, %5 ]
%12 = phi i32 [ %15, %9 ], [ 0, %5 ]
%13 = fmul double %11, 1.000000e+01
%14 = add i32 %10, 1
%15 = add i32 %12, 1
%16 = icmp eq i32 %15, %7
br i1 %16, label %17, label %9
17: ; preds = %9, %5
%18 = phi double [ undef, %5 ], [ %13, %9 ]
%19 = phi i32 [ %1, %5 ], [ %14, %9 ]
%20 = phi double [ %3, %5 ], [ %13, %9 ]
%21 = icmp ugt i32 %1, -8
br i1 %21, label %62, label %30
22: ; preds = %2
%23 = icmp eq i32 %1, 0
br i1 %23, label %62, label %24
24: ; preds = %22
%25 = add i32 %1, -1
%26 = and i32 %1, 3
%27 = icmp ult i32 %25, 3
br i1 %27, label %52, label %28
28: ; preds = %24
%29 = and i32 %1, -4
br label %43
30: ; preds = %17, %30
%31 = phi i32 [ %41, %30 ], [ %19, %17 ]
%32 = phi double [ %40, %30 ], [ %20, %17 ]
%33 = fmul double %32, 1.000000e+01
%34 = fmul double %33, 1.000000e+01
%35 = fmul double %34, 1.000000e+01
%36 = fmul double %35, 1.000000e+01
%37 = fmul double %36, 1.000000e+01
%38 = fmul double %37, 1.000000e+01
%39 = fmul double %38, 1.000000e+01
%40 = fmul double %39, 1.000000e+01
%41 = add i32 %31, 8
%42 = icmp eq i32 %41, 0
br i1 %42, label %62, label %30
43: ; preds = %43, %28
%44 = phi double [ %3, %28 ], [ %49, %43 ]
%45 = phi i32 [ 0, %28 ], [ %50, %43 ]
%46 = fdiv double %44, 1.000000e+01
%47 = fdiv double %46, 1.000000e+01
%48 = fdiv double %47, 1.000000e+01
%49 = fdiv double %48, 1.000000e+01
%50 = add i32 %45, 4
%51 = icmp eq i32 %50, %29
br i1 %51, label %52, label %43
52: ; preds = %43, %24
%53 = phi double [ undef, %24 ], [ %49, %43 ]
%54 = phi double [ %3, %24 ], [ %49, %43 ]
%55 = icmp eq i32 %26, 0
br i1 %55, label %62, label %56
56: ; preds = %52, %56
%57 = phi double [ %59, %56 ], [ %54, %52 ]
%58 = phi i32 [ %60, %56 ], [ 0, %52 ]
%59 = fdiv double %57, 1.000000e+01
%60 = add i32 %58, 1
%61 = icmp eq i32 %60, %26
br i1 %61, label %62, label %56
62: ; preds = %52, %56, %17, %30, %22
%63 = phi double [ %3, %22 ], [ %18, %17 ], [ %40, %30 ], [ %53, %52 ], [ %59, %56 ]
%64 = fcmp olt double %63, 0.000000e+00
br i1 %64, label %65, label %69
65: ; preds = %62
%66 = fneg double %63
%67 = tail call double @llvm.floor.f64(double %66)
%68 = fneg double %67
br label %71
69: ; preds = %62
%70 = tail call double @llvm.floor.f64(double %63)
br label %71
71: ; preds = %69, %65
%72 = phi double [ %68, %65 ], [ %70, %69 ]
br i1 %4, label %73, label %90
73: ; preds = %71
%74 = sub i32 0, %1
%75 = and i32 %74, 3
%76 = icmp eq i32 %75, 0
br i1 %76, label %85, label %77
77: ; preds = %73, %77
%78 = phi i32 [ %82, %77 ], [ %1, %73 ]
%79 = phi double [ %81, %77 ], [ %72, %73 ]
%80 = phi i32 [ %83, %77 ], [ 0, %73 ]
%81 = fdiv double %79, 1.000000e+01
%82 = add i32 %78, 1
%83 = add i32 %80, 1
%84 = icmp eq i32 %83, %75
br i1 %84, label %85, label %77
85: ; preds = %77, %73
%86 = phi double [ undef, %73 ], [ %81, %77 ]
%87 = phi i32 [ %1, %73 ], [ %82, %77 ]
%88 = phi double [ %72, %73 ], [ %81, %77 ]
%89 = icmp ugt i32 %1, -4
br i1 %89, label %130, label %98
90: ; preds = %71
%91 = icmp eq i32 %1, 0
br i1 %91, label %130, label %92
92: ; preds = %90
%93 = add i32 %1, -1
%94 = and i32 %1, 7
%95 = icmp ult i32 %93, 7
br i1 %95, label %120, label %96
96: ; preds = %92
%97 = and i32 %1, -8
br label %107
98: ; preds = %85, %98
%99 = phi i32 [ %105, %98 ], [ %87, %85 ]
%100 = phi double [ %104, %98 ], [ %88, %85 ]
%101 = fdiv double %100, 1.000000e+01
%102 = fdiv double %101, 1.000000e+01
%103 = fdiv double %102, 1.000000e+01
%104 = fdiv double %103, 1.000000e+01
%105 = add i32 %99, 4
%106 = icmp eq i32 %105, 0
br i1 %106, label %130, label %98
107: ; preds = %107, %96
%108 = phi double [ %72, %96 ], [ %117, %107 ]
%109 = phi i32 [ 0, %96 ], [ %118, %107 ]
%110 = fmul double %108, 1.000000e+01
%111 = fmul double %110, 1.000000e+01
%112 = fmul double %111, 1.000000e+01
%113 = fmul double %112, 1.000000e+01
%114 = fmul double %113, 1.000000e+01
%115 = fmul double %114, 1.000000e+01
%116 = fmul double %115, 1.000000e+01
%117 = fmul double %116, 1.000000e+01
%118 = add i32 %109, 8
%119 = icmp eq i32 %118, %97
br i1 %119, label %120, label %107
120: ; preds = %107, %92
%121 = phi double [ undef, %92 ], [ %117, %107 ]
%122 = phi double [ %72, %92 ], [ %117, %107 ]
%123 = icmp eq i32 %94, 0
br i1 %123, label %130, label %124
124: ; preds = %120, %124
%125 = phi double [ %127, %124 ], [ %122, %120 ]
%126 = phi i32 [ %128, %124 ], [ 0, %120 ]
%127 = fmul double %125, 1.000000e+01
%128 = add i32 %126, 1
%129 = icmp eq i32 %128, %94
br i1 %129, label %130, label %124
130: ; preds = %120, %124, %85, %98, %90
%131 = phi double [ %72, %90 ], [ %86, %85 ], [ %104, %98 ], [ %121, %120 ], [ %127, %124 ]
store double %131, double* %0
ret double %72
}