#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 */
typedef int uint64_t;
typedef int uint32_t;

/* Variables and functions */
int asprintf(char **, char *, ...);
char *get_eta(uint64_t done, uint64_t total, uint32_t byterate) {
  char *str = NULL;
  if (byterate == 0) {
    if (asprintf(&str, "??? ETA") == -1)
      return NULL;
    return str;
  }
  uint64_t seconds = (total - done) / byterate;
  uint64_t minutes = seconds / 60;
  uint64_t hours = minutes / 60;
  uint64_t days = hours / 24;
  hours %= 24;
  minutes %= 60;
  seconds %= 60;
  if (days) {
    if (asprintf(&str, "%llud%lluh ETA", (long long unsigned int)days,
                 (long long unsigned int)hours) == -1)
      return NULL;
  } else if (hours) {
    if (asprintf(&str, "%lluh%llum ETA", (long long unsigned int)hours,
                 (long long unsigned int)minutes) == -1)
      return NULL;
  } else {
    if (asprintf(&str, "%llum%llus ETA", (long long unsigned int)minutes,
                 (long long unsigned int)seconds) == -1)
      return NULL;
  }
  return (str);
}


x86 assembly (clang, -O0):
<get_eta>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %edi,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movq   $0x0,-0x20(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    1168 <get_eta+0x58>
lea    -0x20(%rbp),%rdi
lea    0xec2(%rip),%rsi
mov    $0x0,%al
call   1030 <asprintf@plt>
cmp    $0xffffffff,%eax
jne    115b <get_eta+0x4b>
movq   $0x0,-0x8(%rbp)
jmp    1289 <get_eta+0x179>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1289 <get_eta+0x179>
mov    -0x10(%rbp),%eax
sub    -0xc(%rbp),%eax
cltd
idivl  -0x14(%rbp)
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    $0x3c,%ecx
cltd
idiv   %ecx
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    $0x3c,%ecx
cltd
idiv   %ecx
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    $0x18,%ecx
cltd
idiv   %ecx
mov    %eax,-0x30(%rbp)
mov    -0x2c(%rbp),%eax
mov    $0x18,%ecx
cltd
idiv   %ecx
mov    %edx,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
mov    $0x3c,%ecx
cltd
idiv   %ecx
mov    %edx,-0x28(%rbp)
mov    -0x24(%rbp),%eax
mov    $0x3c,%ecx
cltd
idiv   %ecx
mov    %edx,-0x24(%rbp)
cmpl   $0x0,-0x30(%rbp)
je     1208 <get_eta+0xf8>
movslq -0x30(%rbp),%rdx
movslq -0x2c(%rbp),%rcx
lea    -0x20(%rbp),%rdi
lea    0xe22(%rip),%rsi
mov    $0x0,%al
call   1030 <asprintf@plt>
cmp    $0xffffffff,%eax
jne    1203 <get_eta+0xf3>
movq   $0x0,-0x8(%rbp)
jmp    1289 <get_eta+0x179>
jmp    1281 <get_eta+0x171>
cmpl   $0x0,-0x2c(%rbp)
je     1247 <get_eta+0x137>
movslq -0x2c(%rbp),%rdx
movslq -0x28(%rbp),%rcx
lea    -0x20(%rbp),%rdi
lea    0xdf2(%rip),%rsi
mov    $0x0,%al
call   1030 <asprintf@plt>
cmp    $0xffffffff,%eax
jne    1242 <get_eta+0x132>
movq   $0x0,-0x8(%rbp)
jmp    1289 <get_eta+0x179>
jmp    127c <get_eta+0x16c>
movslq -0x28(%rbp),%rdx
movslq -0x24(%rbp),%rcx
lea    -0x20(%rbp),%rdi
lea    0xdcc(%rip),%rsi
mov    $0x0,%al
call   1030 <asprintf@plt>
cmp    $0xffffffff,%eax
jne    1277 <get_eta+0x167>
movq   $0x0,-0x8(%rbp)
jmp    1289 <get_eta+0x179>
jmp    127c <get_eta+0x16c>
jmp    1281 <get_eta+0x171>
mov    -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_eta>:
push   %rbx
sub    $0x10,%rsp
movq   $0x0,0x8(%rsp)
test   %edx,%edx
je     11bf <get_eta+0xaf>
mov    %edx,%ecx
sub    %edi,%esi
mov    %esi,%eax
cltd
idiv   %ecx
movslq %eax,%rdx
imul   $0xffffffff91a2b3c5,%rdx,%rcx
shr    $0x20,%rcx
add    %eax,%ecx
mov    %ecx,%esi
shr    $0x1f,%esi
sar    $0xb,%ecx
add    %esi,%ecx
movslq %ecx,%rcx
imul   $0x2aaaaaab,%rcx,%rsi
mov    %rsi,%rdi
shr    $0x3f,%rdi
shr    $0x22,%rsi
add    %edi,%esi
shl    $0x3,%esi
lea    (%rsi,%rsi,2),%esi
sub    %esi,%ecx
lea    0x1517f(%rax),%esi
cmp    $0x2a2ff,%esi
jae    11db <get_eta+0xcb>
imul   $0xffffffff88888889,%rdx,%rdx
shr    $0x20,%rdx
add    %eax,%edx
mov    %edx,%esi
shr    $0x1f,%esi
sar    $0x5,%edx
add    %esi,%edx
movslq %edx,%rsi
imul   $0xffffffff88888889,%rsi,%rdi
shr    $0x20,%rdi
add    %edx,%edi
mov    %edi,%ebx
shr    $0x1f,%ebx
sar    $0x5,%edi
add    %ebx,%edi
imul   $0x3c,%edi,%edi
sub    %edi,%esi
test   %ecx,%ecx
je     1201 <get_eta+0xf1>
movslq %ecx,%rdx
movslq %esi,%rcx
lea    0xe5a(%rip),%rsi
jmp    1213 <get_eta+0x103>
lea    0xe3a(%rip),%rsi
xor    %ebx,%ebx
lea    0x8(%rsp),%rdi
xor    %eax,%eax
call   1030 <asprintf@plt>
cmp    $0xffffffff,%eax
jne    1226 <get_eta+0x116>
jmp    122b <get_eta+0x11b>
imul   $0xffffffffc22e4507,%rdx,%rdx
shr    $0x20,%rdx
add    %eax,%edx
mov    %edx,%eax
shr    $0x1f,%eax
sar    $0x10,%edx
add    %eax,%edx
movslq %edx,%rdx
movslq %ecx,%rcx
lea    0xe09(%rip),%rsi
jmp    1213 <get_eta+0x103>
imul   $0x3c,%edx,%ecx
sub    %ecx,%eax
movslq %esi,%rdx
movslq %eax,%rcx
lea    0xe13(%rip),%rsi
xor    %ebx,%ebx
lea    0x8(%rsp),%rdi
xor    %eax,%eax
call   1030 <asprintf@plt>
cmp    $0xffffffff,%eax
je     122b <get_eta+0x11b>
mov    0x8(%rsp),%rbx
mov    %rbx,%rax
add    $0x10,%rsp
pop    %rbx
ret

LLVM IR (-O0):
@.str = [8 x i8] c"??? ETA\00"
@.str.1 = [15 x i8] c"%llud%lluh ETA\00"
@.str.2 = [15 x i8] c"%lluh%llum ETA\00"
@.str.3 = [15 x i8] c"%llum%llus ETA\00"
define i8* @get_eta(i32 %0, i32 %1, i32 %2) {
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i8*
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
store i32 %0, i32* %5
store i32 %1, i32* %6
store i32 %2, i32* %7
store i8* null, i8** %8
%13 = load i32, i32* %7
%14 = icmp eq i32 %13, 0
br i1 %14, label %15, label %21
15: ; preds = %3
%16 = call i32 (i8**, i8*, ...) @asprintf(i8** %8, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0))
%17 = icmp eq i32 %16, -1
br i1 %17, label %18, label %19
18: ; preds = %15
store i8* null, i8** %4
br label %74
19: ; preds = %15
%20 = load i8*, i8** %8
store i8* %20, i8** %4
br label %74
21: ; preds = %3
%22 = load i32, i32* %6
%23 = load i32, i32* %5
%24 = sub nsw i32 %22, %23
%25 = load i32, i32* %7
%26 = sdiv i32 %24, %25
store i32 %26, i32* %9
%27 = load i32, i32* %9
%28 = sdiv i32 %27, 60
store i32 %28, i32* %10
%29 = load i32, i32* %10
%30 = sdiv i32 %29, 60
store i32 %30, i32* %11
%31 = load i32, i32* %11
%32 = sdiv i32 %31, 24
store i32 %32, i32* %12
%33 = load i32, i32* %11
%34 = srem i32 %33, 24
store i32 %34, i32* %11
%35 = load i32, i32* %10
%36 = srem i32 %35, 60
store i32 %36, i32* %10
%37 = load i32, i32* %9
%38 = srem i32 %37, 60
store i32 %38, i32* %9
%39 = load i32, i32* %12
%40 = icmp ne i32 %39, 0
br i1 %40, label %41, label %50
41: ; preds = %21
%42 = load i32, i32* %12
%43 = sext i32 %42 to i64
%44 = load i32, i32* %11
%45 = sext i32 %44 to i64
%46 = call i32 (i8**, i8*, ...) @asprintf(i8** %8, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i64 0, i64 0), i64 %43, i64 %45)
%47 = icmp eq i32 %46, -1
br i1 %47, label %48, label %49
48: ; preds = %41
store i8* null, i8** %4
br label %74
49: ; preds = %41
br label %72
50: ; preds = %21
%51 = load i32, i32* %11
%52 = icmp ne i32 %51, 0
br i1 %52, label %53, label %62
53: ; preds = %50
%54 = load i32, i32* %11
%55 = sext i32 %54 to i64
%56 = load i32, i32* %10
%57 = sext i32 %56 to i64
%58 = call i32 (i8**, i8*, ...) @asprintf(i8** %8, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.2, i64 0, i64 0), i64 %55, i64 %57)
%59 = icmp eq i32 %58, -1
br i1 %59, label %60, label %61
60: ; preds = %53
store i8* null, i8** %4
br label %74
61: ; preds = %53
br label %71
62: ; preds = %50
%63 = load i32, i32* %10
%64 = sext i32 %63 to i64
%65 = load i32, i32* %9
%66 = sext i32 %65 to i64
%67 = call i32 (i8**, i8*, ...) @asprintf(i8** %8, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i64 0, i64 0), i64 %64, i64 %66)
%68 = icmp eq i32 %67, -1
br i1 %68, label %69, label %70
69: ; preds = %62
store i8* null, i8** %4
br label %74
70: ; preds = %62
br label %71
71: ; preds = %70, %61
br label %72
72: ; preds = %71, %49
%73 = load i8*, i8** %8
store i8* %73, i8** %4
br label %74
74: ; preds = %72, %69, %60, %48, %19, %18
%75 = load i8*, i8** %4
ret i8* %75
}

