#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*/ sendack();
int /*<<< orphan*/ sendbyte(unsigned int);
void send(unsigned int u) {
  if (u < 0x40) {
    sendbyte(u | 0x80);
    goto tail0;
  }
  if (u < 2000) {
    sendbyte((u >> 7) | 0x80);
    goto tail1;
  }
  if (u < 100000) {
    sendbyte((u >> 14) | 0x80);
    goto tail2;
  }
  if (u < 8000000) {
    sendbyte((u >> 21) | 0x80);
    goto tail3;
  }
  sendbyte((u >> 28) | 0x80);
  sendbyte((u >> 21) & 0x7f);
tail3:
  sendbyte((u >> 14) & 0x7f);
tail2:
  sendbyte((u >> 7) & 0x7f);
tail1:
  sendbyte(u & 0x7f);
tail0:
  sendack();
}


x86 assembly (clang, -O0):
<send>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
mov    %edi,-0x4(%rbp)
cmpl   $0x40,-0x4(%rbp)
jae    1148 <send+0x28>
mov    -0x4(%rbp),%edi
or     $0x80,%edi
call   1040 <sendbyte@plt>
jmp    11f7 <send+0xd7>
cmpl   $0x7d0,-0x4(%rbp)
jae    116b <send+0x4b>
mov    -0x4(%rbp),%edi
shr    $0x7,%edi
or     $0x80,%edi
call   1040 <sendbyte@plt>
jmp    11ec <send+0xcc>
cmpl   $0x186a0,-0x4(%rbp)
jae    118e <send+0x6e>
mov    -0x4(%rbp),%edi
shr    $0xe,%edi
or     $0x80,%edi
call   1040 <sendbyte@plt>
jmp    11de <send+0xbe>
cmpl   $0x7a1200,-0x4(%rbp)
jae    11b1 <send+0x91>
mov    -0x4(%rbp),%edi
shr    $0x15,%edi
or     $0x80,%edi
call   1040 <sendbyte@plt>
jmp    11d0 <send+0xb0>
mov    -0x4(%rbp),%edi
shr    $0x1c,%edi
or     $0x80,%edi
call   1040 <sendbyte@plt>
mov    -0x4(%rbp),%edi
shr    $0x15,%edi
and    $0x7f,%edi
call   1040 <sendbyte@plt>
mov    -0x4(%rbp),%edi
shr    $0xe,%edi
and    $0x7f,%edi
call   1040 <sendbyte@plt>
mov    -0x4(%rbp),%edi
shr    $0x7,%edi
and    $0x7f,%edi
call   1040 <sendbyte@plt>
mov    -0x4(%rbp),%edi
and    $0x7f,%edi
call   1040 <sendbyte@plt>
mov    $0x0,%al
call   1030 <sendack@plt>
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<send>:
push   %rbx
mov    %edi,%ebx
cmp    $0x3f,%edi
ja     1130 <send+0x10>
or     $0x80,%ebx
jmp    11a3 <send+0x83>
mov    %ebx,%edi
cmp    $0x7cf,%ebx
ja     1145 <send+0x25>
shr    $0x7,%edi
or     $0x80,%edi
jmp    119b <send+0x7b>
cmp    $0x1869f,%ebx
ja     1158 <send+0x38>
shr    $0xe,%edi
or     $0x80,%edi
jmp    118e <send+0x6e>
cmp    $0x7a11ff,%ebx
ja     116b <send+0x4b>
shr    $0x15,%edi
or     $0x80,%edi
jmp    1181 <send+0x61>
shr    $0x1c,%edi
or     $0x80,%edi
call   1040 <sendbyte@plt>
mov    %ebx,%edi
shr    $0x15,%edi
and    $0x7f,%edi
call   1040 <sendbyte@plt>
mov    %ebx,%edi
shr    $0xe,%edi
and    $0x7f,%edi
call   1040 <sendbyte@plt>
mov    %ebx,%edi
shr    $0x7,%edi
and    $0x7f,%edi
call   1040 <sendbyte@plt>
and    $0x7f,%ebx
mov    %ebx,%edi
call   1040 <sendbyte@plt>
xor    %eax,%eax
pop    %rbx
jmp    1030 <sendack@plt>

