#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 uint8_t;
typedef int uint32_t;

/* Variables and functions */
void midi_note_off(uint8_t curValue0, uint8_t curValue1, uint32_t timediff,
                   uint8_t **buf, int *curBufferPosition) {
  uint32_t timediff4 = (timediff >> 28) & 0x7F;
  uint32_t timediff3 = (timediff >> 21) & 0x7F;
  uint32_t timediff2 = (timediff >> 14) & 0x7F;
  uint32_t timediff1 = (timediff >> 7) & 0x7F;
  uint32_t timediff0 = (timediff >> 0) & 0x7F;
  if (timediff4 > 0)
    (*buf)[(*curBufferPosition)++] = 128 + timediff4;
  if (timediff3 > 0)
    (*buf)[(*curBufferPosition)++] = 128 + timediff3;
  if (timediff2 > 0)
    (*buf)[(*curBufferPosition)++] = 128 + timediff2;
  if (timediff1 > 0)
    (*buf)[(*curBufferPosition)++] = 128 + timediff1;
  (*buf)[(*curBufferPosition)++] = timediff0;
  (*buf)[(*curBufferPosition)++] = 128;
  (*buf)[(*curBufferPosition)++] = curValue0;
  (*buf)[(*curBufferPosition)++] = curValue1;
}


