void make_h264_header(unsigned char *buf, int packetization_mode,
                      unsigned char nal_unit_octet, int frag_start,
                      int frag_end) {
  unsigned char fu_ind, fu_head;
  switch (packetization_mode) {
  case 0:
    *buf = nal_unit_octet;
    break;
  case 1:
    *buf = nal_unit_octet;
    break;
  case 2:
    fu_ind = (nal_unit_octet & 224) | 28;
    *buf = fu_ind;
    fu_head = (nal_unit_octet & 31) | (frag_start << 7) | (frag_end << 6);
    *(buf + 1) = fu_head;
    break;
  }
}


x86 assembly (clang, -O0):
<make_h264_header>:
push   %rbp
mov    %rsp,%rbp
mov    %dl,%al
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %al,-0xd(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x20(%rbp)
test   %eax,%eax
je     114c <make_h264_header+0x4c>
jmp    112a <make_h264_header+0x2a>
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
je     115a <make_h264_header+0x5a>
jmp    113b <make_h264_header+0x3b>
mov    -0x20(%rbp),%eax
sub    $0x2,%eax
je     1168 <make_h264_header+0x68>
jmp    11a4 <make_h264_header+0xa4>
mov    -0xd(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    11a4 <make_h264_header+0xa4>
mov    -0xd(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
jmp    11a4 <make_h264_header+0xa4>
movzbl -0xd(%rbp),%eax
and    $0xe0,%eax
or     $0x1c,%eax
mov    %al,-0x19(%rbp)
mov    -0x19(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
movzbl -0xd(%rbp),%eax
and    $0x1f,%eax
mov    -0x14(%rbp),%ecx
shl    $0x7,%ecx
or     %ecx,%eax
mov    -0x18(%rbp),%ecx
shl    $0x6,%ecx
or     %ecx,%eax
mov    %al,-0x1a(%rbp)
mov    -0x1a(%rbp),%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x1(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<make_h264_header>:
cmp    $0x2,%esi
je     1111 <make_h264_header+0x11>
cmp    $0x1,%esi
je     110e <make_h264_header+0xe>
test   %esi,%esi
jne    1130 <make_h264_header+0x30>
mov    %dl,(%rdi)
ret
mov    %edx,%eax
and    $0xe0,%al
or     $0x1c,%al
mov    %al,(%rdi)
and    $0x1f,%dl
movzbl %dl,%eax
shl    $0x7,%ecx
shl    $0x6,%r8d
or     %ecx,%r8d
or     %eax,%r8d
mov    %r8b,0x1(%rdi)
ret

LLVM IR (-O0):
define void @make_h264_header(i8* %0, i32 %1, i8 zeroext %2, i32 %3, i32 %4) {
%6 = alloca i8*
%7 = alloca i32
%8 = alloca i8
%9 = alloca i32
%10 = alloca i32
%11 = alloca i8
%12 = alloca i8
store i8* %0, i8** %6
store i32 %1, i32* %7
store i8 %2, i8* %8
store i32 %3, i32* %9
store i32 %4, i32* %10
%13 = load i32, i32* %7
switch i32 %13, label %41 [
i32 0, label %14
i32 1, label %17
i32 2, label %20
]
14: ; preds = %5
%15 = load i8, i8* %8
%16 = load i8*, i8** %6
store i8 %15, i8* %16
br label %41
17: ; preds = %5
%18 = load i8, i8* %8
%19 = load i8*, i8** %6
store i8 %18, i8* %19
br label %41
20: ; preds = %5
%21 = load i8, i8* %8
%22 = zext i8 %21 to i32
%23 = and i32 %22, 224
%24 = or i32 %23, 28
%25 = trunc i32 %24 to i8
store i8 %25, i8* %11
%26 = load i8, i8* %11
%27 = load i8*, i8** %6
store i8 %26, i8* %27
%28 = load i8, i8* %8
%29 = zext i8 %28 to i32
%30 = and i32 %29, 31
%31 = load i32, i32* %9
%32 = shl i32 %31, 7
%33 = or i32 %30, %32
%34 = load i32, i32* %10
%35 = shl i32 %34, 6
%36 = or i32 %33, %35
%37 = trunc i32 %36 to i8
store i8 %37, i8* %12
%38 = load i8, i8* %12
%39 = load i8*, i8** %6
%40 = getelementptr inbounds i8, i8* %39, i64 1
store i8 %38, i8* %40
br label %41
41: ; preds = %5, %20, %17, %14
ret void
}

LLVM IR (-O2):
define void @make_h264_header(i8* nocapture writeonly %0, i32 %1, i8 zeroext %2, i32 %3, i32 %4) {
switch i32 %1, label %19 [
i32 0, label %6
i32 1, label %7
i32 2, label %8
]
6: ; preds = %5
store i8 %2, i8* %0
br label %19
7: ; preds = %5
store i8 %2, i8* %0
br label %19
8: ; preds = %5
%9 = and i8 %2, -32
%10 = or i8 %9, 28
store i8 %10, i8* %0
%11 = and i8 %2, 31
%12 = zext i8 %11 to i32
%13 = shl i32 %3, 7
%14 = or i32 %13, %12
%15 = shl i32 %4, 6
%16 = or i32 %14, %15
%17 = trunc i32 %16 to i8
%18 = getelementptr inbounds i8, i8* %0, i64 1
store i8 %17, i8* %18
br label %19
19: ; preds = %5, %8, %7, %6
ret void
}