copy_nlist(tp, sp, ubnd) short *tp, *sp;
int ubnd;
{
  while (*sp)
    if (*sp > 010000) {
      *tp++ = (((ubnd + 010000) < (*sp)) ? (ubnd + 010000) : (*sp));
      ++sp;
    } else {
      *tp++ = (((ubnd) < (*sp)) ? (ubnd) : (*sp));
      ++sp;
      *tp++ = (((ubnd) < (*sp)) ? (ubnd) : (*sp));
      ++sp;
      *tp++ = (((ubnd) < (*sp)) ? (ubnd) : (*sp));
      ++sp;
    }
  *tp = (short)0;
}


x86 assembly (clang, -O0):
<copy_nlist>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
mov    -0x18(%rbp),%rax
cmpw   $0x0,(%rax)
je     126f <copy_nlist+0x16f>
mov    -0x18(%rbp),%rax
movswl (%rax),%eax
cmp    $0x1000,%eax
jle    1189 <copy_nlist+0x89>
mov    -0x1c(%rbp),%eax
add    $0x1000,%eax
mov    -0x18(%rbp),%rcx
movswl (%rcx),%ecx
cmp    %ecx,%eax
jge    1156 <copy_nlist+0x56>
mov    -0x1c(%rbp),%eax
add    $0x1000,%eax
mov    %eax,-0x20(%rbp)
jmp    1160 <copy_nlist+0x60>
mov    -0x18(%rbp),%rax
movswl (%rax),%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %ax,%cx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cx,(%rax)
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
jmp    126a <copy_nlist+0x16a>
mov    -0x1c(%rbp),%eax
mov    -0x18(%rbp),%rcx
movswl (%rcx),%ecx
cmp    %ecx,%eax
jge    11a6 <copy_nlist+0xa6>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x24(%rbp)
jmp    11b0 <copy_nlist+0xb0>
mov    -0x18(%rbp),%rax
movswl (%rax),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    %ax,%cx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cx,(%rax)
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0x18(%rbp),%rcx
movswl (%rcx),%ecx
cmp    %ecx,%eax
jge    11f1 <copy_nlist+0xf1>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x28(%rbp)
jmp    11fb <copy_nlist+0xfb>
mov    -0x18(%rbp),%rax
movswl (%rax),%eax
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%eax
mov    %ax,%cx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cx,(%rax)
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
mov    -0x1c(%rbp),%eax
mov    -0x18(%rbp),%rcx
movswl (%rcx),%ecx
cmp    %ecx,%eax
jge    123c <copy_nlist+0x13c>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    1246 <copy_nlist+0x146>
mov    -0x18(%rbp),%rax
movswl (%rax),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %ax,%cx
mov    -0x10(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x10(%rbp)
mov    %cx,(%rax)
mov    -0x18(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x18(%rbp)
jmp    110f <copy_nlist+0xf>
mov    -0x10(%rbp),%rax
movw   $0x0,(%rax)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<copy_nlist>:
movzwl (%rsi),%ecx
test   %cx,%cx
je     1178 <copy_nlist+0x78>
lea    0x1000(%rdx),%r8d
jmp    115c <copy_nlist+0x5c>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
cmp    %edx,%ecx
cmovg  %edx,%ecx
mov    %cx,(%rdi)
movswl 0x2(%rsi),%eax
cmp    %edx,%eax
cmovg  %edx,%eax
lea    0x4(%rdi),%r9
mov    %ax,0x2(%rdi)
movswl 0x4(%rsi),%ecx
cmp    %edx,%ecx
cmovg  %edx,%ecx
mov    $0x3,%eax
lea    (%rdi,%rax,2),%rdi
mov    %cx,(%r9)
movzwl (%rsi,%rax,2),%ecx
lea    (%rsi,%rax,2),%rsi
test   %cx,%cx
je     1178 <copy_nlist+0x78>
movswl %cx,%ecx
cmp    $0x1001,%ecx
jl     1120 <copy_nlist+0x20>
cmp    %ecx,%r8d
cmovl  %r8d,%ecx
mov    $0x1,%eax
mov    %rdi,%r9
jmp    1147 <copy_nlist+0x47>
movw   $0x0,(%rdi)
ret

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

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