x86 assembly (clang, -O0):
<midi_note_off>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x1c,%eax
and    $0x7f,%eax
mov    %eax,-0x24(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x15,%eax
and    $0x7f,%eax
mov    %eax,-0x28(%rbp)
mov    -0xc(%rbp),%eax
sar    $0xe,%eax
and    $0x7f,%eax
mov    %eax,-0x2c(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x7,%eax
and    $0x7f,%eax
mov    %eax,-0x30(%rbp)
mov    -0xc(%rbp),%eax
sar    $0x0,%eax
and    $0x7f,%eax
mov    %eax,-0x34(%rbp)
cmpl   $0x0,-0x24(%rbp)
jle    117e <midi_note_off+0x7e>
mov    -0x24(%rbp),%edx
add    $0x80,%edx
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    -0x20(%rbp),%rsi
mov    (%rsi),%ecx
mov    %ecx,%edi
add    $0x1,%edi
mov    %edi,(%rsi)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
cmpl   $0x0,-0x28(%rbp)
jle    11ab <midi_note_off+0xab>
mov    -0x28(%rbp),%edx
add    $0x80,%edx
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    -0x20(%rbp),%rsi
mov    (%rsi),%ecx
mov    %ecx,%edi
add    $0x1,%edi
mov    %edi,(%rsi)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
cmpl   $0x0,-0x2c(%rbp)
jle    11d8 <midi_note_off+0xd8>
mov    -0x2c(%rbp),%edx
add    $0x80,%edx
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    -0x20(%rbp),%rsi
mov    (%rsi),%ecx
mov    %ecx,%edi
add    $0x1,%edi
mov    %edi,(%rsi)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
cmpl   $0x0,-0x30(%rbp)
jle    1205 <midi_note_off+0x105>
mov    -0x30(%rbp),%edx
add    $0x80,%edx
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    -0x20(%rbp),%rsi
mov    (%rsi),%ecx
mov    %ecx,%edi
add    $0x1,%edi
mov    %edi,(%rsi)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x34(%rbp),%edx
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    -0x20(%rbp),%rsi
mov    (%rsi),%ecx
mov    %ecx,%edi
add    $0x1,%edi
mov    %edi,(%rsi)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    -0x20(%rbp),%rdx
mov    (%rdx),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,(%rdx)
movslq %ecx,%rcx
movl   $0x80,(%rax,%rcx,4)
mov    -0x4(%rbp),%edx
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    -0x20(%rbp),%rsi
mov    (%rsi),%ecx
mov    %ecx,%edi
add    $0x1,%edi
mov    %edi,(%rsi)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x8(%rbp),%edx
mov    -0x18(%rbp),%rax
mov    (%rax),%rax
mov    -0x20(%rbp),%rsi
mov    (%rsi),%ecx
mov    %ecx,%edi
add    $0x1,%edi
mov    %edi,(%rsi)
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
pop    %rbp
ret

x86 assembly (clang, -O2):
<midi_note_off>:
push   %rbp
push   %rbx
mov    %edx,%eax
sar    $0x1c,%eax
mov    %edx,%r11d
shr    $0x15,%r11d
and    $0x7f,%r11d
mov    %edx,%r9d
shr    $0xe,%r9d
and    $0x7f,%eax
je     1133 <midi_note_off+0x33>
or     $0x80,%eax
mov    (%rcx),%r10
movslq (%r8),%rbx
lea    0x1(%rbx),%ebp
mov    %ebp,(%r8)
mov    %eax,(%r10,%rbx,4)
mov    %edx,%r10d
shr    $0x7,%r10d
and    $0x7f,%r9d
test   %r11d,%r11d
je     115a <midi_note_off+0x5a>
or     $0x80,%r11d
mov    (%rcx),%rax
movslq (%r8),%rbx
lea    0x1(%rbx),%ebp
mov    %ebp,(%r8)
mov    %r11d,(%rax,%rbx,4)
and    $0x7f,%r10d
test   %r9d,%r9d
je     117a <midi_note_off+0x7a>
or     $0x80,%r9d
mov    (%rcx),%rax
movslq (%r8),%rbp
lea    0x1(%rbp),%ebx
mov    %ebx,(%r8)
mov    %r9d,(%rax,%rbp,4)
test   %r10d,%r10d
je     1198 <midi_note_off+0x98>
or     $0x80,%r10d
mov    (%rcx),%rcx
movslq (%r8),%rax
lea    0x1(%rax),%ebp
mov    %ebp,(%r8)
mov    %r10d,(%rcx,%rax,4)
jmp    119b <midi_note_off+0x9b>
mov    (%rcx),%rcx
and    $0x7f,%edx
movslq (%r8),%rax
lea    0x1(%rax),%ebp
mov    %ebp,(%r8)
mov    %edx,(%rcx,%rax,4)
movslq (%r8),%rax
lea    0x1(%rax),%edx
mov    %edx,(%r8)
movl   $0x80,(%rcx,%rax,4)
movslq (%r8),%rax
lea    0x1(%rax),%edx
mov    %edx,(%r8)
mov    %edi,(%rcx,%rax,4)
movslq (%r8),%rax
lea    0x1(%rax),%edx
mov    %edx,(%r8)
mov    %esi,(%rcx,%rax,4)
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
define void @midi_note_off(i32 %0, i32 %1, i32 %2, i32** %3, i32* %4) {
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32**
%10 = alloca i32*
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32** %3, i32*** %9
store i32* %4, i32** %10
%16 = load i32, i32* %8
%17 = ashr i32 %16, 28
%18 = and i32 %17, 127
store i32 %18, i32* %11
%19 = load i32, i32* %8
%20 = ashr i32 %19, 21
%21 = and i32 %20, 127
store i32 %21, i32* %12
%22 = load i32, i32* %8
%23 = ashr i32 %22, 14
%24 = and i32 %23, 127
store i32 %24, i32* %13
%25 = load i32, i32* %8
%26 = ashr i32 %25, 7
%27 = and i32 %26, 127
store i32 %27, i32* %14
%28 = load i32, i32* %8
%29 = ashr i32 %28, 0
%30 = and i32 %29, 127
store i32 %30, i32* %15
%31 = load i32, i32* %11
%32 = icmp sgt i32 %31, 0
br i1 %32, label %33, label %43
33: ; preds = %5
%34 = load i32, i32* %11
%35 = add nsw i32 128, %34
%36 = load i32**, i32*** %9
%37 = load i32*, i32** %36
%38 = load i32*, i32** %10
%39 = load i32, i32* %38
%40 = add nsw i32 %39, 1
store i32 %40, i32* %38
%41 = sext i32 %39 to i64
%42 = getelementptr inbounds i32, i32* %37, i64 %41
store i32 %35, i32* %42
br label %43
43: ; preds = %33, %5
%44 = load i32, i32* %12
%45 = icmp sgt i32 %44, 0
br i1 %45, label %46, label %56
46: ; preds = %43
%47 = load i32, i32* %12
%48 = add nsw i32 128, %47
%49 = load i32**, i32*** %9
%50 = load i32*, i32** %49
%51 = load i32*, i32** %10
%52 = load i32, i32* %51
%53 = add nsw i32 %52, 1
store i32 %53, i32* %51
%54 = sext i32 %52 to i64
%55 = getelementptr inbounds i32, i32* %50, i64 %54
store i32 %48, i32* %55
br label %56
56: ; preds = %46, %43
%57 = load i32, i32* %13
%58 = icmp sgt i32 %57, 0
br i1 %58, label %59, label %69
59: ; preds = %56
%60 = load i32, i32* %13
%61 = add nsw i32 128, %60
%62 = load i32**, i32*** %9
%63 = load i32*, i32** %62
%64 = load i32*, i32** %10
%65 = load i32, i32* %64
%66 = add nsw i32 %65, 1
store i32 %66, i32* %64
%67 = sext i32 %65 to i64
%68 = getelementptr inbounds i32, i32* %63, i64 %67
store i32 %61, i32* %68
br label %69
69: ; preds = %59, %56
%70 = load i32, i32* %14
%71 = icmp sgt i32 %70, 0
br i1 %71, label %72, label %82
72: ; preds = %69
%73 = load i32, i32* %14
%74 = add nsw i32 128, %73
%75 = load i32**, i32*** %9
%76 = load i32*, i32** %75
%77 = load i32*, i32** %10
%78 = load i32, i32* %77
%79 = add nsw i32 %78, 1
store i32 %79, i32* %77
%80 = sext i32 %78 to i64
%81 = getelementptr inbounds i32, i32* %76, i64 %80
store i32 %74, i32* %81
br label %82
82: ; preds = %72, %69
%83 = load i32, i32* %15
%84 = load i32**, i32*** %9
%85 = load i32*, i32** %84
%86 = load i32*, i32** %10
%87 = load i32, i32* %86
%88 = add nsw i32 %87, 1
store i32 %88, i32* %86
%89 = sext i32 %87 to i64
%90 = getelementptr inbounds i32, i32* %85, i64 %89
store i32 %83, i32* %90
%91 = load i32**, i32*** %9
%92 = load i32*, i32** %91
%93 = load i32*, i32** %10
%94 = load i32, i32* %93
%95 = add nsw i32 %94, 1
store i32 %95, i32* %93
%96 = sext i32 %94 to i64
%97 = getelementptr inbounds i32, i32* %92, i64 %96
store i32 128, i32* %97
%98 = load i32, i32* %6
%99 = load i32**, i32*** %9
%100 = load i32*, i32** %99
%101 = load i32*, i32** %10
%102 = load i32, i32* %101
%103 = add nsw i32 %102, 1
store i32 %103, i32* %101
%104 = sext i32 %102 to i64
%105 = getelementptr inbounds i32, i32* %100, i64 %104
store i32 %98, i32* %105
%106 = load i32, i32* %7
%107 = load i32**, i32*** %9
%108 = load i32*, i32** %107
%109 = load i32*, i32** %10
%110 = load i32, i32* %109
%111 = add nsw i32 %110, 1
store i32 %111, i32* %109
%112 = sext i32 %110 to i64
%113 = getelementptr inbounds i32, i32* %108, i64 %112
store i32 %106, i32* %113
ret void
}

LLVM IR (-O2):
define void @midi_note_off(i32 %0, i32 %1, i32 %2, i32** nocapture %3, i32* nocapture %4) {
%6 = ashr i32 %2, 28
%7 = and i32 %6, 127
%8 = lshr i32 %2, 21
%9 = and i32 %8, 127
%10 = lshr i32 %2, 14
%11 = and i32 %10, 127
%12 = lshr i32 %2, 7
%13 = and i32 %12, 127
%14 = icmp eq i32 %7, 0
br i1 %14, label %22, label %15
15: ; preds = %5
%16 = or i32 %7, 128
%17 = load i32*, i32** %3
%18 = load i32, i32* %4
%19 = add nsw i32 %18, 1
store i32 %19, i32* %4
%20 = sext i32 %18 to i64
%21 = getelementptr inbounds i32, i32* %17, i64 %20
store i32 %16, i32* %21
br label %22
22: ; preds = %15, %5
%23 = icmp eq i32 %9, 0
br i1 %23, label %31, label %24
24: ; preds = %22
%25 = or i32 %9, 128
%26 = load i32*, i32** %3
%27 = load i32, i32* %4
%28 = add nsw i32 %27, 1
store i32 %28, i32* %4
%29 = sext i32 %27 to i64
%30 = getelementptr inbounds i32, i32* %26, i64 %29
store i32 %25, i32* %30
br label %31
31: ; preds = %24, %22
%32 = icmp eq i32 %11, 0
br i1 %32, label %40, label %33
33: ; preds = %31
%34 = or i32 %11, 128
%35 = load i32*, i32** %3
%36 = load i32, i32* %4
%37 = add nsw i32 %36, 1
store i32 %37, i32* %4
%38 = sext i32 %36 to i64
%39 = getelementptr inbounds i32, i32* %35, i64 %38
store i32 %34, i32* %39
br label %40
40: ; preds = %33, %31
%41 = icmp eq i32 %13, 0
br i1 %41, label %42, label %44
42: ; preds = %40
%43 = load i32*, i32** %3
br label %51
44: ; preds = %40
%45 = or i32 %13, 128
%46 = load i32*, i32** %3
%47 = load i32, i32* %4
%48 = add nsw i32 %47, 1
store i32 %48, i32* %4
%49 = sext i32 %47 to i64
%50 = getelementptr inbounds i32, i32* %46, i64 %49
store i32 %45, i32* %50
br label %51
51: ; preds = %42, %44
%52 = phi i32* [ %43, %42 ], [ %46, %44 ]
%53 = and i32 %2, 127
%54 = load i32, i32* %4
%55 = add nsw i32 %54, 1
store i32 %55, i32* %4
%56 = sext i32 %54 to i64
%57 = getelementptr inbounds i32, i32* %52, i64 %56
store i32 %53, i32* %57
%58 = load i32, i32* %4
%59 = add nsw i32 %58, 1
store i32 %59, i32* %4
%60 = sext i32 %58 to i64
%61 = getelementptr inbounds i32, i32* %52, i64 %60
store i32 128, i32* %61
%62 = load i32, i32* %4
%63 = add nsw i32 %62, 1
store i32 %63, i32* %4
%64 = sext i32 %62 to i64
%65 = getelementptr inbounds i32, i32* %52, i64 %64
store i32 %0, i32* %65
%66 = load i32, i32* %4
%67 = add nsw i32 %66, 1
store i32 %67, i32* %4
%68 = sext i32 %66 to i64
%69 = getelementptr inbounds i32, i32* %52, i64 %68
store i32 %1, i32* %69
ret void
}