int ulaw_encode(register int c) {
  register int mask;
  if (c < 0) {
    c = -c;
    mask = 0x7f;
  } else
    mask = 0xff;
  if (c < 32)
    c = 0xf0 | (15 - (c >> 1));
  else if (c < 96)
    c = 0xe0 | (15 - ((c - 32) >> 2));
  else if (c < 224)
    c = 0xd0 | (15 - ((c - 96) >> 3));
  else if (c < 480)
    c = 0xc0 | (15 - ((c - 224) >> 4));
  else if (c < 992)
    c = 0xb0 | (15 - ((c - 480) >> 5));
  else if (c < 2016)
    c = 0xa0 | (15 - ((c - 992) >> 6));
  else if (c < 4064)
    c = 0x90 | (15 - ((c - 2016) >> 7));
  else if (c < 8160)
    c = 0x80 | (15 - ((c - 4064) >> 8));
  else
    c = 0x80;
  return mask & c;
}


x86 assembly (clang, -O0):
<ulaw_encode>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
cmpl   $0x0,-0x4(%rbp)
jge    1125 <ulaw_encode+0x25>
xor    %eax,%eax
sub    -0x4(%rbp),%eax
mov    %eax,-0x4(%rbp)
movl   $0x7f,-0x8(%rbp)
jmp    112c <ulaw_encode+0x2c>
movl   $0xff,-0x8(%rbp)
cmpl   $0x20,-0x4(%rbp)
jge    1150 <ulaw_encode+0x50>
mov    -0x4(%rbp),%ecx
sar    $0x1,%ecx
mov    $0xf,%eax
sub    %ecx,%eax
or     $0xf0,%eax
mov    %eax,-0x4(%rbp)
jmp    12ac <ulaw_encode+0x1ac>
cmpl   $0x60,-0x4(%rbp)
jge    1177 <ulaw_encode+0x77>
mov    -0x4(%rbp),%ecx
sub    $0x20,%ecx
sar    $0x2,%ecx
mov    $0xf,%eax
sub    %ecx,%eax
or     $0xe0,%eax
mov    %eax,-0x4(%rbp)
jmp    12a7 <ulaw_encode+0x1a7>
cmpl   $0xe0,-0x4(%rbp)
jge    11a1 <ulaw_encode+0xa1>
mov    -0x4(%rbp),%ecx
sub    $0x60,%ecx
sar    $0x3,%ecx
mov    $0xf,%eax
sub    %ecx,%eax
or     $0xd0,%eax
mov    %eax,-0x4(%rbp)
jmp    12a2 <ulaw_encode+0x1a2>
cmpl   $0x1e0,-0x4(%rbp)
jge    11ce <ulaw_encode+0xce>
mov    -0x4(%rbp),%ecx
sub    $0xe0,%ecx
sar    $0x4,%ecx
mov    $0xf,%eax
sub    %ecx,%eax
or     $0xc0,%eax
mov    %eax,-0x4(%rbp)
jmp    129d <ulaw_encode+0x19d>
cmpl   $0x3e0,-0x4(%rbp)
jge    11fb <ulaw_encode+0xfb>
mov    -0x4(%rbp),%ecx
sub    $0x1e0,%ecx
sar    $0x5,%ecx
mov    $0xf,%eax
sub    %ecx,%eax
or     $0xb0,%eax
mov    %eax,-0x4(%rbp)
jmp    1298 <ulaw_encode+0x198>
cmpl   $0x7e0,-0x4(%rbp)
jge    1228 <ulaw_encode+0x128>
mov    -0x4(%rbp),%ecx
sub    $0x3e0,%ecx
sar    $0x6,%ecx
mov    $0xf,%eax
sub    %ecx,%eax
or     $0xa0,%eax
mov    %eax,-0x4(%rbp)
jmp    1293 <ulaw_encode+0x193>
cmpl   $0xfe0,-0x4(%rbp)
jge    1255 <ulaw_encode+0x155>
mov    -0x4(%rbp),%ecx
sub    $0x7e0,%ecx
sar    $0x7,%ecx
mov    $0xf,%eax
sub    %ecx,%eax
or     $0x90,%eax
mov    %eax,-0x4(%rbp)
jmp    128e <ulaw_encode+0x18e>
cmpl   $0x1fe0,-0x4(%rbp)
jge    1282 <ulaw_encode+0x182>
mov    -0x4(%rbp),%ecx
sub    $0xfe0,%ecx
sar    $0x8,%ecx
mov    $0xf,%eax
sub    %ecx,%eax
or     $0x80,%eax
mov    %eax,-0x4(%rbp)
jmp    1289 <ulaw_encode+0x189>
movl   $0x80,-0x4(%rbp)
jmp    128e <ulaw_encode+0x18e>
jmp    1293 <ulaw_encode+0x193>
jmp    1298 <ulaw_encode+0x198>
jmp    129d <ulaw_encode+0x19d>
jmp    12a2 <ulaw_encode+0x1a2>
jmp    12a7 <ulaw_encode+0x1a7>
jmp    12ac <ulaw_encode+0x1ac>
mov    -0x8(%rbp),%eax
and    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<ulaw_encode>:
mov    %edi,%eax
mov    %edi,%ecx
neg    %ecx
cmovs  %edi,%ecx
cmp    $0x1f,%ecx
jg     1122 <ulaw_encode+0x22>
shr    %ecx
mov    $0xf,%edx
sub    %ecx,%edx
or     $0xf0,%edx
jmp    1205 <ulaw_encode+0x105>
cmp    $0x5f,%ecx
ja     113f <ulaw_encode+0x3f>
add    $0xffffffe0,%ecx
shr    $0x2,%ecx
mov    $0xf,%edx
sub    %ecx,%edx
or     $0xe0,%edx
jmp    1205 <ulaw_encode+0x105>
cmp    $0xdf,%ecx
ja     115f <ulaw_encode+0x5f>
add    $0xffffffa0,%ecx
shr    $0x3,%ecx
mov    $0xf,%edx
sub    %ecx,%edx
or     $0xd0,%edx
jmp    1205 <ulaw_encode+0x105>
cmp    $0x1df,%ecx
ja     1182 <ulaw_encode+0x82>
add    $0xffffff20,%ecx
shr    $0x4,%ecx
mov    $0xf,%edx
sub    %ecx,%edx
or     $0xc0,%edx
jmp    1205 <ulaw_encode+0x105>
cmp    $0x3df,%ecx
ja     11a2 <ulaw_encode+0xa2>
add    $0xfffffe20,%ecx
shr    $0x5,%ecx
mov    $0xf,%edx
sub    %ecx,%edx
or     $0xb0,%edx
jmp    1205 <ulaw_encode+0x105>
cmp    $0x7df,%ecx
ja     11c2 <ulaw_encode+0xc2>
add    $0xfffffc20,%ecx
shr    $0x6,%ecx
mov    $0xf,%edx
sub    %ecx,%edx
or     $0xa0,%edx
jmp    1205 <ulaw_encode+0x105>
cmp    $0xfdf,%ecx
ja     11e2 <ulaw_encode+0xe2>
add    $0xfffff820,%ecx
shr    $0x7,%ecx
mov    $0xf,%edx
sub    %ecx,%edx
or     $0x90,%edx
jmp    1205 <ulaw_encode+0x105>
mov    $0x80,%edx
cmp    $0x1fdf,%ecx
ja     1205 <ulaw_encode+0x105>
add    $0xfffff020,%ecx
shr    $0x8,%ecx
mov    $0xf,%edx
sub    %ecx,%edx
or     $0x80,%edx
not    %eax
shr    $0x18,%eax
or     $0x7f,%eax
and    %edx,%eax
ret