LLVM IR (-O0):
define void @send(i32 %0) {
%2 = alloca i32
store i32 %0, i32* %2
%3 = load i32, i32* %2
%4 = icmp ult i32 %3, 64
br i1 %4, label %5, label %9
5: ; preds = %1
%6 = load i32, i32* %2
%7 = or i32 %6, 128
%8 = call i32 @sendbyte(i32 %7)
br label %56
9: ; preds = %1
%10 = load i32, i32* %2
%11 = icmp ult i32 %10, 2000
br i1 %11, label %12, label %17
12: ; preds = %9
%13 = load i32, i32* %2
%14 = lshr i32 %13, 7
%15 = or i32 %14, 128
%16 = call i32 @sendbyte(i32 %15)
br label %52
17: ; preds = %9
%18 = load i32, i32* %2
%19 = icmp ult i32 %18, 100000
br i1 %19, label %20, label %25
20: ; preds = %17
%21 = load i32, i32* %2
%22 = lshr i32 %21, 14
%23 = or i32 %22, 128
%24 = call i32 @sendbyte(i32 %23)
br label %47
25: ; preds = %17
%26 = load i32, i32* %2
%27 = icmp ult i32 %26, 8000000
br i1 %27, label %28, label %33
28: ; preds = %25
%29 = load i32, i32* %2
%30 = lshr i32 %29, 21
%31 = or i32 %30, 128
%32 = call i32 @sendbyte(i32 %31)
br label %42
33: ; preds = %25
%34 = load i32, i32* %2
%35 = lshr i32 %34, 28
%36 = or i32 %35, 128
%37 = call i32 @sendbyte(i32 %36)
%38 = load i32, i32* %2
%39 = lshr i32 %38, 21
%40 = and i32 %39, 127
%41 = call i32 @sendbyte(i32 %40)
br label %42
42: ; preds = %33, %28
%43 = load i32, i32* %2
%44 = lshr i32 %43, 14
%45 = and i32 %44, 127
%46 = call i32 @sendbyte(i32 %45)
br label %47
47: ; preds = %42, %20
%48 = load i32, i32* %2
%49 = lshr i32 %48, 7
%50 = and i32 %49, 127
%51 = call i32 @sendbyte(i32 %50)
br label %52
52: ; preds = %47, %12
%53 = load i32, i32* %2
%54 = and i32 %53, 127
%55 = call i32 @sendbyte(i32 %54)
br label %56
56: ; preds = %52, %5
%57 = call i32 (...) @sendack()
ret void
}

LLVM IR (-O2):
define void @send(i32 %0) {
%2 = icmp ult i32 %0, 64
br i1 %2, label %3, label %5
3: ; preds = %1
%4 = or i32 %0, 128
br label %40
5: ; preds = %1
%6 = icmp ult i32 %0, 2000
br i1 %6, label %7, label %10
7: ; preds = %5
%8 = lshr i32 %0, 7
%9 = or i32 %8, 128
br label %36
10: ; preds = %5
%11 = icmp ult i32 %0, 100000
br i1 %11, label %12, label %15
12: ; preds = %10
%13 = lshr i32 %0, 14
%14 = or i32 %13, 128
br label %31
15: ; preds = %10
%16 = icmp ult i32 %0, 8000000
br i1 %16, label %17, label %20
17: ; preds = %15
%18 = lshr i32 %0, 21
%19 = or i32 %18, 128
br label %26
20: ; preds = %15
%21 = lshr i32 %0, 28
%22 = or i32 %21, 128
%23 = tail call i32 @sendbyte(i32 %22)
%24 = lshr i32 %0, 21
%25 = and i32 %24, 127
br label %26
26: ; preds = %20, %17
%27 = phi i32 [ %25, %20 ], [ %19, %17 ]
%28 = tail call i32 @sendbyte(i32 %27)
%29 = lshr i32 %0, 14
%30 = and i32 %29, 127
br label %31
31: ; preds = %26, %12
%32 = phi i32 [ %30, %26 ], [ %14, %12 ]
%33 = tail call i32 @sendbyte(i32 %32)
%34 = lshr i32 %0, 7
%35 = and i32 %34, 127
br label %36
36: ; preds = %31, %7
%37 = phi i32 [ %35, %31 ], [ %9, %7 ]
%38 = tail call i32 @sendbyte(i32 %37)
%39 = and i32 %0, 127
br label %40
40: ; preds = %36, %3
%41 = phi i32 [ %39, %36 ], [ %4, %3 ]
%42 = tail call i32 @sendbyte(i32 %41)
%43 = tail call i32 (...) @sendack()
ret void
}