#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 */

/* Variables and functions */
int /*<<< orphan*/ atasm_error(char *, int);
int /*<<< orphan*/ isdigit(unsigned char);
int /*<<< orphan*/ put_word(int, int);
int /*<<< orphan*/ snprintf(char *, int, char *, ...);
int /*<<< orphan*/ sscanf(char *, char *, int *, int *, int *);
int /*<<< orphan*/ strcat(char *, char *);
int /*<<< orphan*/ strchr(char *, char);
int /*<<< orphan*/ strcpy(char *, char *);
int /*<<< orphan*/ strncat(char *, char *, int);
int put_float(char *f) {
  char tmp[64], buf[64], *look, *walk;
  int n[3], i;
  int neg, d = -1;
  i = neg = 0;
  look = f;
  walk = buf;
  while (((*look == '+') || (*look == '-')) && (*look)) {
    if (*look == '-')
      neg ^= 1;
    look++;
  }
  if (!(*look))
    atasm_error("Malformed floating point constant.", 1);
  while ((*look == '0') && (*(look + 1) == '0') && (*look))
    look++;
  tmp[0] = 0;
  if (*look == '.')
    strcpy(tmp, "0");
  strcat(tmp, look);
  if (!strchr(tmp, '.'))
    strcat(tmp, ".");
  strcat(tmp, "00000000000000");
  look = tmp;
  while (*look) {
    if (*look == '.') {
      if (d != -1)
        atasm_error("Malformed floating point constant.", 1);
      d = i;
      look++;
    } else if (!isdigit((unsigned char)(*look)))
      atasm_error("Malformed floating point constant.", 1);
    else if (i < 16)
      *walk++ = *look++;
    else
      look++;
    i++;
  }
  *walk = 0;
  look = tmp;
  if (d & 1) {
    strcpy(tmp, "0");
    strcat(tmp, buf);
    d = d + 1;
  } else
    strcpy(tmp, buf);
  while ((*look == '0') && (*look)) {
    look++;
  }
  if (!(*look)) {
    snprintf(buf, 64, "0000 0000 0000");
  } else {
    look = tmp;
    while ((*look == '0') && (*(look + 1) == '0')) {
      look++;
      d = d - 1;
    }
    d = d / 2 - 1;
    if ((d > 64) || (d < -64))
      atasm_error("Floating point constant overflow.", 0);
    d = neg * 128 + 64 + d;
    d = d & 0xff;
    snprintf(buf, 64, "%.2x", d);
    strncat(buf, look, 2);
    strcat(buf, " ");
    look += 2;
    for (i = 0; i < 2; i++) {
      strncat(buf, look, 4);
      strcat(buf, " ");
      look += 4;
    }
  }
  sscanf(buf, "%x %x %x", &n[0], &n[1], &n[2]);
  put_word(n[0], 1);
  put_word(n[1], 1);
  put_word(n[2], 1);
  return 0;
}