LLVM IR (-O0):
define i32 @ulaw_encode(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %2
%4 = load i32, i32* %2
%5 = icmp slt i32 %4, 0
br i1 %5, label %6, label %9
6: ; preds = %1
%7 = load i32, i32* %2
%8 = sub nsw i32 0, %7
store i32 %8, i32* %2
store i32 127, i32* %3
br label %10
9: ; preds = %1
store i32 255, i32* %3
br label %10
10: ; preds = %9, %6
%11 = load i32, i32* %2
%12 = icmp slt i32 %11, 32
br i1 %12, label %13, label %18
13: ; preds = %10
%14 = load i32, i32* %2
%15 = ashr i32 %14, 1
%16 = sub nsw i32 15, %15
%17 = or i32 240, %16
store i32 %17, i32* %2
br label %89
18: ; preds = %10
%19 = load i32, i32* %2
%20 = icmp slt i32 %19, 96
br i1 %20, label %21, label %27
21: ; preds = %18
%22 = load i32, i32* %2
%23 = sub nsw i32 %22, 32
%24 = ashr i32 %23, 2
%25 = sub nsw i32 15, %24
%26 = or i32 224, %25
store i32 %26, i32* %2
br label %88
27: ; preds = %18
%28 = load i32, i32* %2
%29 = icmp slt i32 %28, 224
br i1 %29, label %30, label %36
30: ; preds = %27
%31 = load i32, i32* %2
%32 = sub nsw i32 %31, 96
%33 = ashr i32 %32, 3
%34 = sub nsw i32 15, %33
%35 = or i32 208, %34
store i32 %35, i32* %2
br label %87
36: ; preds = %27
%37 = load i32, i32* %2
%38 = icmp slt i32 %37, 480
br i1 %38, label %39, label %45
39: ; preds = %36
%40 = load i32, i32* %2
%41 = sub nsw i32 %40, 224
%42 = ashr i32 %41, 4
%43 = sub nsw i32 15, %42
%44 = or i32 192, %43
store i32 %44, i32* %2
br label %86
45: ; preds = %36
%46 = load i32, i32* %2
%47 = icmp slt i32 %46, 992
br i1 %47, label %48, label %54
48: ; preds = %45
%49 = load i32, i32* %2
%50 = sub nsw i32 %49, 480
%51 = ashr i32 %50, 5
%52 = sub nsw i32 15, %51
%53 = or i32 176, %52
store i32 %53, i32* %2
br label %85
54: ; preds = %45
%55 = load i32, i32* %2
%56 = icmp slt i32 %55, 2016
br i1 %56, label %57, label %63
57: ; preds = %54
%58 = load i32, i32* %2
%59 = sub nsw i32 %58, 992
%60 = ashr i32 %59, 6
%61 = sub nsw i32 15, %60
%62 = or i32 160, %61
store i32 %62, i32* %2
br label %84
63: ; preds = %54
%64 = load i32, i32* %2
%65 = icmp slt i32 %64, 4064
br i1 %65, label %66, label %72
66: ; preds = %63
%67 = load i32, i32* %2
%68 = sub nsw i32 %67, 2016
%69 = ashr i32 %68, 7
%70 = sub nsw i32 15, %69
%71 = or i32 144, %70
store i32 %71, i32* %2
br label %83
72: ; preds = %63
%73 = load i32, i32* %2
%74 = icmp slt i32 %73, 8160
br i1 %74, label %75, label %81
75: ; preds = %72
%76 = load i32, i32* %2
%77 = sub nsw i32 %76, 4064
%78 = ashr i32 %77, 8
%79 = sub nsw i32 15, %78
%80 = or i32 128, %79
store i32 %80, i32* %2
br label %82
81: ; preds = %72
store i32 128, i32* %2
br label %82
82: ; preds = %81, %75
br label %83
83: ; preds = %82, %66
br label %84
84: ; preds = %83, %57
br label %85
85: ; preds = %84, %48
br label %86
86: ; preds = %85, %39
br label %87
87: ; preds = %86, %30
br label %88
88: ; preds = %87, %21
br label %89
89: ; preds = %88, %13
%90 = load i32, i32* %3
%91 = load i32, i32* %2
%92 = and i32 %90, %91
ret i32 %92
}

