expand_nlist(expanded_list, nlp) short *expanded_list, *nlp;
{
  short left, right, step;
  while (*nlp)
    if (*nlp > 010000)
      *expanded_list++ = *nlp++ - 010000;
    else {
      left = *nlp++;
      right = *nlp++;
      step = *nlp++;
      for (; left < right; left += step)
        *expanded_list++ = left;
      *expanded_list++ = right;
    }
  *expanded_list = (short)0;
}


x86 assembly (clang, -O0):
<expand_nlist>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x18(%rbp),%rax
cmpw   $0x0,(%rax)
je     11f3 <expand_nlist+0xf3>
mov    -0x18(%rbp),%rax
movswl (%rax),%eax
cmp    $0x1000,%eax
jle    115d <expand_nlist+0x5d>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x18(%rbp)
movswl (%rax),%eax
sub    $0x1000,%eax
mov    %ax,%cx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cx,(%rax)
jmp    11ee <expand_nlist+0xee>
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%ax
mov    %ax,-0x1a(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%ax
mov    %ax,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x18(%rbp)
mov    (%rax),%ax
mov    %ax,-0x1e(%rbp)
movswl -0x1a(%rbp),%eax
movswl -0x1c(%rbp),%ecx
cmp    %ecx,%eax
jge    11d8 <expand_nlist+0xd8>
mov    -0x1a(%rbp),%cx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cx,(%rax)
movswl -0x1e(%rbp),%ecx
movswl -0x1a(%rbp),%eax
add    %ecx,%eax
mov    %ax,-0x1a(%rbp)
jmp    119f <expand_nlist+0x9f>
mov    -0x1c(%rbp),%cx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cx,(%rax)
jmp    110c <expand_nlist+0xc>
mov    -0x10(%rbp),%rax
movw   $0x0,(%rax)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<expand_nlist>:
jmp    1120 <expand_nlist+0x20>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    $0x2,%rsi
add    $0xfffff000,%eax
mov    %ax,(%rdi)
add    $0x2,%rdi
movzwl (%rsi),%eax
test   %ax,%ax
je     115b <expand_nlist+0x5b>
movswl %ax,%ecx
cmp    $0x1001,%ecx
jge    1110 <expand_nlist+0x10>
movzwl 0x2(%rsi),%ecx
cmp    %cx,%ax
jge    114e <expand_nlist+0x4e>
movzwl 0x4(%rsi),%edx
mov    %ax,(%rdi)
add    $0x2,%rdi
add    %edx,%eax
cmp    %cx,%ax
jl     1140 <expand_nlist+0x40>
add    $0x6,%rsi
mov    %cx,(%rdi)
add    $0x2,%rdi
jmp    1120 <expand_nlist+0x20>
movw   $0x0,(%rdi)
ret

LLVM IR (-O0):
define i32 @expand_nlist(i16* %0, i16* %1) {
%3 = alloca i32
%4 = alloca i16*
%5 = alloca i16*
%6 = alloca i16
%7 = alloca i16
%8 = alloca i16
store i16* %0, i16** %4
store i16* %1, i16** %5
br label %9
9: ; preds = %58, %2
%10 = load i16*, i16** %5
%11 = load i16, i16* %10
%12 = icmp ne i16 %11, 0
br i1 %12, label %13, label %59
13: ; preds = %9
%14 = load i16*, i16** %5
%15 = load i16, i16* %14
%16 = sext i16 %15 to i32
%17 = icmp sgt i32 %16, 4096
br i1 %17, label %18, label %27
18: ; preds = %13
%19 = load i16*, i16** %5
%20 = getelementptr inbounds i16, i16* %19, i32 1
store i16* %20, i16** %5
%21 = load i16, i16* %19
%22 = sext i16 %21 to i32
%23 = sub nsw i32 %22, 4096
%24 = trunc i32 %23 to i16
%25 = load i16*, i16** %4
%26 = getelementptr inbounds i16, i16* %25, i32 1
store i16* %26, i16** %4
store i16 %24, i16* %25
br label %58
27: ; preds = %13
%28 = load i16*, i16** %5
%29 = getelementptr inbounds i16, i16* %28, i32 1
store i16* %29, i16** %5
%30 = load i16, i16* %28
store i16 %30, i16* %6
%31 = load i16*, i16** %5
%32 = getelementptr inbounds i16, i16* %31, i32 1
store i16* %32, i16** %5
%33 = load i16, i16* %31
store i16 %33, i16* %7
%34 = load i16*, i16** %5
%35 = getelementptr inbounds i16, i16* %34, i32 1
store i16* %35, i16** %5
%36 = load i16, i16* %34
store i16 %36, i16* %8
br label %37
37: ; preds = %47, %27
%38 = load i16, i16* %6
%39 = sext i16 %38 to i32
%40 = load i16, i16* %7
%41 = sext i16 %40 to i32
%42 = icmp slt i32 %39, %41
br i1 %42, label %43, label %54
43: ; preds = %37
%44 = load i16, i16* %6
%45 = load i16*, i16** %4
%46 = getelementptr inbounds i16, i16* %45, i32 1
store i16* %46, i16** %4
store i16 %44, i16* %45
br label %47
47: ; preds = %43
%48 = load i16, i16* %8
%49 = sext i16 %48 to i32
%50 = load i16, i16* %6
%51 = sext i16 %50 to i32
%52 = add nsw i32 %51, %49
%53 = trunc i32 %52 to i16
store i16 %53, i16* %6
br label %37
54: ; preds = %37
%55 = load i16, i16* %7
%56 = load i16*, i16** %4
%57 = getelementptr inbounds i16, i16* %56, i32 1
store i16* %57, i16** %4
store i16 %55, i16* %56
br label %58
58: ; preds = %54, %18
br label %9
59: ; preds = %9
%60 = load i16*, i16** %4
store i16 0, i16* %60
%61 = load i32, i32* %3
ret i32 %61
}

LLVM IR (-O2):
define i32 @expand_nlist(i16* nocapture writeonly %0, i16* nocapture %1) {
%3 = load i16, i16* %1
%4 = icmp eq i16 %3, 0
br i1 %4, label %33, label %5
5: ; preds = %2, %27
%6 = phi i16 [ %31, %27 ], [ %3, %2 ]
%7 = phi i16* [ %30, %27 ], [ %0, %2 ]
%8 = phi i16* [ %28, %27 ], [ %1, %2 ]
%9 = icmp sgt i16 %6, 4096
%10 = getelementptr inbounds i16, i16* %8, i64 1
br i1 %9, label %11, label %13
11: ; preds = %5
%12 = add nsw i16 %6, -4096
store i16 %12, i16* %7
br label %27
13: ; preds = %5
%14 = getelementptr inbounds i16, i16* %8, i64 2
%15 = load i16, i16* %10
%16 = getelementptr inbounds i16, i16* %8, i64 3
%17 = load i16, i16* %14
%18 = icmp slt i16 %6, %15
br i1 %18, label %19, label %25
19: ; preds = %13, %19
%20 = phi i16* [ %22, %19 ], [ %7, %13 ]
%21 = phi i16 [ %23, %19 ], [ %6, %13 ]
%22 = getelementptr inbounds i16, i16* %20, i64 1
store i16 %21, i16* %20
%23 = add i16 %21, %17
%24 = icmp slt i16 %23, %15
br i1 %24, label %19, label %25
25: ; preds = %19, %13
%26 = phi i16* [ %7, %13 ], [ %22, %19 ]
store i16 %15, i16* %26
br label %27
27: ; preds = %25, %11
%28 = phi i16* [ %10, %11 ], [ %16, %25 ]
%29 = phi i16* [ %7, %11 ], [ %26, %25 ]
%30 = getelementptr inbounds i16, i16* %29, i64 1
%31 = load i16, i16* %28
%32 = icmp eq i16 %31, 0
br i1 %32, label %33, label %5
33: ; preds = %27, %2
%34 = phi i16* [ %0, %2 ], [ %30, %27 ]
store i16 0, i16* %34
ret i32 undef
}