x86 assembly (clang, -O0):
<put_float>:
push   %rbp
mov    %rsp,%rbp
sub    $0xc0,%rsp
mov    %rdi,-0x8(%rbp)
movl   $0xffffffff,-0xb8(%rbp)
ff ff ff
movl   $0x0,-0xb4(%rbp)
movl   $0x0,-0xb0(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x98(%rbp)
lea    -0x90(%rbp),%rax
mov    %rax,-0xa0(%rbp)
mov    -0x98(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
je     1204 <put_float+0x74>
mov    -0x98(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x2d,%ecx
mov    %al,-0xb9(%rbp)
jne    121a <put_float+0x8a>
mov    -0x98(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0xb9(%rbp)
mov    -0xb9(%rbp),%al
test   $0x1,%al
jne    122d <put_float+0x9d>
jmp    1266 <put_float+0xd6>
mov    -0x98(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    124f <put_float+0xbf>
mov    -0xb4(%rbp),%eax
xor    $0x1,%eax
mov    %eax,-0xb4(%rbp)
mov    -0x98(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x98(%rbp)
jmp    11d6 <put_float+0x46>
mov    -0x98(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1287 <put_float+0xf7>
lea    0xd83(%rip),%rdi
mov    $0x1,%esi
call   1030 <atasm_error@plt>
jmp    128c <put_float+0xfc>
mov    -0x98(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0xba(%rbp)
jne    12d9 <put_float+0x149>
mov    -0x98(%rbp),%rax
movsbl 0x1(%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0xba(%rbp)
jne    12d9 <put_float+0x149>
mov    -0x98(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0xba(%rbp)
mov    -0xba(%rbp),%al
test   $0x1,%al
jne    12ec <put_float+0x15c>
jmp    1303 <put_float+0x173>
mov    -0x98(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x98(%rbp)
jmp    128c <put_float+0xfc>
movb   $0x0,-0x50(%rbp)
mov    -0x98(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    132a <put_float+0x19a>
lea    -0x50(%rbp),%rdi
lea    0xd1a(%rip),%rsi
call   1050 <strcpy@plt>
lea    -0x50(%rbp),%rdi
mov    -0x98(%rbp),%rsi
call   10b0 <strcat@plt>
lea    -0x50(%rbp),%rdi
mov    $0x2e,%esi
call   1060 <strchr@plt>
cmp    $0x0,%eax
jne    1361 <put_float+0x1d1>
lea    -0x50(%rbp),%rdi
lea    0xcc5(%rip),%rsi
call   10b0 <strcat@plt>
lea    -0x50(%rbp),%rdi
lea    0xcb7(%rip),%rsi
call   10b0 <strcat@plt>
lea    -0x50(%rbp),%rax
mov    %rax,-0x98(%rbp)
mov    -0x98(%rbp),%rax
cmpb   $0x0,(%rax)
je     147e <put_float+0x2ee>
mov    -0x98(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2e,%eax
jne    13e0 <put_float+0x250>
cmpl   $0xffffffff,-0xb8(%rbp)
je     13bd <put_float+0x22d>
lea    0xc4d(%rip),%rdi
mov    $0x1,%esi
call   1030 <atasm_error@plt>
mov    -0xb0(%rbp),%eax
mov    %eax,-0xb8(%rbp)
mov    -0x98(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x98(%rbp)
jmp    146a <put_float+0x2da>
mov    -0x98(%rbp),%rax
movzbl (%rax),%edi
call   1040 <isdigit@plt>
cmp    $0x0,%eax
jne    140e <put_float+0x27e>
lea    0xc01(%rip),%rdi
mov    $0x1,%esi
call   1030 <atasm_error@plt>
jmp    1465 <put_float+0x2d5>
cmpl   $0x10,-0xb0(%rbp)
jge    144e <put_float+0x2be>
mov    -0x98(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x98(%rbp)
mov    (%rax),%cl
mov    -0xa0(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0xa0(%rbp)
mov    %cl,(%rax)
jmp    1460 <put_float+0x2d0>
mov    -0x98(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x98(%rbp)
jmp    1465 <put_float+0x2d5>
jmp    146a <put_float+0x2da>
mov    -0xb0(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xb0(%rbp)
jmp    137c <put_float+0x1ec>
mov    -0xa0(%rbp),%rax
movb   $0x0,(%rax)
lea    -0x50(%rbp),%rax
mov    %rax,-0x98(%rbp)
mov    -0xb8(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     14d9 <put_float+0x349>
lea    -0x50(%rbp),%rdi
lea    0xb8f(%rip),%rsi
call   1050 <strcpy@plt>
lea    -0x50(%rbp),%rdi
lea    -0x90(%rbp),%rsi
call   10b0 <strcat@plt>
mov    -0xb8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xb8(%rbp)
jmp    14e9 <put_float+0x359>
lea    -0x50(%rbp),%rdi
lea    -0x90(%rbp),%rsi
call   1050 <strcpy@plt>
jmp    14ee <put_float+0x35e>
mov    -0x98(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0xbb(%rbp)
jne    151f <put_float+0x38f>
mov    -0x98(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x0,%eax
setne  %al
mov    %al,-0xbb(%rbp)
mov    -0xbb(%rbp),%al
test   $0x1,%al
jne    1532 <put_float+0x3a2>
jmp    1549 <put_float+0x3b9>
mov    -0x98(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x98(%rbp)
jmp    14ee <put_float+0x35e>
mov    -0x98(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1578 <put_float+0x3e8>
lea    -0x90(%rbp),%rdi
mov    $0x40,%esi
lea    0xac6(%rip),%rdx
mov    $0x0,%al
call   1070 <snprintf@plt>
jmp    1720 <put_float+0x590>
lea    -0x50(%rbp),%rax
mov    %rax,-0x98(%rbp)
mov    -0x98(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x30,%ecx
mov    %al,-0xbc(%rbp)
jne    15b5 <put_float+0x425>
mov    -0x98(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x30,%eax
sete   %al
mov    %al,-0xbc(%rbp)
mov    -0xbc(%rbp),%al
test   $0x1,%al
jne    15c8 <put_float+0x438>
jmp    15ee <put_float+0x45e>
mov    -0x98(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x98(%rbp)
mov    -0xb8(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0xb8(%rbp)
jmp    1583 <put_float+0x3f3>
mov    -0xb8(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
sub    $0x1,%eax
mov    %eax,-0xb8(%rbp)
cmpl   $0x40,-0xb8(%rbp)
jg     161f <put_float+0x48f>
cmpl   $0xffffffc0,-0xb8(%rbp)
jge    162d <put_float+0x49d>
lea    0xa1b(%rip),%rdi
xor    %esi,%esi
call   1030 <atasm_error@plt>
mov    -0xb4(%rbp),%eax
shl    $0x7,%eax
add    $0x40,%eax
add    -0xb8(%rbp),%eax
mov    %eax,-0xb8(%rbp)
mov    -0xb8(%rbp),%eax
and    $0xff,%eax
mov    %eax,-0xb8(%rbp)
lea    -0x90(%rbp),%rdi
mov    -0xb8(%rbp),%ecx
mov    $0x40,%esi
lea    0x9f4(%rip),%rdx
mov    $0x0,%al
call   1070 <snprintf@plt>
lea    -0x90(%rbp),%rdi
mov    -0x98(%rbp),%rsi
mov    $0x2,%edx
call   1080 <strncat@plt>
lea    -0x90(%rbp),%rdi
lea    0x9cc(%rip),%rsi
call   10b0 <strcat@plt>
mov    -0x98(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x98(%rbp)
movl   $0x0,-0xb0(%rbp)
cmpl   $0x2,-0xb0(%rbp)
jge    171b <put_float+0x58b>
lea    -0x90(%rbp),%rdi
mov    -0x98(%rbp),%rsi
mov    $0x4,%edx
call   1080 <strncat@plt>
lea    -0x90(%rbp),%rdi
lea    0x978(%rip),%rsi
call   10b0 <strcat@plt>
mov    -0x98(%rbp),%rax
add    $0x4,%rax
mov    %rax,-0x98(%rbp)
mov    -0xb0(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xb0(%rbp)
jmp    16bd <put_float+0x52d>
jmp    1720 <put_float+0x590>
lea    -0x90(%rbp),%rdi
lea    -0xac(%rbp),%rdx
lea    -0xac(%rbp),%rcx
add    $0x4,%rcx
lea    -0xac(%rbp),%r8
add    $0x8,%r8
lea    0x91f(%rip),%rsi
call   1090 <sscanf@plt>
mov    -0xac(%rbp),%edi
mov    $0x1,%esi
call   10a0 <put_word@plt>
mov    -0xa8(%rbp),%edi
mov    $0x1,%esi
call   10a0 <put_word@plt>
mov    -0xa4(%rbp),%edi
mov    $0x1,%esi
call   10a0 <put_word@plt>
xor    %eax,%eax
add    $0xc0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<put_float>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x98,%rsp
mov    %rdi,%rbx
xor    %r15d,%r15d
jmp    11b4 <put_float+0x24>
nopl   0x0(%rax)
add    $0x1,%rbx
movzbl (%rbx),%eax
cmp    $0x2b,%al
je     11b0 <put_float+0x20>
cmp    $0x2d,%al
jne    11c5 <put_float+0x35>
xor    $0x1,%r15d
jmp    11b0 <put_float+0x20>
test   %al,%al
jne    11e0 <put_float+0x50>
lea    0xe30(%rip),%rdi
mov    $0x1,%esi
call   1030 <atasm_error@plt>
mov    (%rbx),%al
nopl   0x0(%rax)
mov    %rbx,%r14
cmp    $0x30,%al
jne    11fb <put_float+0x6b>
lea    0x1(%r14),%rbx
mov    $0x30,%al
cmpb   $0x30,0x1(%r14)
je     11e0 <put_float+0x50>
movb   $0x0,0x10(%rsp)
jmp    1215 <put_float+0x85>
movb   $0x0,0x10(%rsp)
cmp    $0x2e,%al
jne    1215 <put_float+0x85>
lea    0xe34(%rip),%rsi
lea    0x10(%rsp),%rdi
call   1050 <strcpy@plt>
lea    0x10(%rsp),%rbx
mov    %rbx,%rdi
mov    %r14,%rsi
call   10b0 <strcat@plt>
mov    %rbx,%rdi
mov    $0x2e,%esi
call   1060 <strchr@plt>
test   %eax,%eax
jne    1247 <put_float+0xb7>
lea    0xde4(%rip),%rsi
lea    0x10(%rsp),%rdi
call   10b0 <strcat@plt>
lea    0x50(%rsp),%r12
lea    0xdd0(%rip),%rsi
mov    %rbx,%rdi
call   10b0 <strcat@plt>
mov    $0xffffffff,%r13d
xor    %ebp,%ebp
lea    0xd96(%rip),%r14
jmp    127a <put_float+0xea>
nopl   0x0(%rax)
add    $0x1,%rbx
mov    %ebp,%r13d
add    $0x1,%ebp
movzbl (%rbx),%eax
cmp    $0x2e,%al
je     12b0 <put_float+0x120>
test   %al,%al
je     12d7 <put_float+0x147>
movzbl %al,%edi
call   1040 <isdigit@plt>
test   %eax,%eax
je     12c5 <put_float+0x135>
lea    0x1(%rbx),%rax
cmp    $0xf,%ebp
ja     12a5 <put_float+0x115>
movzbl (%rbx),%ecx
mov    %cl,(%r12)
add    $0x1,%r12
mov    %rax,%rbx
add    $0x1,%ebp
jmp    127a <put_float+0xea>
nopl   (%rax)
cmp    $0xffffffff,%r13d
je     1270 <put_float+0xe0>
mov    %r14,%rdi
mov    $0x1,%esi
call   1030 <atasm_error@plt>
jmp    1270 <put_float+0xe0>
mov    %r14,%rdi
mov    $0x1,%esi
call   1030 <atasm_error@plt>
add    $0x1,%ebp
jmp    127a <put_float+0xea>
movb   $0x0,(%r12)
test   $0x1,%r13b
jne    12f3 <put_float+0x163>
lea    0x10(%rsp),%rdi
lea    0x50(%rsp),%rsi
call   1050 <strcpy@plt>
jmp    1318 <put_float+0x188>
lea    0xd45(%rip),%rsi
lea    0x10(%rsp),%rbx
mov    %rbx,%rdi
call   1050 <strcpy@plt>
lea    0x50(%rsp),%rsi
mov    %rbx,%rdi
call   10b0 <strcat@plt>
add    $0x1,%r13d
lea    0x10(%rsp),%rax
nopl   (%rax)
movzbl (%rax),%ecx
cmp    $0x30,%cl
jne    132e <put_float+0x19e>
add    $0x1,%rax
jmp    1320 <put_float+0x190>
test   %cl,%cl
jne    134f <put_float+0x1bf>
lea    0xcf9(%rip),%rdx
lea    0x50(%rsp),%rdi
mov    $0x40,%esi
xor    %eax,%eax
call   1070 <snprintf@plt>
jmp    1424 <put_float+0x294>
cmpb   $0x30,0x10(%rsp)
jne    1370 <put_float+0x1e0>
add    $0x1,%r13d
lea    0xf(%rsp),%rbx
nop
add    $0xffffffff,%r13d
cmpb   $0x30,0x2(%rbx)
lea    0x1(%rbx),%rbx
je     1360 <put_float+0x1d0>
jmp    1375 <put_float+0x1e5>
lea    0x10(%rsp),%rbx
mov    %r13d,%ebp
shr    $0x1f,%ebp
add    %r13d,%ebp
sar    %ebp
add    $0xffffff7c,%r13d
cmp    $0xfffffefc,%r13d
ja     139e <put_float+0x20e>
lea    0xcaa(%rip),%rdi
xor    %esi,%esi
call   1030 <atasm_error@plt>
shl    $0x7,%r15d
lea    (%r15,%rbp,1),%eax
add    $0x3f,%eax
movzbl %al,%ecx
lea    0xcb0(%rip),%rdx
lea    0x50(%rsp),%r14
mov    %r14,%rdi
mov    $0x40,%esi
xor    %eax,%eax
call   1070 <snprintf@plt>
mov    %r14,%rdi
mov    %rbx,%rsi
mov    $0x2,%edx
call   1080 <strncat@plt>
lea    0xc8a(%rip),%r15
mov    %r14,%rdi
mov    %r15,%rsi
call   10b0 <strcat@plt>
lea    0x2(%rbx),%rsi
mov    %r14,%rdi
mov    $0x4,%edx
call   1080 <strncat@plt>
mov    %r14,%rdi
mov    %r15,%rsi
call   10b0 <strcat@plt>
add    $0x6,%rbx
mov    %r14,%rdi
mov    %rbx,%rsi
mov    $0x4,%edx
call   1080 <strncat@plt>
mov    %r14,%rdi
mov    %r15,%rsi
call   10b0 <strcat@plt>
lea    0x8(%rsp),%rcx
lea    0xc(%rsp),%r8
lea    0xc35(%rip),%rsi
lea    0x50(%rsp),%rdi
lea    0x4(%rsp),%rdx
call   1090 <sscanf@plt>
mov    0x4(%rsp),%edi
mov    $0x1,%esi
call   10a0 <put_word@plt>
mov    0x8(%rsp),%edi
mov    $0x1,%esi
call   10a0 <put_word@plt>
mov    0xc(%rsp),%edi
mov    $0x1,%esi
call   10a0 <put_word@plt>
xor    %eax,%eax
add    $0x98,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [35 x i8] c"Malformed floating point constant.\00"
@.str.1 = [2 x i8] c"0\00"
@.str.2 = [2 x i8] c".\00"
@.str.3 = [15 x i8] c"00000000000000\00"
@.str.4 = [15 x i8] c"0000 0000 0000\00"
@.str.5 = [34 x i8] c"Floating point constant overflow.\00"
@.str.6 = [5 x i8] c"%.2x\00"
@.str.7 = [2 x i8] c" \00"
@.str.8 = [9 x i8] c"%x %x %x\00"
define i32 @put_float(i8* %0) {
%2 = alloca i8*
%3 = alloca [64 x i8]
%4 = alloca [64 x i8]
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca [3 x i32]
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
store i8* %0, i8** %2
store i32 -1, i32* %10
store i32 0, i32* %9
store i32 0, i32* %8
%11 = load i8*, i8** %2
store i8* %11, i8** %5
%12 = getelementptr inbounds [64 x i8], [64 x i8]* %4, i64 0, i64 0
store i8* %12, i8** %6
br label %13
13: ; preds = %38, %1
%14 = load i8*, i8** %5
%15 = load i8, i8* %14
%16 = sext i8 %15 to i32
%17 = icmp eq i32 %16, 43
br i1 %17, label %23, label %18
18: ; preds = %13
%19 = load i8*, i8** %5
%20 = load i8, i8* %19
%21 = sext i8 %20 to i32
%22 = icmp eq i32 %21, 45
br i1 %22, label %23, label %28
23: ; preds = %18, %13
%24 = load i8*, i8** %5
%25 = load i8, i8* %24
%26 = sext i8 %25 to i32
%27 = icmp ne i32 %26, 0
br label %28
28: ; preds = %23, %18
%29 = phi i1 [ false, %18 ], [ %27, %23 ]
br i1 %29, label %30, label %41
30: ; preds = %28
%31 = load i8*, i8** %5
%32 = load i8, i8* %31
%33 = sext i8 %32 to i32
%34 = icmp eq i32 %33, 45
br i1 %34, label %35, label %38
35: ; preds = %30
%36 = load i32, i32* %9
%37 = xor i32 %36, 1
store i32 %37, i32* %9
br label %38
38: ; preds = %35, %30
%39 = load i8*, i8** %5
%40 = getelementptr inbounds i8, i8* %39, i32 1
store i8* %40, i8** %5
br label %13
41: ; preds = %28
%42 = load i8*, i8** %5
%43 = load i8, i8* %42
%44 = icmp ne i8 %43, 0
br i1 %44, label %47, label %45
45: ; preds = %41
%46 = call i32 @atasm_error(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str, i64 0, i64 0), i32 1)
br label %47
47: ; preds = %45, %41
br label %48
48: ; preds = %66, %47
%49 = load i8*, i8** %5
%50 = load i8, i8* %49
%51 = sext i8 %50 to i32
%52 = icmp eq i32 %51, 48
br i1 %52, label %53, label %64
53: ; preds = %48
%54 = load i8*, i8** %5
%55 = getelementptr inbounds i8, i8* %54, i64 1
%56 = load i8, i8* %55
%57 = sext i8 %56 to i32
%58 = icmp eq i32 %57, 48
br i1 %58, label %59, label %64
59: ; preds = %53
%60 = load i8*, i8** %5
%61 = load i8, i8* %60
%62 = sext i8 %61 to i32
%63 = icmp ne i32 %62, 0
br label %64
64: ; preds = %59, %53, %48
%65 = phi i1 [ false, %53 ], [ false, %48 ], [ %63, %59 ]
br i1 %65, label %66, label %69
66: ; preds = %64
%67 = load i8*, i8** %5
%68 = getelementptr inbounds i8, i8* %67, i32 1
store i8* %68, i8** %5
br label %48
69: ; preds = %64
%70 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
store i8 0, i8* %70
%71 = load i8*, i8** %5
%72 = load i8, i8* %71
%73 = sext i8 %72 to i32
%74 = icmp eq i32 %73, 46
br i1 %74, label %75, label %78
75: ; preds = %69
%76 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
%77 = call i32 @strcpy(i8* %76, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
br label %78
78: ; preds = %75, %69
%79 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
%80 = load i8*, i8** %5
%81 = call i32 @strcat(i8* %79, i8* %80)
%82 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
%83 = call i32 @strchr(i8* %82, i8 signext 46)
%84 = icmp ne i32 %83, 0
br i1 %84, label %88, label %85
85: ; preds = %78
%86 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
%87 = call i32 @strcat(i8* %86, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i64 0, i64 0))
br label %88
88: ; preds = %85, %78
%89 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
%90 = call i32 @strcat(i8* %89, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i64 0, i64 0))
%91 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
store i8* %91, i8** %5
br label %92
92: ; preds = %131, %88
%93 = load i8*, i8** %5
%94 = load i8, i8* %93
%95 = icmp ne i8 %94, 0
br i1 %95, label %96, label %134
96: ; preds = %92
%97 = load i8*, i8** %5
%98 = load i8, i8* %97
%99 = sext i8 %98 to i32
%100 = icmp eq i32 %99, 46
br i1 %100, label %101, label %110
101: ; preds = %96
%102 = load i32, i32* %10
%103 = icmp ne i32 %102, -1
br i1 %103, label %104, label %106
104: ; preds = %101
%105 = call i32 @atasm_error(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str, i64 0, i64 0), i32 1)
br label %106
106: ; preds = %104, %101
%107 = load i32, i32* %8
store i32 %107, i32* %10
%108 = load i8*, i8** %5
%109 = getelementptr inbounds i8, i8* %108, i32 1
store i8* %109, i8** %5
br label %131
110: ; preds = %96
%111 = load i8*, i8** %5
%112 = load i8, i8* %111
%113 = call i32 @isdigit(i8 zeroext %112)
%114 = icmp ne i32 %113, 0
br i1 %114, label %117, label %115
115: ; preds = %110
%116 = call i32 @atasm_error(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str, i64 0, i64 0), i32 1)
br label %130
117: ; preds = %110
%118 = load i32, i32* %8
%119 = icmp slt i32 %118, 16
br i1 %119, label %120, label %126
120: ; preds = %117
%121 = load i8*, i8** %5
%122 = getelementptr inbounds i8, i8* %121, i32 1
store i8* %122, i8** %5
%123 = load i8, i8* %121
%124 = load i8*, i8** %6
%125 = getelementptr inbounds i8, i8* %124, i32 1
store i8* %125, i8** %6
store i8 %123, i8* %124
br label %129
126: ; preds = %117
%127 = load i8*, i8** %5
%128 = getelementptr inbounds i8, i8* %127, i32 1
store i8* %128, i8** %5
br label %129
129: ; preds = %126, %120
br label %130
130: ; preds = %129, %115
br label %131
131: ; preds = %130, %106
%132 = load i32, i32* %8
%133 = add nsw i32 %132, 1
store i32 %133, i32* %8
br label %92
134: ; preds = %92
%135 = load i8*, i8** %6
store i8 0, i8* %135
%136 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
store i8* %136, i8** %5
%137 = load i32, i32* %10
%138 = and i32 %137, 1
%139 = icmp ne i32 %138, 0
br i1 %139, label %140, label %148
140: ; preds = %134
%141 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
%142 = call i32 @strcpy(i8* %141, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%143 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
%144 = getelementptr inbounds [64 x i8], [64 x i8]* %4, i64 0, i64 0
%145 = call i32 @strcat(i8* %143, i8* %144)
%146 = load i32, i32* %10
%147 = add nsw i32 %146, 1
store i32 %147, i32* %10
br label %152
148: ; preds = %134
%149 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
%150 = getelementptr inbounds [64 x i8], [64 x i8]* %4, i64 0, i64 0
%151 = call i32 @strcpy(i8* %149, i8* %150)
br label %152
152: ; preds = %148, %140
br label %153
153: ; preds = %165, %152
%154 = load i8*, i8** %5
%155 = load i8, i8* %154
%156 = sext i8 %155 to i32
%157 = icmp eq i32 %156, 48
br i1 %157, label %158, label %163
158: ; preds = %153
%159 = load i8*, i8** %5
%160 = load i8, i8* %159
%161 = sext i8 %160 to i32
%162 = icmp ne i32 %161, 0
br label %163
163: ; preds = %158, %153
%164 = phi i1 [ false, %153 ], [ %162, %158 ]
br i1 %164, label %165, label %168
165: ; preds = %163
%166 = load i8*, i8** %5
%167 = getelementptr inbounds i8, i8* %166, i32 1
store i8* %167, i8** %5
br label %153
168: ; preds = %163
%169 = load i8*, i8** %5
%170 = load i8, i8* %169
%171 = icmp ne i8 %170, 0
br i1 %171, label %175, label %172
172: ; preds = %168
%173 = getelementptr inbounds [64 x i8], [64 x i8]* %4, i64 0, i64 0
%174 = call i32 (i8*, i32, i8*, ...) @snprintf(i8* %173, i32 64, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.4, i64 0, i64 0))
br label %239
175: ; preds = %168
%176 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
store i8* %176, i8** %5
br label %177
177: ; preds = %190, %175
%178 = load i8*, i8** %5
%179 = load i8, i8* %178
%180 = sext i8 %179 to i32
%181 = icmp eq i32 %180, 48
br i1 %181, label %182, label %188
182: ; preds = %177
%183 = load i8*, i8** %5
%184 = getelementptr inbounds i8, i8* %183, i64 1
%185 = load i8, i8* %184
%186 = sext i8 %185 to i32
%187 = icmp eq i32 %186, 48
br label %188
188: ; preds = %182, %177
%189 = phi i1 [ false, %177 ], [ %187, %182 ]
br i1 %189, label %190, label %195
190: ; preds = %188
%191 = load i8*, i8** %5
%192 = getelementptr inbounds i8, i8* %191, i32 1
store i8* %192, i8** %5
%193 = load i32, i32* %10
%194 = sub nsw i32 %193, 1
store i32 %194, i32* %10
br label %177
195: ; preds = %188
%196 = load i32, i32* %10
%197 = sdiv i32 %196, 2
%198 = sub nsw i32 %197, 1
store i32 %198, i32* %10
%199 = load i32, i32* %10
%200 = icmp sgt i32 %199, 64
br i1 %200, label %204, label %201
201: ; preds = %195
%202 = load i32, i32* %10
%203 = icmp slt i32 %202, -64
br i1 %203, label %204, label %206
204: ; preds = %201, %195
%205 = call i32 @atasm_error(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.5, i64 0, i64 0), i32 0)
br label %206
206: ; preds = %204, %201
%207 = load i32, i32* %9
%208 = mul nsw i32 %207, 128
%209 = add nsw i32 %208, 64
%210 = load i32, i32* %10
%211 = add nsw i32 %209, %210
store i32 %211, i32* %10
%212 = load i32, i32* %10
%213 = and i32 %212, 255
store i32 %213, i32* %10
%214 = getelementptr inbounds [64 x i8], [64 x i8]* %4, i64 0, i64 0
%215 = load i32, i32* %10
%216 = call i32 (i8*, i32, i8*, ...) @snprintf(i8* %214, i32 64, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.6, i64 0, i64 0), i32 %215)
%217 = getelementptr inbounds [64 x i8], [64 x i8]* %4, i64 0, i64 0
%218 = load i8*, i8** %5
%219 = call i32 @strncat(i8* %217, i8* %218, i32 2)
%220 = getelementptr inbounds [64 x i8], [64 x i8]* %4, i64 0, i64 0
%221 = call i32 @strcat(i8* %220, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%222 = load i8*, i8** %5
%223 = getelementptr inbounds i8, i8* %222, i64 2
store i8* %223, i8** %5
store i32 0, i32* %8
br label %224
224: ; preds = %235, %206
%225 = load i32, i32* %8
%226 = icmp slt i32 %225, 2
br i1 %226, label %227, label %238
227: ; preds = %224
%228 = getelementptr inbounds [64 x i8], [64 x i8]* %4, i64 0, i64 0
%229 = load i8*, i8** %5
%230 = call i32 @strncat(i8* %228, i8* %229, i32 4)
%231 = getelementptr inbounds [64 x i8], [64 x i8]* %4, i64 0, i64 0
%232 = call i32 @strcat(i8* %231, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%233 = load i8*, i8** %5
%234 = getelementptr inbounds i8, i8* %233, i64 4
store i8* %234, i8** %5
br label %235
235: ; preds = %227
%236 = load i32, i32* %8
%237 = add nsw i32 %236, 1
store i32 %237, i32* %8
br label %224
238: ; preds = %224
br label %239
239: ; preds = %238, %172
%240 = getelementptr inbounds [64 x i8], [64 x i8]* %4, i64 0, i64 0
%241 = getelementptr inbounds [3 x i32], [3 x i32]* %7, i64 0, i64 0
%242 = getelementptr inbounds [3 x i32], [3 x i32]* %7, i64 0, i64 1
%243 = getelementptr inbounds [3 x i32], [3 x i32]* %7, i64 0, i64 2
%244 = call i32 @sscanf(i8* %240, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.8, i64 0, i64 0), i32* %241, i32* %242, i32* %243)
%245 = getelementptr inbounds [3 x i32], [3 x i32]* %7, i64 0, i64 0
%246 = load i32, i32* %245
%247 = call i32 @put_word(i32 %246, i32 1)
%248 = getelementptr inbounds [3 x i32], [3 x i32]* %7, i64 0, i64 1
%249 = load i32, i32* %248
%250 = call i32 @put_word(i32 %249, i32 1)
%251 = getelementptr inbounds [3 x i32], [3 x i32]* %7, i64 0, i64 2
%252 = load i32, i32* %251
%253 = call i32 @put_word(i32 %252, i32 1)
ret i32 0
}

LLVM IR (-O2):
@.str = [35 x i8] c"Malformed floating point constant.\00"
@.str.1 = [2 x i8] c"0\00"
@.str.2 = [2 x i8] c".\00"
@.str.3 = [15 x i8] c"00000000000000\00"
@.str.4 = [15 x i8] c"0000 0000 0000\00"
@.str.5 = [34 x i8] c"Floating point constant overflow.\00"
@.str.6 = [5 x i8] c"%.2x\00"
@.str.7 = [2 x i8] c" \00"
@.str.8 = [9 x i8] c"%x %x %x\00"
define i32 @put_float(i8* %0) {
%2 = alloca [64 x i8]
%3 = alloca [64 x i8]
%4 = alloca [3 x i32]
%5 = getelementptr inbounds [64 x i8], [64 x i8]* %2, i64 0, i64 0
%6 = getelementptr inbounds [64 x i8], [64 x i8]* %3, i64 0, i64 0
%7 = bitcast [3 x i32]* %4 to i8*
br label %8
8: ; preds = %14, %1
%9 = phi i8* [ %0, %1 ], [ %16, %14 ]
%10 = phi i32 [ 0, %1 ], [ %15, %14 ]
%11 = load i8, i8* %9
switch i8 %11, label %20 [
i8 45, label %12
i8 43, label %14
i8 0, label %17
]
12: ; preds = %8
%13 = xor i32 %10, 1
br label %14
14: ; preds = %8, %12
%15 = phi i32 [ %13, %12 ], [ %10, %8 ]
%16 = getelementptr inbounds i8, i8* %9, i64 1
br label %8
17: ; preds = %8
%18 = tail call i32 @atasm_error(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str, i64 0, i64 0), i32 1)
%19 = load i8, i8* %9
br label %20
20: ; preds = %8, %17
%21 = phi i8 [ %19, %17 ], [ %11, %8 ]
br label %22
22: ; preds = %20, %26
%23 = phi i8 [ 48, %26 ], [ %21, %20 ]
%24 = phi i8* [ %27, %26 ], [ %9, %20 ]
%25 = icmp eq i8 %23, 48
br i1 %25, label %26, label %31
26: ; preds = %22
%27 = getelementptr inbounds i8, i8* %24, i64 1
%28 = load i8, i8* %27
%29 = icmp eq i8 %28, 48
br i1 %29, label %22, label %30
30: ; preds = %26
store i8 0, i8* %5
br label %35
31: ; preds = %22
store i8 0, i8* %5
%32 = icmp eq i8 %23, 46
br i1 %32, label %33, label %35
33: ; preds = %31
%34 = call i32 @strcpy(i8* %5, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
br label %35
35: ; preds = %30, %33, %31
%36 = call i32 @strcat(i8* %5, i8* %24)
%37 = call i32 @strchr(i8* %5, i8 signext 46)
%38 = icmp eq i32 %37, 0
br i1 %38, label %39, label %41
39: ; preds = %35
%40 = call i32 @strcat(i8* %5, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.2, i64 0, i64 0))
br label %41
41: ; preds = %39, %35
%42 = call i32 @strcat(i8* %5, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i64 0, i64 0))
br label %43
43: ; preds = %66, %41
%44 = phi i8* [ %5, %41 ], [ %67, %66 ]
%45 = phi i8* [ %6, %41 ], [ %68, %66 ]
%46 = phi i32 [ 0, %41 ], [ %70, %66 ]
%47 = phi i32 [ -1, %41 ], [ %69, %66 ]
%48 = load i8, i8* %44
switch i8 %48, label %55 [
i8 0, label %71
i8 46, label %49
]
49: ; preds = %43
%50 = icmp eq i32 %47, -1
br i1 %50, label %53, label %51
51: ; preds = %49
%52 = call i32 @atasm_error(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str, i64 0, i64 0), i32 1)
br label %53
53: ; preds = %51, %49
%54 = getelementptr inbounds i8, i8* %44, i64 1
br label %66
55: ; preds = %43
%56 = call i32 @isdigit(i8 zeroext %48)
%57 = icmp eq i32 %56, 0
br i1 %57, label %58, label %60
58: ; preds = %55
%59 = call i32 @atasm_error(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str, i64 0, i64 0), i32 1)
br label %66
60: ; preds = %55
%61 = icmp ult i32 %46, 16
%62 = getelementptr inbounds i8, i8* %44, i64 1
br i1 %61, label %63, label %66
63: ; preds = %60
%64 = load i8, i8* %44
%65 = getelementptr inbounds i8, i8* %45, i64 1
store i8 %64, i8* %45
br label %66
66: ; preds = %60, %58, %63, %53
%67 = phi i8* [ %54, %53 ], [ %62, %63 ], [ %44, %58 ], [ %62, %60 ]
%68 = phi i8* [ %45, %53 ], [ %65, %63 ], [ %45, %58 ], [ %45, %60 ]
%69 = phi i32 [ %46, %53 ], [ %47, %63 ], [ %47, %58 ], [ %47, %60 ]
%70 = add nuw nsw i32 %46, 1
br label %43
71: ; preds = %43
store i8 0, i8* %45
%72 = and i32 %47, 1
%73 = icmp eq i32 %72, 0
br i1 %73, label %78, label %74
74: ; preds = %71
%75 = call i32 @strcpy(i8* %5, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
%76 = call i32 @strcat(i8* %5, i8* %6)
%77 = add nsw i32 %47, 1
br label %80
78: ; preds = %71
%79 = call i32 @strcpy(i8* %5, i8* %6)
br label %80
80: ; preds = %78, %74
%81 = phi i32 [ %77, %74 ], [ %47, %78 ]
br label %82
82: ; preds = %85, %80
%83 = phi i8* [ %5, %80 ], [ %86, %85 ]
%84 = load i8, i8* %83
switch i8 %84, label %89 [
i8 48, label %85
i8 0, label %87
]
85: ; preds = %82
%86 = getelementptr inbounds i8, i8* %83, i64 1
br label %82
87: ; preds = %82
%88 = call i32 (i8*, i32, i8*, ...) @snprintf(i8* %6, i32 64, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.4, i64 0, i64 0))
br label %121
89: ; preds = %82
%90 = load i8, i8* %5
%91 = icmp eq i8 %90, 48
br i1 %91, label %92, label %99
92: ; preds = %89, %92
%93 = phi i32 [ %98, %92 ], [ %81, %89 ]
%94 = phi i8* [ %95, %92 ], [ %5, %89 ]
%95 = getelementptr inbounds i8, i8* %94, i64 1
%96 = load i8, i8* %95
%97 = icmp eq i8 %96, 48
%98 = add nsw i32 %93, -1
br i1 %97, label %92, label %99
99: ; preds = %92, %89
%100 = phi i8* [ %5, %89 ], [ %94, %92 ]
%101 = phi i32 [ %81, %89 ], [ %93, %92 ]
%102 = sdiv i32 %101, 2
%103 = add i32 %101, -132
%104 = icmp ult i32 %103, -259
br i1 %104, label %105, label %107
105: ; preds = %99
%106 = call i32 @atasm_error(i8* getelementptr inbounds ([34 x i8], [34 x i8]* @.str.5, i64 0, i64 0), i32 0)
br label %107
107: ; preds = %99, %105
%108 = shl nsw i32 %10, 7
%109 = or i32 %108, 63
%110 = add i32 %109, %102
%111 = and i32 %110, 255
%112 = call i32 (i8*, i32, i8*, ...) @snprintf(i8* %6, i32 64, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.6, i64 0, i64 0), i32 %111)
%113 = call i32 @strncat(i8* %6, i8* %100, i32 2)
%114 = call i32 @strcat(i8* %6, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%115 = getelementptr inbounds i8, i8* %100, i64 2
%116 = call i32 @strncat(i8* %6, i8* %115, i32 4)
%117 = call i32 @strcat(i8* %6, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
%118 = getelementptr inbounds i8, i8* %100, i64 6
%119 = call i32 @strncat(i8* %6, i8* %118, i32 4)
%120 = call i32 @strcat(i8* %6, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.7, i64 0, i64 0))
br label %121
121: ; preds = %107, %87
%122 = getelementptr inbounds [3 x i32], [3 x i32]* %4, i64 0, i64 0
%123 = getelementptr inbounds [3 x i32], [3 x i32]* %4, i64 0, i64 1
%124 = getelementptr inbounds [3 x i32], [3 x i32]* %4, i64 0, i64 2
%125 = call i32 @sscanf(i8* %6, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.8, i64 0, i64 0), i32* %122, i32* %123, i32* %124)
%126 = load i32, i32* %122
%127 = call i32 @put_word(i32 %126, i32 1)
%128 = load i32, i32* %123
%129 = call i32 @put_word(i32 %128, i32 1)
%130 = load i32, i32* %124
%131 = call i32 @put_word(i32 %130, i32 1)
ret i32 0
}