void _vsofont_read_float(unsigned char *m, float *r, int *n) {
  float v, a;
  int i, s;
  i = *n;
  v = 0.0f;
  while (m[i] == ' ' || m[i] == 0xA || m[i] == 0xD)
    i++;
  if (m[i] == '-') {
    i++;
    s = -1;
  } else
    s = 1;
  while (m[i] != 0) {
    if (m[i] < '0' || m[i] > '9')
      break;
    v = v * 10 + m[i++] - '0';
  }
  if (m[i] == '.') {
    i++;
    a = 0.1f;
    while (m[i] != 0) {
      if (m[i] < '0' || m[i] > '9')
        break;
      v += a * (m[i++] - '0');
      a /= 10.0f;
    }
  }
  if (s == 1)
    *r = v;
  else
    *r = -v;
  *n = i;
}


x86 assembly (clang, -O0):
<_vsofont_read_float>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    (%rax),%eax
mov    %eax,-0x24(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0x20,%ecx
mov    %al,-0x29(%rbp)
je     116a <_vsofont_read_float+0x6a>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%ecx
mov    $0x1,%al
cmp    $0xa,%ecx
mov    %al,-0x29(%rbp)
je     116a <_vsofont_read_float+0x6a>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0xd,%eax
sete   %al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
test   $0x1,%al
jne    117a <_vsofont_read_float+0x7a>
jmp    1188 <_vsofont_read_float+0x88>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1121 <_vsofont_read_float+0x21>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x2d,%eax
jne    11b2 <_vsofont_read_float+0xb2>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
movl   $0xffffffff,-0x28(%rbp)
jmp    11b9 <_vsofont_read_float+0xb9>
movl   $0x1,-0x28(%rbp)
jmp    11be <_vsofont_read_float+0xbe>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1247 <_vsofont_read_float+0x147>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     11fd <_vsofont_read_float+0xfd>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    1202 <_vsofont_read_float+0x102>
jmp    1247 <_vsofont_read_float+0x147>
movss  -0x1c(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x24(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
cvtsi2ss %eax,%xmm1
movss  0xddb(%rip),%xmm2
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  0xdc7(%rip),%xmm1
subss  %xmm1,%xmm0
movss  %xmm0,-0x1c(%rbp)
jmp    11be <_vsofont_read_float+0xbe>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
jne    130a <_vsofont_read_float+0x20a>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
movss  0xd9b(%rip),%xmm0
movss  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1305 <_vsofont_read_float+0x205>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jl     12b1 <_vsofont_read_float+0x1b1>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movzbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jle    12b6 <_vsofont_read_float+0x1b6>
jmp    1305 <_vsofont_read_float+0x205>
movss  -0x20(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x24(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x24(%rbp)
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
sub    $0x30,%eax
cvtsi2ss %eax,%xmm2
movss  -0x1c(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x20(%rbp),%xmm0
movss  0xd0d(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x20(%rbp)
jmp    1272 <_vsofont_read_float+0x172>
jmp    130a <_vsofont_read_float+0x20a>
cmpl   $0x1,-0x28(%rbp)
jne    1326 <_vsofont_read_float+0x226>
movss  -0x1c(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1340 <_vsofont_read_float+0x240>
movss  -0x1c(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x24(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<_vsofont_read_float>:
movslq (%rdx),%r10
lea    (%rdi,%r10,1),%rcx
mov    %r10,%r11
shl    $0x20,%r11
movabs $0x100002400,%r8
movabs $0x100000000,%r9
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl (%rcx),%eax
cmp    $0x20,%rax
ja     114c <_vsofont_read_float+0x4c>
bt     %rax,%r8
jae    114c <_vsofont_read_float+0x4c>
add    %r9,%r11
add    $0x1,%r10d
add    $0x1,%rcx
jmp    1130 <_vsofont_read_float+0x30>
xor    %r8d,%r8d
cmp    $0x2d,%al
sete   %r8b
add    %r8d,%r10d
movslq %r10d,%rcx
mov    (%rdi,%rcx,1),%r9b
lea    -0x3a(%r9),%ecx
xorps  %xmm0,%xmm0
cmp    $0xf6,%cl
jb     11b9 <_vsofont_read_float+0xb9>
xor    %r10d,%r10d
cmp    $0x2d,%al
sete   %r10b
sar    $0x20,%r11
add    %r11,%r10
xorps  %xmm0,%xmm0
movss  0xe7a(%rip),%xmm1
movss  0xe76(%rip),%xmm2
xchg   %ax,%ax
movzbl %r9b,%eax
xorps  %xmm3,%xmm3
cvtsi2ss %eax,%xmm3
mulss  %xmm1,%xmm0
addss  %xmm3,%xmm0
addss  %xmm2,%xmm0
movzbl 0x1(%rdi,%r10,1),%r9d
add    $0x1,%r10
lea    -0x3a(%r9),%eax
cmp    $0xf5,%al
ja     1190 <_vsofont_read_float+0x90>
cmp    $0x2e,%r9b
jne    121c <_vsofont_read_float+0x11c>
movslq %r10d,%r10
mov    0x1(%rdi,%r10,1),%al
add    $0x1,%r10
lea    -0x3a(%rax),%ecx
cmp    $0xf6,%cl
jb     121c <_vsofont_read_float+0x11c>
add    %r10,%rdi
add    $0x1,%rdi
movss  0xe26(%rip),%xmm1
movss  0xe16(%rip),%xmm2
nopw   0x0(%rax,%rax,1)
movzbl %al,%eax
add    $0xffffffd0,%eax
xorps  %xmm3,%xmm3
cvtsi2ss %eax,%xmm3
mulss  %xmm1,%xmm3
addss  %xmm3,%xmm0
divss  %xmm2,%xmm1
movzbl (%rdi),%eax
lea    -0x3a(%rax),%ecx
add    $0x1,%r10d
add    $0x1,%rdi
cmp    $0xf5,%cl
ja     11f0 <_vsofont_read_float+0xf0>
test   %r8d,%r8d
je     1228 <_vsofont_read_float+0x128>
xorps  0xde8(%rip),%xmm0
movss  %xmm0,(%rsi)
mov    %r10d,(%rdx)
ret

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

LLVM IR (-O2):
define void @_vsofont_read_float(i8* nocapture %0, float* nocapture writeonly %1, i32* nocapture %2) {
%4 = load i32, i32* %2
%5 = sext i32 %4 to i64
br label %6
6: ; preds = %10, %3
%7 = phi i64 [ %11, %10 ], [ %5, %3 ]
%8 = getelementptr inbounds i8, i8* %0, i64 %7
%9 = load i8, i8* %8
switch i8 %9, label %12 [
i8 32, label %10
i8 10, label %10
i8 13, label %10
]
10: ; preds = %6, %6, %6
%11 = add i64 %7, 1
br label %6
12: ; preds = %6
%13 = trunc i64 %7 to i32
%14 = icmp eq i8 %9, 45
%15 = zext i1 %14 to i32
%16 = add nsw i32 %13, %15
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds i8, i8* %0, i64 %17
%19 = load i8, i8* %18
%20 = add i8 %19, -58
%21 = icmp ult i8 %20, -10
br i1 %21, label %41, label %22
22: ; preds = %12
%23 = shl i64 %7, 32
%24 = ashr exact i64 %23, 32
%25 = zext i1 %14 to i64
%26 = add nsw i64 %24, %25
br label %27
27: ; preds = %22, %27
%28 = phi i64 [ %26, %22 ], [ %31, %27 ]
%29 = phi i8 [ %19, %22 ], [ %36, %27 ]
%30 = phi float [ 0.000000e+00, %22 ], [ %34, %27 ]
%31 = add i64 %28, 1
%32 = uitofp i8 %29 to float
%33 = tail call float @llvm.fmuladd.f32(float %30, float 1.000000e+01, float %32)
%34 = fadd float %33, -4.800000e+01
%35 = getelementptr inbounds i8, i8* %0, i64 %31
%36 = load i8, i8* %35
%37 = add i8 %36, -58
%38 = icmp ult i8 %37, -10
br i1 %38, label %39, label %27
39: ; preds = %27
%40 = trunc i64 %31 to i32
br label %41
41: ; preds = %39, %12
%42 = phi float [ 0.000000e+00, %12 ], [ %34, %39 ]
%43 = phi i32 [ %16, %12 ], [ %40, %39 ]
%44 = phi i8 [ %19, %12 ], [ %36, %39 ]
%45 = icmp eq i8 %44, 46
br i1 %45, label %46, label %70
46: ; preds = %41
%47 = add nsw i32 %43, 1
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds i8, i8* %0, i64 %48
%50 = load i8, i8* %49
%51 = add i8 %50, -58
%52 = icmp ult i8 %51, -10
br i1 %52, label %70, label %53
53: ; preds = %46, %53
%54 = phi i64 [ %63, %53 ], [ %48, %46 ]
%55 = phi i8 [ %65, %53 ], [ %50, %46 ]
%56 = phi float [ %62, %53 ], [ 0x3FB99999A0000000, %46 ]
%57 = phi float [ %61, %53 ], [ %42, %46 ]
%58 = zext i8 %55 to i32
%59 = add nsw i32 %58, -48
%60 = sitofp i32 %59 to float
%61 = tail call float @llvm.fmuladd.f32(float %56, float %60, float %57)
%62 = fdiv float %56, 1.000000e+01
%63 = add i64 %54, 1
%64 = getelementptr inbounds i8, i8* %0, i64 %63
%65 = load i8, i8* %64
%66 = add i8 %65, -58
%67 = icmp ult i8 %66, -10
br i1 %67, label %68, label %53
68: ; preds = %53
%69 = trunc i64 %63 to i32
br label %70
70: ; preds = %68, %46, %41
%71 = phi float [ %42, %41 ], [ %42, %46 ], [ %61, %68 ]
%72 = phi i32 [ %43, %41 ], [ %47, %46 ], [ %69, %68 ]
%73 = fneg float %71
%74 = select i1 %14, float %73, float %71
store float %74, float* %1
store i32 %72, i32* %2
ret void
}