void pixel_pack_portable_s16u8_y(short int *src, unsigned char *dst,
                                 unsigned int nbpixels) {
  unsigned int i;
  for (i = 0; i < nbpixels; i++)
    dst[i] = (unsigned char)((
        ((src[i] >> 7) < 0) ? 0 : ((src[i] >> 7 > 255) ? 255 : (src[i] >> 7))));
}


x86 assembly (clang, -O0):
<pixel_pack_portable_s16u8_y>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%eax
cmp    -0x14(%rbp),%eax
jae    119d <pixel_pack_portable_s16u8_y+0x9d>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
movswl (%rax,%rcx,2),%eax
sar    $0x7,%eax
cmp    $0x0,%eax
jge    1143 <pixel_pack_portable_s16u8_y+0x43>
xor    %eax,%eax
mov    %eax,-0x1c(%rbp)
jmp    1180 <pixel_pack_portable_s16u8_y+0x80>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
movswl (%rax,%rcx,2),%eax
sar    $0x7,%eax
cmp    $0xff,%eax
jle    1169 <pixel_pack_portable_s16u8_y+0x69>
mov    $0xff,%eax
mov    %eax,-0x20(%rbp)
jmp    117a <pixel_pack_portable_s16u8_y+0x7a>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
movswl (%rax,%rcx,2),%eax
sar    $0x7,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %al,%dl
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%ecx
mov    %dl,(%rax,%rcx,1)
mov    -0x18(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x18(%rbp)
jmp    1116 <pixel_pack_portable_s16u8_y+0x16>
pop    %rbp
ret

x86 assembly (clang, -O2):
<pixel_pack_portable_s16u8_y>:
test   %edx,%edx
je     12e1 <pixel_pack_portable_s16u8_y+0x1e1>
mov    %edx,%r9d
cmp    $0x10,%edx
jb     1122 <pixel_pack_portable_s16u8_y+0x22>
lea    (%rdi,%r9,2),%rax
cmp    %rsi,%rax
jbe    1196 <pixel_pack_portable_s16u8_y+0x96>
lea    (%rsi,%r9,1),%rax
cmp    %rdi,%rax
jbe    1196 <pixel_pack_portable_s16u8_y+0x96>
xor    %ecx,%ecx
mov    %rcx,%rax
not    %rax
test   $0x1,%r9b
je     114e <pixel_pack_portable_s16u8_y+0x4e>
movzwl (%rdi,%rcx,2),%r8d
mov    %r8d,%edx
shr    $0x7,%edx
xor    %r10d,%r10d
test   %r8w,%r8w
cmovns %edx,%r10d
mov    %r10b,(%rsi,%rcx,1)
or     $0x1,%rcx
add    %r9,%rax
je     12e1 <pixel_pack_portable_s16u8_y+0x1e1>
xor    %r8d,%r8d
nopw   0x0(%rax,%rax,1)
movzwl (%rdi,%rcx,2),%eax
mov    %eax,%edx
shr    $0x7,%edx
test   %ax,%ax
cmovs  %r8d,%edx
mov    %dl,(%rsi,%rcx,1)
movzwl 0x2(%rdi,%rcx,2),%eax
mov    %eax,%edx
shr    $0x7,%edx
test   %ax,%ax
cmovs  %r8d,%edx
mov    %dl,0x1(%rsi,%rcx,1)
add    $0x2,%rcx
cmp    %rcx,%r9
jne    1160 <pixel_pack_portable_s16u8_y+0x60>
jmp    12e1 <pixel_pack_portable_s16u8_y+0x1e1>
mov    %r9d,%ecx
and    $0xfffffff0,%ecx
lea    -0x10(%rcx),%rax
mov    %rax,%r8
shr    $0x4,%r8
add    $0x1,%r8
test   %rax,%rax
je     12e2 <pixel_pack_portable_s16u8_y+0x1e2>
mov    %r8,%rax
and    $0xfffffffffffffffe,%rax
xor    %edx,%edx
movdqa 0xe3b(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nop
movdqu (%rdi,%rdx,2),%xmm1
movdqu 0x10(%rdi,%rdx,2),%xmm2
pxor   %xmm3,%xmm3
pcmpgtw %xmm1,%xmm3
psrlw  $0x7,%xmm1
pxor   %xmm4,%xmm4
pcmpgtw %xmm2,%xmm4
psrlw  $0x7,%xmm2
pand   %xmm0,%xmm1
packuswb %xmm1,%xmm1
pand   %xmm0,%xmm2
packuswb %xmm2,%xmm2
packsswb %xmm3,%xmm3
pandn  %xmm1,%xmm3
packsswb %xmm4,%xmm4
pandn  %xmm2,%xmm4
punpcklqdq %xmm4,%xmm3
movdqu %xmm3,(%rsi,%rdx,1)
movdqu 0x20(%rdi,%rdx,2),%xmm1
movdqu 0x30(%rdi,%rdx,2),%xmm2
pxor   %xmm3,%xmm3
pcmpgtw %xmm1,%xmm3
psrlw  $0x7,%xmm1
pxor   %xmm4,%xmm4
pcmpgtw %xmm2,%xmm4
psrlw  $0x7,%xmm2
pand   %xmm0,%xmm1
packuswb %xmm1,%xmm1
pand   %xmm0,%xmm2
packuswb %xmm2,%xmm2
packsswb %xmm3,%xmm3
pandn  %xmm1,%xmm3
packsswb %xmm4,%xmm4
pandn  %xmm2,%xmm4
punpcklqdq %xmm4,%xmm3
movdqu %xmm3,0x10(%rsi,%rdx,1)
add    $0x20,%rdx
add    $0xfffffffffffffffe,%rax
jne    11d0 <pixel_pack_portable_s16u8_y+0xd0>
test   $0x1,%r8b
je     12d8 <pixel_pack_portable_s16u8_y+0x1d8>
movdqu (%rdi,%rdx,2),%xmm0
movdqu 0x10(%rdi,%rdx,2),%xmm1
pxor   %xmm2,%xmm2
pcmpgtw %xmm0,%xmm2
psrlw  $0x7,%xmm0
pxor   %xmm3,%xmm3
pcmpgtw %xmm1,%xmm3
psrlw  $0x7,%xmm1
movdqa 0xd51(%rip),%xmm4
pand   %xmm4,%xmm0
packuswb %xmm0,%xmm0
pand   %xmm4,%xmm1
packuswb %xmm1,%xmm1
packsswb %xmm2,%xmm2
pandn  %xmm0,%xmm2
packsswb %xmm3,%xmm3
pandn  %xmm1,%xmm3
punpcklqdq %xmm3,%xmm2
movdqu %xmm2,(%rsi,%rdx,1)
cmp    %r9,%rcx
jne    1124 <pixel_pack_portable_s16u8_y+0x24>
ret
xor    %edx,%edx
test   $0x1,%r8b
jne    1282 <pixel_pack_portable_s16u8_y+0x182>
jmp    12d8 <pixel_pack_portable_s16u8_y+0x1d8>

LLVM IR (-O0):
define void @pixel_pack_portable_s16u8_y(i16* %0, i8* %1, i32 %2) {
%4 = alloca i16*
%5 = alloca i8*
%6 = alloca i32
%7 = alloca i32
store i16* %0, i16** %4
store i8* %1, i8** %5
store i32 %2, i32* %6
store i32 0, i32* %7
br label %8
8: ; preds = %49, %3
%9 = load i32, i32* %7
%10 = load i32, i32* %6
%11 = icmp ult i32 %9, %10
br i1 %11, label %12, label %52
12: ; preds = %8
%13 = load i16*, i16** %4
%14 = load i32, i32* %7
%15 = zext i32 %14 to i64
%16 = getelementptr inbounds i16, i16* %13, i64 %15
%17 = load i16, i16* %16
%18 = sext i16 %17 to i32
%19 = ashr i32 %18, 7
%20 = icmp slt i32 %19, 0
br i1 %20, label %21, label %22
21: ; preds = %12
br label %42
22: ; preds = %12
%23 = load i16*, i16** %4
%24 = load i32, i32* %7
%25 = zext i32 %24 to i64
%26 = getelementptr inbounds i16, i16* %23, i64 %25
%27 = load i16, i16* %26
%28 = sext i16 %27 to i32
%29 = ashr i32 %28, 7
%30 = icmp sgt i32 %29, 255
br i1 %30, label %31, label %32
31: ; preds = %22
br label %40
32: ; preds = %22
%33 = load i16*, i16** %4
%34 = load i32, i32* %7
%35 = zext i32 %34 to i64
%36 = getelementptr inbounds i16, i16* %33, i64 %35
%37 = load i16, i16* %36
%38 = sext i16 %37 to i32
%39 = ashr i32 %38, 7
br label %40
40: ; preds = %32, %31
%41 = phi i32 [ 255, %31 ], [ %39, %32 ]
br label %42
42: ; preds = %40, %21
%43 = phi i32 [ 0, %21 ], [ %41, %40 ]
%44 = trunc i32 %43 to i8
%45 = load i8*, i8** %5
%46 = load i32, i32* %7
%47 = zext i32 %46 to i64
%48 = getelementptr inbounds i8, i8* %45, i64 %47
store i8 %44, i8* %48
br label %49
49: ; preds = %42
%50 = load i32, i32* %7
%51 = add i32 %50, 1
store i32 %51, i32* %7
br label %8
52: ; preds = %8
ret void
}

LLVM IR (-O2):
define void @pixel_pack_portable_s16u8_y(i16* nocapture %0, i8* nocapture writeonly %1, i32 %2) {
%4 = bitcast i16* %0 to i8*
%5 = icmp eq i32 %2, 0
br i1 %5, label %129, label %6
6: ; preds = %3
%7 = zext i32 %2 to i64
%8 = icmp ult i32 %2, 16
br i1 %8, label %92, label %9
9: ; preds = %6
%10 = getelementptr i8, i8* %1, i64 %7
%11 = getelementptr i16, i16* %0, i64 %7
%12 = bitcast i16* %11 to i8*
%13 = icmp ugt i8* %12, %1
%14 = icmp ugt i8* %10, %4
%15 = and i1 %13, %14
br i1 %15, label %92, label %16
16: ; preds = %9
%17 = and i64 %7, 4294967280
%18 = add nsw i64 %17, -16
%19 = lshr exact i64 %18, 4
%20 = add nuw nsw i64 %19, 1
%21 = and i64 %20, 1
%22 = icmp eq i64 %18, 0
br i1 %22, label %68, label %23
23: ; preds = %16
%24 = and i64 %20, 2305843009213693950
br label %25
25: ; preds = %25, %23
%26 = phi i64 [ 0, %23 ], [ %65, %25 ]
%27 = phi i64 [ 0, %23 ], [ %66, %25 ]
%28 = getelementptr inbounds i16, i16* %0, i64 %26
%29 = bitcast i16* %28 to <8 x i16>*
%30 = load <8 x i16>, <8 x i16>* %29
%31 = getelementptr inbounds i16, i16* %28, i64 8
%32 = bitcast i16* %31 to <8 x i16>*
%33 = load <8 x i16>, <8 x i16>* %32
%34 = lshr <8 x i16> %30, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
%35 = lshr <8 x i16> %33, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
%36 = trunc <8 x i16> %34 to <8 x i8>
%37 = trunc <8 x i16> %35 to <8 x i8>
%38 = icmp slt <8 x i16> %30, zeroinitializer
%39 = icmp slt <8 x i16> %33, zeroinitializer
%40 = select <8 x i1> %38, <8 x i8> zeroinitializer, <8 x i8> %36
%41 = select <8 x i1> %39, <8 x i8> zeroinitializer, <8 x i8> %37
%42 = getelementptr inbounds i8, i8* %1, i64 %26
%43 = bitcast i8* %42 to <8 x i8>*
store <8 x i8> %40, <8 x i8>* %43
%44 = getelementptr inbounds i8, i8* %42, i64 8
%45 = bitcast i8* %44 to <8 x i8>*
store <8 x i8> %41, <8 x i8>* %45
%46 = or i64 %26, 16
%47 = getelementptr inbounds i16, i16* %0, i64 %46
%48 = bitcast i16* %47 to <8 x i16>*
%49 = load <8 x i16>, <8 x i16>* %48
%50 = getelementptr inbounds i16, i16* %47, i64 8
%51 = bitcast i16* %50 to <8 x i16>*
%52 = load <8 x i16>, <8 x i16>* %51
%53 = lshr <8 x i16> %49, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
%54 = lshr <8 x i16> %52, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
%55 = trunc <8 x i16> %53 to <8 x i8>
%56 = trunc <8 x i16> %54 to <8 x i8>
%57 = icmp slt <8 x i16> %49, zeroinitializer
%58 = icmp slt <8 x i16> %52, zeroinitializer
%59 = select <8 x i1> %57, <8 x i8> zeroinitializer, <8 x i8> %55
%60 = select <8 x i1> %58, <8 x i8> zeroinitializer, <8 x i8> %56
%61 = getelementptr inbounds i8, i8* %1, i64 %46
%62 = bitcast i8* %61 to <8 x i8>*
store <8 x i8> %59, <8 x i8>* %62
%63 = getelementptr inbounds i8, i8* %61, i64 8
%64 = bitcast i8* %63 to <8 x i8>*
store <8 x i8> %60, <8 x i8>* %64
%65 = add nuw i64 %26, 32
%66 = add i64 %27, 2
%67 = icmp eq i64 %66, %24
br i1 %67, label %68, label %25
68: ; preds = %25, %16
%69 = phi i64 [ 0, %16 ], [ %65, %25 ]
%70 = icmp eq i64 %21, 0
br i1 %70, label %90, label %71
71: ; preds = %68
%72 = getelementptr inbounds i16, i16* %0, i64 %69
%73 = bitcast i16* %72 to <8 x i16>*
%74 = load <8 x i16>, <8 x i16>* %73
%75 = getelementptr inbounds i16, i16* %72, i64 8
%76 = bitcast i16* %75 to <8 x i16>*
%77 = load <8 x i16>, <8 x i16>* %76
%78 = lshr <8 x i16> %74, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
%79 = lshr <8 x i16> %77, <i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7, i16 7>
%80 = trunc <8 x i16> %78 to <8 x i8>
%81 = trunc <8 x i16> %79 to <8 x i8>
%82 = icmp slt <8 x i16> %74, zeroinitializer
%83 = icmp slt <8 x i16> %77, zeroinitializer
%84 = select <8 x i1> %82, <8 x i8> zeroinitializer, <8 x i8> %80
%85 = select <8 x i1> %83, <8 x i8> zeroinitializer, <8 x i8> %81
%86 = getelementptr inbounds i8, i8* %1, i64 %69
%87 = bitcast i8* %86 to <8 x i8>*
store <8 x i8> %84, <8 x i8>* %87
%88 = getelementptr inbounds i8, i8* %86, i64 8
%89 = bitcast i8* %88 to <8 x i8>*
store <8 x i8> %85, <8 x i8>* %89
br label %90
90: ; preds = %68, %71
%91 = icmp eq i64 %17, %7
br i1 %91, label %129, label %92
92: ; preds = %9, %6, %90
%93 = phi i64 [ 0, %9 ], [ 0, %6 ], [ %17, %90 ]
%94 = xor i64 %93, -1
%95 = and i64 %7, 1
%96 = icmp eq i64 %95, 0
br i1 %96, label %106, label %97
97: ; preds = %92
%98 = getelementptr inbounds i16, i16* %0, i64 %93
%99 = load i16, i16* %98
%100 = lshr i16 %99, 7
%101 = trunc i16 %100 to i8
%102 = icmp slt i16 %99, 0
%103 = select i1 %102, i8 0, i8 %101
%104 = getelementptr inbounds i8, i8* %1, i64 %93
store i8 %103, i8* %104
%105 = or i64 %93, 1
br label %106
106: ; preds = %97, %92
%107 = phi i64 [ %93, %92 ], [ %105, %97 ]
%108 = sub nsw i64 0, %7
%109 = icmp eq i64 %94, %108
br i1 %109, label %129, label %110
110: ; preds = %106, %110
%111 = phi i64 [ %127, %110 ], [ %107, %106 ]
%112 = getelementptr inbounds i16, i16* %0, i64 %111
%113 = load i16, i16* %112
%114 = lshr i16 %113, 7
%115 = trunc i16 %114 to i8
%116 = icmp slt i16 %113, 0
%117 = select i1 %116, i8 0, i8 %115
%118 = getelementptr inbounds i8, i8* %1, i64 %111
store i8 %117, i8* %118
%119 = add nuw nsw i64 %111, 1
%120 = getelementptr inbounds i16, i16* %0, i64 %119
%121 = load i16, i16* %120
%122 = lshr i16 %121, 7
%123 = trunc i16 %122 to i8
%124 = icmp slt i16 %121, 0
%125 = select i1 %124, i8 0, i8 %123
%126 = getelementptr inbounds i8, i8* %1, i64 %119
store i8 %125, i8* %126
%127 = add nuw nsw i64 %111, 2
%128 = icmp eq i64 %127, %7
br i1 %128, label %129, label %110
129: ; preds = %106, %110, %90, %3
ret void
}