LLVM IR (-O2):
define i32 @ulaw_encode(i32 %0) {
%2 = icmp slt i32 %0, 0
%3 = sub nsw i32 0, %0
%4 = select i1 %2, i32 %3, i32 %0
%5 = icmp slt i32 %4, 32
br i1 %5, label %6, label %10
6: ; preds = %1
%7 = lshr i32 %4, 1
%8 = sub nsw i32 15, %7
%9 = or i32 %8, 240
br label %59
10: ; preds = %1
%11 = icmp ult i32 %4, 96
br i1 %11, label %12, label %17
12: ; preds = %10
%13 = add nsw i32 %4, -32
%14 = lshr i32 %13, 2
%15 = sub nuw nsw i32 15, %14
%16 = or i32 %15, 224
br label %59
17: ; preds = %10
%18 = icmp ult i32 %4, 224
br i1 %18, label %19, label %24
19: ; preds = %17
%20 = add nsw i32 %4, -96
%21 = lshr i32 %20, 3
%22 = sub nuw nsw i32 15, %21
%23 = or i32 %22, 208
br label %59
24: ; preds = %17
%25 = icmp ult i32 %4, 480
br i1 %25, label %26, label %31
26: ; preds = %24
%27 = add nsw i32 %4, -224
%28 = lshr i32 %27, 4
%29 = sub nuw nsw i32 15, %28
%30 = or i32 %29, 192
br label %59
31: ; preds = %24
%32 = icmp ult i32 %4, 992
br i1 %32, label %33, label %38
33: ; preds = %31
%34 = add nsw i32 %4, -480
%35 = lshr i32 %34, 5
%36 = sub nuw nsw i32 15, %35
%37 = or i32 %36, 176
br label %59
38: ; preds = %31
%39 = icmp ult i32 %4, 2016
br i1 %39, label %40, label %45
40: ; preds = %38
%41 = add nsw i32 %4, -992
%42 = lshr i32 %41, 6
%43 = sub nuw nsw i32 15, %42
%44 = or i32 %43, 160
br label %59
45: ; preds = %38
%46 = icmp ult i32 %4, 4064
br i1 %46, label %47, label %52
47: ; preds = %45
%48 = add nsw i32 %4, -2016
%49 = lshr i32 %48, 7
%50 = sub nuw nsw i32 15, %49
%51 = or i32 %50, 144
br label %59
52: ; preds = %45
%53 = icmp ult i32 %4, 8160
br i1 %53, label %54, label %59
54: ; preds = %52
%55 = add nsw i32 %4, -4064
%56 = lshr i32 %55, 8
%57 = sub nuw nsw i32 15, %56
%58 = or i32 %57, 128
br label %59
59: ; preds = %52, %12, %26, %40, %54, %47, %33, %19, %6
%60 = phi i32 [ %9, %6 ], [ %16, %12 ], [ %23, %19 ], [ %30, %26 ], [ %37, %33 ], [ %44, %40 ], [ %51, %47 ], [ %58, %54 ], [ 128, %52 ]
%61 = select i1 %2, i32 127, i32 255
%62 = and i32 %60, %61
ret i32 %62
}