char *_pscien(r, s, n, b)
float r;
register char *s;
{
  int sign, dp;
  register char *s1;
  if (b == 0)
    n = 7;
  else
    n += 1;
  s1 = ecvt(r, n, &dp, &sign);
  if (sign)
    *s++ = '-';
  *s++ = *s1++;
  *s++ = '.';
  while (--n > 0)
    if (*s1)
      *s++ = *s1++;
    else
      *s++ = '0';
  *s++ = 'e';
  if (r)
    --dp;
  if (dp < 0) {
    *s++ = '-';
    dp = -dp;
  } else {
    *s++ = '+';
  }
  if (dp >= 100) {
    *s++ = '0' + (dp / 100);
    dp %= 100;
  }
  *s++ = '0' + (dp / 10);
  *s++ = '0' + (dp % 10);
  return (s);
}


x86 assembly (clang, -O0):
<_pscien>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
cmpl   $0x0,-0x18(%rbp)
jne    1141 <_pscien+0x31>
movl   $0x7,-0x14(%rbp)
jmp    114a <_pscien+0x3a>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mov    -0x14(%rbp),%edi
lea    -0x20(%rbp),%rsi
lea    -0x1c(%rbp),%rdx
mov    $0x1,%al
call   1030 <ecvt@plt>
cltq
mov    %rax,-0x28(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     1187 <_pscien+0x77>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x2d,(%rax)
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x2e,(%rax)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
cmp    $0x0,%eax
jle    1218 <_pscien+0x108>
mov    -0x28(%rbp),%rax
cmpb   $0x0,(%rax)
je     1201 <_pscien+0xf1>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
jmp    1213 <_pscien+0x103>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x30,(%rax)
jmp    11bb <_pscien+0xab>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x65,(%rax)
movss  -0x4(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1246 <_pscien+0x136>
jp     1246 <_pscien+0x136>
jmp    124f <_pscien+0x13f>
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
jge    1278 <_pscien+0x168>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x2d,(%rax)
xor    %eax,%eax
sub    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    128a <_pscien+0x17a>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movb   $0x2b,(%rax)
cmpl   $0x64,-0x20(%rbp)
jl     12c3 <_pscien+0x1b3>
mov    -0x20(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
add    $0x30,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x20(%rbp),%eax
mov    $0x64,%ecx
cltd
idiv   %ecx
mov    %edx,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
add    $0x30,%eax
mov    %al,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x20(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
mov    %dl,%cl
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cl,(%rax)
mov    -0x10(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<_pscien>:
push   %rbp
push   %rbx
sub    $0x18,%rsp
mov    %rdi,%rbx
cvtsd2ss %xmm0,%xmm0
add    $0x1,%esi
test   %edx,%edx
mov    $0x7,%ebp
cmovne %esi,%ebp
movss  %xmm0,0x10(%rsp)
cvtss2sd %xmm0,%xmm0
lea    0xc(%rsp),%rsi
lea    0x14(%rsp),%rdx
mov    %ebp,%edi
mov    $0x1,%al
call   1030 <ecvt@plt>
cltq
cmpl   $0x0,0x14(%rsp)
je     1157 <_pscien+0x47>
movb   $0x2d,(%rbx)
add    $0x1,%rbx
mov    (%rax),%cl
mov    %cl,(%rbx)
movb   $0x2e,0x1(%rbx)
add    $0x2,%rbx
cmp    $0x2,%ebp
jl     119f <_pscien+0x8f>
add    $0x1,%rax
add    $0x1,%ebp
mov    $0x30,%ecx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzbl (%rax),%edx
xor    %esi,%esi
test   %dl,%dl
setne  %sil
cmove  %ecx,%edx
add    %rsi,%rax
mov    %dl,(%rbx)
add    $0x1,%rbx
add    $0xffffffff,%ebp
cmp    $0x2,%ebp
ja     1180 <_pscien+0x70>
movb   $0x65,(%rbx)
xorps  %xmm0,%xmm0
movss  0x10(%rsp),%xmm1
ucomiss %xmm0,%xmm1
mov    0xc(%rsp),%eax
jne    11b6 <_pscien+0xa6>
jnp    11bd <_pscien+0xad>
add    $0xffffffff,%eax
mov    %eax,0xc(%rsp)
test   %eax,%eax
js     1208 <_pscien+0xf8>
movb   $0x2b,0x1(%rbx)
mov    0xc(%rsp),%eax
cmp    $0x64,%eax
jl     121b <_pscien+0x10b>
mov    %eax,%eax
imul   $0x51eb851f,%rax,%rax
shr    $0x25,%rax
add    $0x30,%al
mov    %al,0x2(%rbx)
add    $0x3,%rbx
movslq 0xc(%rsp),%rax
imul   $0x51eb851f,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
sar    $0x25,%rcx
add    %edx,%ecx
imul   $0x64,%ecx,%ecx
sub    %ecx,%eax
mov    %eax,0xc(%rsp)
jmp    121f <_pscien+0x10f>
movb   $0x2d,0x1(%rbx)
xor    %eax,%eax
sub    0xc(%rsp),%eax
mov    %eax,0xc(%rsp)
cmp    $0x64,%eax
jge    11ce <_pscien+0xbe>
add    $0x2,%rbx
cltq
imul   $0x66666667,%rax,%rax
mov    %rax,%rcx
shr    $0x3f,%rcx
shr    $0x22,%rax
add    %ecx,%eax
add    $0x30,%al
mov    %al,(%rbx)
movslq 0xc(%rsp),%rax
imul   $0x66666667,%rax,%rcx
mov    %rcx,%rdx
shr    $0x3f,%rdx
shr    $0x22,%rcx
add    %edx,%ecx
add    %ecx,%ecx
lea    (%rcx,%rcx,4),%ecx
sub    %ecx,%eax
add    $0x30,%al
mov    %al,0x1(%rbx)
add    $0x2,%rbx
mov    %rbx,%rax
add    $0x18,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define i8* @_pscien(double %0, i8* %1, i32 %2, i32 %3) {
%5 = alloca float
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i8*
%12 = fptrunc double %0 to float
store float %12, float* %5
store i8* %1, i8** %6
store i32 %2, i32* %7
store i32 %3, i32* %8
%13 = load i32, i32* %8
%14 = icmp eq i32 %13, 0
br i1 %14, label %15, label %16
15: ; preds = %4
store i32 7, i32* %7
br label %19
16: ; preds = %4
%17 = load i32, i32* %7
%18 = add nsw i32 %17, 1
store i32 %18, i32* %7
br label %19
19: ; preds = %16, %15
%20 = load float, float* %5
%21 = fpext float %20 to double
%22 = load i32, i32* %7
%23 = call i32 (double, i32, i32*, i32*, ...) bitcast (i32 (...)* @ecvt to i32 (double, i32, i32*, i32*, ...)*)(double %21, i32 %22, i32* %10, i32* %9)
%24 = sext i32 %23 to i64
%25 = inttoptr i64 %24 to i8*
store i8* %25, i8** %11
%26 = load i32, i32* %9
%27 = icmp ne i32 %26, 0
br i1 %27, label %28, label %31
28: ; preds = %19
%29 = load i8*, i8** %6
%30 = getelementptr inbounds i8, i8* %29, i32 1
store i8* %30, i8** %6
store i8 45, i8* %29
br label %31
31: ; preds = %28, %19
%32 = load i8*, i8** %11
%33 = getelementptr inbounds i8, i8* %32, i32 1
store i8* %33, i8** %11
%34 = load i8, i8* %32
%35 = load i8*, i8** %6
%36 = getelementptr inbounds i8, i8* %35, i32 1
store i8* %36, i8** %6
store i8 %34, i8* %35
%37 = load i8*, i8** %6
%38 = getelementptr inbounds i8, i8* %37, i32 1
store i8* %38, i8** %6
store i8 46, i8* %37
br label %39
39: ; preds = %56, %31
%40 = load i32, i32* %7
%41 = add nsw i32 %40, -1
store i32 %41, i32* %7
%42 = icmp sgt i32 %41, 0
br i1 %42, label %43, label %57
43: ; preds = %39
%44 = load i8*, i8** %11
%45 = load i8, i8* %44
%46 = icmp ne i8 %45, 0
br i1 %46, label %47, label %53
47: ; preds = %43
%48 = load i8*, i8** %11
%49 = getelementptr inbounds i8, i8* %48, i32 1
store i8* %49, i8** %11
%50 = load i8, i8* %48
%51 = load i8*, i8** %6
%52 = getelementptr inbounds i8, i8* %51, i32 1
store i8* %52, i8** %6
store i8 %50, i8* %51
br label %56
53: ; preds = %43
%54 = load i8*, i8** %6
%55 = getelementptr inbounds i8, i8* %54, i32 1
store i8* %55, i8** %6
store i8 48, i8* %54
br label %56
56: ; preds = %53, %47
br label %39
57: ; preds = %39
%58 = load i8*, i8** %6
%59 = getelementptr inbounds i8, i8* %58, i32 1
store i8* %59, i8** %6
store i8 101, i8* %58
%60 = load float, float* %5
%61 = fcmp une float %60, 0.000000e+00
br i1 %61, label %62, label %65
62: ; preds = %57
%63 = load i32, i32* %10
%64 = add nsw i32 %63, -1
store i32 %64, i32* %10
br label %65
65: ; preds = %62, %57
%66 = load i32, i32* %10
%67 = icmp slt i32 %66, 0
br i1 %67, label %68, label %73
68: ; preds = %65
%69 = load i8*, i8** %6
%70 = getelementptr inbounds i8, i8* %69, i32 1
store i8* %70, i8** %6
store i8 45, i8* %69
%71 = load i32, i32* %10
%72 = sub nsw i32 0, %71
store i32 %72, i32* %10
br label %76
73: ; preds = %65
%74 = load i8*, i8** %6
%75 = getelementptr inbounds i8, i8* %74, i32 1
store i8* %75, i8** %6
store i8 43, i8* %74
br label %76
76: ; preds = %73, %68
%77 = load i32, i32* %10
%78 = icmp sge i32 %77, 100
br i1 %78, label %79, label %88
79: ; preds = %76
%80 = load i32, i32* %10
%81 = sdiv i32 %80, 100
%82 = add nsw i32 48, %81
%83 = trunc i32 %82 to i8
%84 = load i8*, i8** %6
%85 = getelementptr inbounds i8, i8* %84, i32 1
store i8* %85, i8** %6
store i8 %83, i8* %84
%86 = load i32, i32* %10
%87 = srem i32 %86, 100
store i32 %87, i32* %10
br label %88
88: ; preds = %79, %76
%89 = load i32, i32* %10
%90 = sdiv i32 %89, 10
%91 = add nsw i32 48, %90
%92 = trunc i32 %91 to i8
%93 = load i8*, i8** %6
%94 = getelementptr inbounds i8, i8* %93, i32 1
store i8* %94, i8** %6
store i8 %92, i8* %93
%95 = load i32, i32* %10
%96 = srem i32 %95, 10
%97 = add nsw i32 48, %96
%98 = trunc i32 %97 to i8
%99 = load i8*, i8** %6
%100 = getelementptr inbounds i8, i8* %99, i32 1
store i8* %100, i8** %6
store i8 %98, i8* %99
%101 = load i8*, i8** %6
ret i8* %101
}

LLVM IR (-O2):
define i8* @_pscien(double %0, i8* writeonly %1, i32 %2, i32 %3) {
%5 = alloca i32
%6 = alloca i32
%7 = fptrunc double %0 to float
%8 = bitcast i32* %5 to i8*
%9 = bitcast i32* %6 to i8*
%10 = icmp eq i32 %3, 0
%11 = add nsw i32 %2, 1
%12 = select i1 %10, i32 7, i32 %11
%13 = fpext float %7 to double
%14 = call i32 (double, i32, i32*, i32*, ...) bitcast (i32 (...)* @ecvt to i32 (double, i32, i32*, i32*, ...)*)(double %13, i32 %12, i32* %6, i32* %5)
%15 = sext i32 %14 to i64
%16 = inttoptr i64 %15 to i8*
%17 = load i32, i32* %5
%18 = icmp eq i32 %17, 0
br i1 %18, label %21, label %19
19: ; preds = %4
%20 = getelementptr inbounds i8, i8* %1, i64 1
store i8 45, i8* %1
br label %21
21: ; preds = %19, %4
%22 = phi i8* [ %20, %19 ], [ %1, %4 ]
%23 = load i8, i8* %16
%24 = getelementptr inbounds i8, i8* %22, i64 1
store i8 %23, i8* %22
%25 = getelementptr inbounds i8, i8* %22, i64 2
store i8 46, i8* %24
%26 = icmp sgt i32 %12, 1
br i1 %26, label %27, label %42
27: ; preds = %21
%28 = getelementptr inbounds i8, i8* %16, i64 1
br label %29
29: ; preds = %27, %29
%30 = phi i8* [ %39, %29 ], [ %28, %27 ]
%31 = phi i8* [ %40, %29 ], [ %25, %27 ]
%32 = phi i32 [ %33, %29 ], [ %12, %27 ]
%33 = add nsw i32 %32, -1
%34 = load i8, i8* %30
%35 = icmp eq i8 %34, 0
%36 = select i1 %35, i8 48, i8 %34
%37 = xor i1 %35, true
%38 = zext i1 %37 to i64
%39 = getelementptr i8, i8* %30, i64 %38
%40 = getelementptr inbounds i8, i8* %31, i64 1
store i8 %36, i8* %31
%41 = icmp ugt i32 %32, 2
br i1 %41, label %29, label %42
42: ; preds = %29, %21
%43 = phi i8* [ %25, %21 ], [ %40, %29 ]
%44 = getelementptr inbounds i8, i8* %43, i64 1
store i8 101, i8* %43
%45 = fcmp une float %7, 0.000000e+00
%46 = load i32, i32* %6
br i1 %45, label %47, label %49
47: ; preds = %42
%48 = add nsw i32 %46, -1
store i32 %48, i32* %6
br label %49
49: ; preds = %42, %47
%50 = phi i32 [ %48, %47 ], [ %46, %42 ]
%51 = icmp slt i32 %50, 0
br i1 %51, label %52, label %55
52: ; preds = %49
store i8 45, i8* %44
%53 = load i32, i32* %6
%54 = sub nsw i32 0, %53
store i32 %54, i32* %6
br label %57
55: ; preds = %49
store i8 43, i8* %44
%56 = load i32, i32* %6
br label %57
57: ; preds = %55, %52
%58 = phi i32 [ %56, %55 ], [ %54, %52 ]
%59 = getelementptr inbounds i8, i8* %43, i64 2
%60 = icmp sgt i32 %58, 99
br i1 %60, label %61, label %68
61: ; preds = %57
%62 = udiv i32 %58, 100
%63 = trunc i32 %62 to i8
%64 = add i8 %63, 48
%65 = getelementptr inbounds i8, i8* %43, i64 3
store i8 %64, i8* %59
%66 = load i32, i32* %6
%67 = srem i32 %66, 100
store i32 %67, i32* %6
br label %68
68: ; preds = %61, %57
%69 = phi i32 [ %67, %61 ], [ %58, %57 ]
%70 = phi i8* [ %65, %61 ], [ %59, %57 ]
%71 = sdiv i32 %69, 10
%72 = trunc i32 %71 to i8
%73 = add i8 %72, 48
%74 = getelementptr inbounds i8, i8* %70, i64 1
store i8 %73, i8* %70
%75 = load i32, i32* %6
%76 = srem i32 %75, 10
%77 = trunc i32 %76 to i8
%78 = add nsw i8 %77, 48
%79 = getelementptr inbounds i8, i8* %70, i64 2
store i8 %78, i8* %74
ret i8* %79
}