LLVM IR (-O2):
@.str = [8 x i8] c"??? ETA\00"
@.str.1 = [15 x i8] c"%llud%lluh ETA\00"
@.str.2 = [15 x i8] c"%lluh%llum ETA\00"
@.str.3 = [15 x i8] c"%llum%llus ETA\00"
define i8* @get_eta(i32 %0, i32 %1, i32 %2) {
%4 = alloca i8*
%5 = bitcast i8** %4 to i8*
store i8* null, i8** %4
%6 = icmp eq i32 %2, 0
br i1 %6, label %7, label %12
7: ; preds = %3
%8 = call i32 (i8**, i8*, ...) @asprintf(i8** %4, i8* getelementptr inbounds ([8 x i8], [8 x i8]* @.str, i64 0, i64 0))
%9 = icmp eq i32 %8, -1
%10 = load i8*, i8** %4
%11 = select i1 %9, i8* null, i8* %10
br label %42
12: ; preds = %3
%13 = sub nsw i32 %1, %0
%14 = sdiv i32 %13, %2
%15 = sdiv i32 %14, 60
%16 = sdiv i32 %14, 3600
%17 = srem i32 %16, 24
%18 = srem i32 %15, 60
%19 = srem i32 %14, 60
%20 = add i32 %14, 86399
%21 = icmp ult i32 %20, 172799
br i1 %21, label %28, label %22
22: ; preds = %12
%23 = sdiv i32 %14, 86400
%24 = sext i32 %23 to i64
%25 = sext i32 %17 to i64
%26 = call i32 (i8**, i8*, ...) @asprintf(i8** %4, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.1, i64 0, i64 0), i64 %24, i64 %25)
%27 = icmp eq i32 %26, -1
br i1 %27, label %42, label %40
28: ; preds = %12
%29 = icmp eq i32 %17, 0
br i1 %29, label %35, label %30
30: ; preds = %28
%31 = sext i32 %17 to i64
%32 = sext i32 %18 to i64
%33 = call i32 (i8**, i8*, ...) @asprintf(i8** %4, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.2, i64 0, i64 0), i64 %31, i64 %32)
%34 = icmp eq i32 %33, -1
br i1 %34, label %42, label %40
35: ; preds = %28
%36 = sext i32 %18 to i64
%37 = sext i32 %19 to i64
%38 = call i32 (i8**, i8*, ...) @asprintf(i8** %4, i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str.3, i64 0, i64 0), i64 %36, i64 %37)
%39 = icmp eq i32 %38, -1
br i1 %39, label %42, label %40
40: ; preds = %30, %35, %22
%41 = load i8*, i8** %4
br label %42
42: ; preds = %7, %40, %22, %30, %35
%43 = phi i8* [ %41, %40 ], [ null, %22 ], [ null, %30 ], [ null, %35 ], [ %11, %7 ]
ret i8* %43
}