void alaw_expand(lseg, logbuf, linbuf) long lseg;
short *linbuf;
short *logbuf;
{
  short ix, mant, iexp;
  long n;
  for (n = 0; n < lseg; n++) {
    ix = logbuf[n] ^ (0x0055);
    ix &= (0x007F);
    iexp = ix >> 4;
    mant = ix & (0x000F);
    if (iexp > 0)
      mant = mant + 16;
    mant = (mant << 4) + (0x0008);
    if (iexp > 1)
      mant = mant << (iexp - 1);
    linbuf[n] = logbuf[n] > 127 ? mant : -mant;
  }
}


x86 assembly (clang, -O0):
<alaw_expand>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x8(%rbp),%rax
jge    11ed <alaw_expand+0xed>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
xor    $0x55,%eax
mov    %ax,-0x1a(%rbp)
movswl -0x1a(%rbp),%eax
and    $0x7f,%eax
mov    %ax,-0x1a(%rbp)
movswl -0x1a(%rbp),%eax
sar    $0x4,%eax
mov    %ax,-0x1e(%rbp)
movswl -0x1a(%rbp),%eax
and    $0xf,%eax
mov    %ax,-0x1c(%rbp)
movswl -0x1e(%rbp),%eax
cmp    $0x0,%eax
jle    1172 <alaw_expand+0x72>
movswl -0x1c(%rbp),%eax
add    $0x10,%eax
mov    %ax,-0x1c(%rbp)
movswl -0x1c(%rbp),%eax
shl    $0x4,%eax
add    $0x8,%eax
mov    %ax,-0x1c(%rbp)
movswl -0x1e(%rbp),%eax
cmp    $0x1,%eax
jle    119e <alaw_expand+0x9e>
movswl -0x1c(%rbp),%eax
movswl -0x1e(%rbp),%ecx
sub    $0x1,%ecx
shl    %cl,%eax
mov    %ax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    $0x7f,%eax
jle    11bf <alaw_expand+0xbf>
movswl -0x1c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    11ca <alaw_expand+0xca>
movswl -0x1c(%rbp),%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %ax,%dx
mov    -0x18(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1118 <alaw_expand+0x18>
pop    %rbp
ret

x86 assembly (clang, -O2):
<alaw_expand>:
push   %rbx
test   %rdi,%rdi
jle    130c <alaw_expand+0x20c>
cmp    $0x8,%rdi
jae    1118 <alaw_expand+0x18>
xor    %r8d,%r8d
jmp    12b0 <alaw_expand+0x1b0>
lea    (%rsi,%rdi,2),%rax
cmp    %rdx,%rax
jbe    1132 <alaw_expand+0x32>
lea    (%rdx,%rdi,2),%rax
cmp    %rsi,%rax
jbe    1132 <alaw_expand+0x32>
xor    %r8d,%r8d
jmp    12b0 <alaw_expand+0x1b0>
mov    %rdi,%r8
and    $0xfffffffffffffff8,%r8
xor    %ecx,%ecx
movdqa 0xebc(%rip),%xmm14
movdqa 0xed3(%rip),%xmm10
movdqa 0xeea(%rip),%xmm11
movdqa 0xef1(%rip),%xmm12
movdqa 0xef8(%rip),%xmm13
pxor   %xmm15,%xmm15
pcmpeqd %xmm9,%xmm9
movdqa 0xef6(%rip),%xmm3
nopw   0x0(%rax,%rax,1)
movdqu (%rsi,%rcx,2),%xmm7
movdqa %xmm7,%xmm6
pand   %xmm14,%xmm6
pxor   0xe7a(%rip),%xmm6
movdqa %xmm6,%xmm2
psrlw  $0x4,%xmm2
movdqa %xmm2,%xmm0
punpcklwd %xmm0,%xmm0
punpckhwd %xmm2,%xmm2
movdqa %xmm10,%xmm5
pcmpgtw %xmm6,%xmm5
movdqa %xmm6,%xmm4
psllw  $0x4,%xmm4
pand   0xe6b(%rip),%xmm4
movdqa %xmm4,%xmm8
por    %xmm11,%xmm8
pand   %xmm5,%xmm4
pandn  %xmm8,%xmm5
por    %xmm4,%xmm5
por    %xmm12,%xmm5
movdqa %xmm5,%xmm4
punpcklwd %xmm15,%xmm4
paddd  %xmm9,%xmm0
pslld  $0x17,%xmm0
paddd  %xmm3,%xmm0
cvttps2dq %xmm0,%xmm0
pshufd $0xf5,%xmm4,%xmm1
pmuludq %xmm0,%xmm4
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm1,%xmm0
movdqa %xmm5,%xmm1
punpckhwd %xmm15,%xmm1
paddd  %xmm9,%xmm2
pshufd $0xe8,%xmm4,%xmm4
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm4
pslld  $0x17,%xmm2
paddd  %xmm3,%xmm2
cvttps2dq %xmm2,%xmm0
pshufd $0xf5,%xmm1,%xmm2
pmuludq %xmm0,%xmm1
pshufd $0xf5,%xmm0,%xmm0
pmuludq %xmm2,%xmm0
pshufd $0xe8,%xmm1,%xmm1
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm1
pslld  $0x10,%xmm1
psrad  $0x10,%xmm1
pslld  $0x10,%xmm4
psrad  $0x10,%xmm4
packssdw %xmm1,%xmm4
pcmpgtw %xmm13,%xmm6
pand   %xmm6,%xmm4
pandn  %xmm5,%xmm6
por    %xmm4,%xmm6
pcmpgtw %xmm14,%xmm7
pxor   %xmm7,%xmm6
psubw  %xmm6,%xmm7
movdqu %xmm7,(%rdx,%rcx,2)
add    $0x8,%rcx
cmp    %rcx,%r8
jne    1180 <alaw_expand+0x80>
cmp    %rdi,%r8
je     130c <alaw_expand+0x20c>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movzwl (%rsi,%r8,2),%r9d
mov    %r9d,%r10d
and    $0x7f,%r10d
xor    $0x55,%r10d
mov    %r10d,%ecx
shr    $0x4,%ecx
mov    %r10d,%eax
shl    $0x4,%eax
movzbl %al,%r11d
lea    0x100(%r11),%ebx
cmp    $0x10,%r10w
cmovb  %r11d,%ebx
or     $0x8,%ebx
add    $0xff,%cl
mov    %ebx,%eax
shl    %cl,%eax
cmp    $0x20,%r10w
cmovb  %ebx,%eax
mov    %eax,%ecx
neg    %ecx
cmp    $0x7f,%r9w
cmovg  %eax,%ecx
mov    %cx,(%rdx,%r8,2)
add    $0x1,%r8
cmp    %r8,%rdi
jne    12b0 <alaw_expand+0x1b0>
pop    %rbx
ret

LLVM IR (-O0):
define void @alaw_expand(i64 %0, i16* %1, i16* %2) {
%4 = alloca i64
%5 = alloca i16*
%6 = alloca i16*
%7 = alloca i16
%8 = alloca i16
%9 = alloca i16
%10 = alloca i64
store i64 %0, i64* %4
store i16* %1, i16** %5
store i16* %2, i16** %6
store i64 0, i64* %10
br label %11
11: ; preds = %80, %3
%12 = load i64, i64* %10
%13 = load i64, i64* %4
%14 = icmp slt i64 %12, %13
br i1 %14, label %15, label %83
15: ; preds = %11
%16 = load i16*, i16** %5
%17 = load i64, i64* %10
%18 = getelementptr inbounds i16, i16* %16, i64 %17
%19 = load i16, i16* %18
%20 = sext i16 %19 to i32
%21 = xor i32 %20, 85
%22 = trunc i32 %21 to i16
store i16 %22, i16* %7
%23 = load i16, i16* %7
%24 = sext i16 %23 to i32
%25 = and i32 %24, 127
%26 = trunc i32 %25 to i16
store i16 %26, i16* %7
%27 = load i16, i16* %7
%28 = sext i16 %27 to i32
%29 = ashr i32 %28, 4
%30 = trunc i32 %29 to i16
store i16 %30, i16* %9
%31 = load i16, i16* %7
%32 = sext i16 %31 to i32
%33 = and i32 %32, 15
%34 = trunc i32 %33 to i16
store i16 %34, i16* %8
%35 = load i16, i16* %9
%36 = sext i16 %35 to i32
%37 = icmp sgt i32 %36, 0
br i1 %37, label %38, label %43
38: ; preds = %15
%39 = load i16, i16* %8
%40 = sext i16 %39 to i32
%41 = add nsw i32 %40, 16
%42 = trunc i32 %41 to i16
store i16 %42, i16* %8
br label %43
43: ; preds = %38, %15
%44 = load i16, i16* %8
%45 = sext i16 %44 to i32
%46 = shl i32 %45, 4
%47 = add nsw i32 %46, 8
%48 = trunc i32 %47 to i16
store i16 %48, i16* %8
%49 = load i16, i16* %9
%50 = sext i16 %49 to i32
%51 = icmp sgt i32 %50, 1
br i1 %51, label %52, label %60
52: ; preds = %43
%53 = load i16, i16* %8
%54 = sext i16 %53 to i32
%55 = load i16, i16* %9
%56 = sext i16 %55 to i32
%57 = sub nsw i32 %56, 1
%58 = shl i32 %54, %57
%59 = trunc i32 %58 to i16
store i16 %59, i16* %8
br label %60
60: ; preds = %52, %43
%61 = load i16*, i16** %5
%62 = load i64, i64* %10
%63 = getelementptr inbounds i16, i16* %61, i64 %62
%64 = load i16, i16* %63
%65 = sext i16 %64 to i32
%66 = icmp sgt i32 %65, 127
br i1 %66, label %67, label %70
67: ; preds = %60
%68 = load i16, i16* %8
%69 = sext i16 %68 to i32
br label %74
70: ; preds = %60
%71 = load i16, i16* %8
%72 = sext i16 %71 to i32
%73 = sub nsw i32 0, %72
br label %74
74: ; preds = %70, %67
%75 = phi i32 [ %69, %67 ], [ %73, %70 ]
%76 = trunc i32 %75 to i16
%77 = load i16*, i16** %6
%78 = load i64, i64* %10
%79 = getelementptr inbounds i16, i16* %77, i64 %78
store i16 %76, i16* %79
br label %80
80: ; preds = %74
%81 = load i64, i64* %10
%82 = add nsw i64 %81, 1
store i64 %82, i64* %10
br label %11
83: ; preds = %11
ret void
}

LLVM IR (-O2):
define void @alaw_expand(i64 %0, i16* nocapture %1, i16* nocapture writeonly %2) {
%4 = icmp sgt i64 %0, 0
br i1 %4, label %5, label %73
5: ; preds = %3
%6 = icmp ult i64 %0, 8
br i1 %6, label %45, label %7
7: ; preds = %5
%8 = getelementptr i16, i16* %2, i64 %0
%9 = getelementptr i16, i16* %1, i64 %0
%10 = icmp ugt i16* %9, %2
%11 = icmp ugt i16* %8, %1
%12 = and i1 %10, %11
br i1 %12, label %45, label %13
13: ; preds = %7
%14 = and i64 %0, -8
br label %15
15: ; preds = %15, %13
%16 = phi i64 [ 0, %13 ], [ %41, %15 ]
%17 = getelementptr inbounds i16, i16* %1, i64 %16
%18 = bitcast i16* %17 to <8 x i16>*
%19 = load <8 x i16>, <8 x i16>* %18
%20 = and <8 x i16> %19, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
%21 = xor <8 x i16> %20, <i16 85, i16 85, i16 85, i16 85, i16 85, i16 85, i16 85, i16 85>
%22 = lshr <8 x i16> %21, <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4>
%23 = zext <8 x i16> %22 to <8 x i32>
%24 = icmp ult <8 x i16> %21, <i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16, i16 16>
%25 = shl nuw nsw <8 x i16> %21, <i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4, i16 4>
%26 = and <8 x i16> %25, <i16 240, i16 240, i16 240, i16 240, i16 240, i16 240, i16 240, i16 240>
%27 = or <8 x i16> %26, <i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256, i16 256>
%28 = select <8 x i1> %24, <8 x i16> %26, <8 x i16> %27
%29 = or <8 x i16> %28, <i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8, i16 8>
%30 = icmp ugt <8 x i16> %21, <i16 31, i16 31, i16 31, i16 31, i16 31, i16 31, i16 31, i16 31>
%31 = zext <8 x i16> %29 to <8 x i32>
%32 = add nsw <8 x i32> %23, <i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1, i32 -1>
%33 = shl <8 x i32> %31, %32
%34 = trunc <8 x i32> %33 to <8 x i16>
%35 = select <8 x i1> %30, <8 x i16> %34, <8 x i16> %29
%36 = icmp sgt <8 x i16> %19, <i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127, i16 127>
%37 = sub <8 x i16> zeroinitializer, %35
%38 = select <8 x i1> %36, <8 x i16> %35, <8 x i16> %37
%39 = getelementptr inbounds i16, i16* %2, i64 %16
%40 = bitcast i16* %39 to <8 x i16>*
store <8 x i16> %38, <8 x i16>* %40
%41 = add nuw i64 %16, 8
%42 = icmp eq i64 %41, %14
br i1 %42, label %43, label %15
43: ; preds = %15
%44 = icmp eq i64 %14, %0
br i1 %44, label %73, label %45
45: ; preds = %7, %5, %43
%46 = phi i64 [ 0, %7 ], [ 0, %5 ], [ %14, %43 ]
br label %47
47: ; preds = %45, %47
%48 = phi i64 [ %71, %47 ], [ %46, %45 ]
%49 = getelementptr inbounds i16, i16* %1, i64 %48
%50 = load i16, i16* %49
%51 = and i16 %50, 127
%52 = xor i16 %51, 85
%53 = lshr i16 %52, 4
%54 = zext i16 %53 to i32
%55 = icmp ult i16 %52, 16
%56 = shl nuw nsw i16 %52, 4
%57 = and i16 %56, 240
%58 = or i16 %57, 256
%59 = select i1 %55, i16 %57, i16 %58
%60 = or i16 %59, 8
%61 = icmp ugt i16 %52, 31
%62 = zext i16 %60 to i32
%63 = add nsw i32 %54, -1
%64 = shl i32 %62, %63
%65 = trunc i32 %64 to i16
%66 = select i1 %61, i16 %65, i16 %60
%67 = icmp sgt i16 %50, 127
%68 = sub i16 0, %66
%69 = select i1 %67, i16 %66, i16 %68
%70 = getelementptr inbounds i16, i16* %2, i64 %48
store i16 %69, i16* %70
%71 = add nuw nsw i64 %48, 1
%72 = icmp eq i64 %71, %0
br i1 %72, label %73, label %47
73: ; preds = %47, %43, %3
ret void
}