#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 */
scalar_t__ lrint(double);
unsigned short note2freq(char, char);
int read(int /*<<< orphan*/, char *, int);
void read_note(unsigned short *buf, unsigned short *i, unsigned short shift) {
  char b;
  double spfb;
  long int bpm = 0;
  char t[3];
  read(0, &b, 1);
  bpm += 100 * (b - '0');
  read(0, &b, 1);
  bpm += 10 * (b - '0');
  read(0, &b, 1);
  bpm += (b - '0');
  spfb = 240000.0 / bpm;
  read(0, t, 1);
  while (read(0, t, 3) == 3) {
    t[1] -= '0';
    t[1] += shift;
    t[2] -= '0' - 1;
    if (t[2] > 10)
      t[2] -= 'A' - ('9' + 1);
    buf[(*i)++] = note2freq(t[0], t[1]);
    buf[(*i)++] = (unsigned short)lrint(spfb / t[2]);
    read(0, t, 1);
  }
}


x86 assembly (clang, -O0):
<read_note>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %dx,%ax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %ax,-0x12(%rbp)
movq   $0x0,-0x28(%rbp)
xor    %edi,%edi
lea    -0x13(%rbp),%rsi
mov    $0x1,%edx
call   1040 <read@plt>
movsbl -0x13(%rbp),%eax
sub    $0x30,%eax
imul   $0x64,%eax,%eax
cltq
add    -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
xor    %edi,%edi
lea    -0x13(%rbp),%rsi
mov    $0x1,%edx
call   1040 <read@plt>
movsbl -0x13(%rbp),%eax
sub    $0x30,%eax
imul   $0xa,%eax,%eax
cltq
add    -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
xor    %edi,%edi
lea    -0x13(%rbp),%rsi
mov    $0x1,%edx
call   1040 <read@plt>
movsbl -0x13(%rbp),%eax
sub    $0x30,%eax
cltq
add    -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
cvtsi2sdq -0x28(%rbp),%xmm1
movsd  0xe3a(%rip),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
lea    -0x2b(%rbp),%rsi
xor    %edi,%edi
mov    $0x1,%edx
call   1040 <read@plt>
lea    -0x2b(%rbp),%rsi
xor    %edi,%edi
mov    $0x3,%edx
call   1040 <read@plt>
cmp    $0x3,%eax
jne    12a8 <read_note+0x178>
movsbl -0x2a(%rbp),%eax
sub    $0x30,%eax
mov    %al,-0x2a(%rbp)
movzwl -0x12(%rbp),%ecx
movsbl -0x2a(%rbp),%eax
add    %ecx,%eax
mov    %al,-0x2a(%rbp)
movsbl -0x29(%rbp),%eax
sub    $0x2f,%eax
mov    %al,-0x29(%rbp)
movsbl -0x29(%rbp),%eax
cmp    $0xa,%eax
jle    1230 <read_note+0x100>
movsbl -0x29(%rbp),%eax
sub    $0x7,%eax
mov    %al,-0x29(%rbp)
mov    -0x2b(%rbp),%al
movsbl %al,%edi
movsbl -0x2a(%rbp),%esi
call   1030 <note2freq@plt>
mov    %ax,%dx
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rsi
mov    (%rsi),%cx
mov    %cx,%di
add    $0x1,%di
mov    %di,(%rsi)
movzwl %cx,%ecx
mov    %dx,(%rax,%rcx,2)
movsd  -0x20(%rbp),%xmm0
movsbl -0x29(%rbp),%eax
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm0
call   1050 <lrint@plt>
mov    %ax,%dx
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rsi
mov    (%rsi),%cx
mov    %cx,%di
add    $0x1,%di
mov    %di,(%rsi)
movzwl %cx,%ecx
mov    %dx,(%rax,%rcx,2)
lea    -0x2b(%rbp),%rsi
xor    %edi,%edi
mov    $0x1,%edx
call   1040 <read@plt>
jmp    11df <read_note+0xaf>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<read_note>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x18,%rsp
mov    %edx,%r14d
mov    %rsi,%rbx
mov    %rdi,%r13
lea    0xc(%rsp),%r15
xor    %edi,%edi
mov    %r15,%rsi
mov    $0x1,%edx
call   1040 <read@plt>
movsbl 0xc(%rsp),%eax
mov    %eax,0x10(%rsp)
xor    %edi,%edi
mov    %r15,%rsi
mov    $0x1,%edx
call   1040 <read@plt>
movsbl 0xc(%rsp),%ebp
xor    %edi,%edi
mov    %r15,%rsi
mov    $0x1,%edx
call   1040 <read@plt>
movsbl 0xc(%rsp),%r12d
lea    0xd(%rsp),%r15
xor    %edi,%edi
mov    %r15,%rsi
mov    $0x1,%edx
call   1040 <read@plt>
xor    %edi,%edi
mov    %r15,%rsi
mov    $0x3,%edx
call   1040 <read@plt>
cmp    $0x3,%eax
jne    1284 <read_note+0x154>
imul   $0x64,0x10(%rsp),%eax
lea    0x0(%rbp,%rbp,4),%ecx
lea    (%rax,%rcx,2),%eax
add    %r12d,%eax
add    $0xffffeb30,%eax
cvtsi2sd %eax,%xmm0
movsd  0xe27(%rip),%xmm1
divsd  %xmm0,%xmm1
movsd  %xmm1,0x10(%rsp)
add    $0xd0,%r14b
lea    0xd(%rsp),%r15
nopl   0x0(%rax)
movzbl 0xe(%rsp),%eax
add    %r14b,%al
mov    %al,0xe(%rsp)
movzbl 0xf(%rsp),%ecx
lea    -0x2f(%rcx),%edx
add    $0xca,%cl
cmp    $0xb,%dl
movzbl %cl,%ecx
movzbl %dl,%ebp
cmovge %ecx,%ebp
mov    %bpl,0xf(%rsp)
movsbl 0xd(%rsp),%edi
movsbl %al,%esi
call   1030 <note2freq@plt>
movzwl (%rbx),%ecx
lea    0x1(%rcx),%edx
mov    %dx,(%rbx)
mov    %ax,0x0(%r13,%rcx,2)
movsbl %bpl,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movsd  0x10(%rsp),%xmm0
divsd  %xmm1,%xmm0
call   1050 <lrint@plt>
movzwl (%rbx),%ecx
lea    0x1(%rcx),%edx
mov    %dx,(%rbx)
mov    %ax,0x0(%r13,%rcx,2)
xor    %edi,%edi
mov    %r15,%rsi
mov    $0x1,%edx
call   1040 <read@plt>
xor    %edi,%edi
mov    %r15,%rsi
mov    $0x3,%edx
call   1040 <read@plt>
cmp    $0x3,%eax
je     11f0 <read_note+0xc0>
add    $0x18,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @read_note(i16* nocapture writeonly %0, i16* nocapture %1, i16 zeroext %2) {
%4 = alloca i8
%5 = alloca [3 x i8]
%6 = getelementptr inbounds [3 x i8], [3 x i8]* %5, i64 0, i64 0
%7 = call i32 @read(i32 0, i8* %4, i32 1)
%8 = load i8, i8* %4
%9 = sext i8 %8 to i64
%10 = mul nsw i64 %9, 100
%11 = call i32 @read(i32 0, i8* %4, i32 1)
%12 = load i8, i8* %4
%13 = sext i8 %12 to i64
%14 = mul nsw i64 %13, 10
%15 = call i32 @read(i32 0, i8* %4, i32 1)
%16 = load i8, i8* %4
%17 = sext i8 %16 to i64
%18 = add nsw i64 %10, -5328
%19 = add nsw i64 %18, %14
%20 = add nsw i64 %19, %17
%21 = sitofp i64 %20 to double
%22 = fdiv double 2.400000e+05, %21
%23 = call i32 @read(i32 0, i8* %6, i32 1)
%24 = call i32 @read(i32 0, i8* %6, i32 3)
%25 = icmp eq i32 %24, 3
br i1 %25, label %26, label %56
26: ; preds = %3
%27 = getelementptr inbounds [3 x i8], [3 x i8]* %5, i64 0, i64 1
%28 = trunc i16 %2 to i8
%29 = add i8 %28, -48
%30 = getelementptr inbounds [3 x i8], [3 x i8]* %5, i64 0, i64 2
br label %31
31: ; preds = %26, %31
%32 = load i8, i8* %27
%33 = add i8 %29, %32
store i8 %33, i8* %27
%34 = load i8, i8* %30
%35 = add i8 %34, -47
%36 = icmp sgt i8 %35, 10
%37 = add i8 %34, -54
%38 = select i1 %36, i8 %37, i8 %35
store i8 %38, i8* %30
%39 = load i8, i8* %6
%40 = tail call zeroext i16 @note2freq(i8 signext %39, i8 signext %33)
%41 = load i16, i16* %1
%42 = add i16 %41, 1
store i16 %42, i16* %1
%43 = zext i16 %41 to i64
%44 = getelementptr inbounds i16, i16* %0, i64 %43
store i16 %40, i16* %44
%45 = sitofp i8 %38 to double
%46 = fdiv double %22, %45
%47 = tail call i64 @lrint(double %46)
%48 = trunc i64 %47 to i16
%49 = load i16, i16* %1
%50 = add i16 %49, 1
store i16 %50, i16* %1
%51 = zext i16 %49 to i64
%52 = getelementptr inbounds i16, i16* %0, i64 %51
store i16 %48, i16* %52
%53 = call i32 @read(i32 0, i8* %6, i32 1)
%54 = call i32 @read(i32 0, i8* %6, i32 3)
%55 = icmp eq i32 %54, 3
br i1 %55, label %31, label %56
56: ; preds = %31, %3
ret void
}