void fat_setClusterRecord12(unsigned char *buf, unsigned int cluster,
                            int type) {
  if (type) {
    buf[0] = (buf[0] & 0x0F) + ((cluster & 0x0F) << 4);
    buf[1] = (cluster & 0xFF0) >> 4;
  } else {
    buf[0] = (cluster & 0xFF);
    buf[1] = (buf[1] & 0xF0) + ((cluster & 0xF00) >> 8);
  }
}


x86 assembly (clang, -O0):
<fat_setClusterRecord12>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
cmpl   $0x0,-0x10(%rbp)
je     114e <fat_setClusterRecord12+0x4e>
mov    -0x8(%rbp),%rax
movzbl (%rax),%eax
and    $0xf,%eax
mov    -0xc(%rbp),%ecx
and    $0xf,%ecx
shl    $0x4,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
mov    -0xc(%rbp),%eax
and    $0xff0,%eax
shr    $0x4,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x1(%rax)
jmp    1182 <fat_setClusterRecord12+0x82>
mov    -0xc(%rbp),%eax
and    $0xff,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,(%rax)
mov    -0x8(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xf0,%eax
mov    -0xc(%rbp),%ecx
and    $0xf00,%ecx
shr    $0x8,%ecx
add    %ecx,%eax
mov    %al,%cl
mov    -0x8(%rbp),%rax
mov    %cl,0x1(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<fat_setClusterRecord12>:
test   %edx,%edx
je     1119 <fat_setClusterRecord12+0x19>
mov    (%rdi),%al
and    $0xf,%al
mov    %esi,%ecx
shl    $0x4,%cl
or     %al,%cl
mov    %cl,(%rdi)
shr    $0x4,%esi
mov    %sil,0x1(%rdi)
ret
mov    %sil,(%rdi)
mov    0x1(%rdi),%al
and    $0xf0,%al
shr    $0x8,%esi
and    $0xf,%sil
or     %al,%sil
mov    %sil,0x1(%rdi)
ret

LLVM IR (-O0):
define void @fat_setClusterRecord12(i8* %0, i32 %1, i32 %2) {
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
store i8* %0, i8** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%7 = load i32, i32* %6
%8 = icmp ne i32 %7, 0
br i1 %8, label %9, label %28
9: ; preds = %3
%10 = load i8*, i8** %4
%11 = getelementptr inbounds i8, i8* %10, i64 0
%12 = load i8, i8* %11
%13 = zext i8 %12 to i32
%14 = and i32 %13, 15
%15 = load i32, i32* %5
%16 = and i32 %15, 15
%17 = shl i32 %16, 4
%18 = add i32 %14, %17
%19 = trunc i32 %18 to i8
%20 = load i8*, i8** %4
%21 = getelementptr inbounds i8, i8* %20, i64 0
store i8 %19, i8* %21
%22 = load i32, i32* %5
%23 = and i32 %22, 4080
%24 = lshr i32 %23, 4
%25 = trunc i32 %24 to i8
%26 = load i8*, i8** %4
%27 = getelementptr inbounds i8, i8* %26, i64 1
store i8 %25, i8* %27
br label %46
28: ; preds = %3
%29 = load i32, i32* %5
%30 = and i32 %29, 255
%31 = trunc i32 %30 to i8
%32 = load i8*, i8** %4
%33 = getelementptr inbounds i8, i8* %32, i64 0
store i8 %31, i8* %33
%34 = load i8*, i8** %4
%35 = getelementptr inbounds i8, i8* %34, i64 1
%36 = load i8, i8* %35
%37 = zext i8 %36 to i32
%38 = and i32 %37, 240
%39 = load i32, i32* %5
%40 = and i32 %39, 3840
%41 = lshr i32 %40, 8
%42 = add i32 %38, %41
%43 = trunc i32 %42 to i8
%44 = load i8*, i8** %4
%45 = getelementptr inbounds i8, i8* %44, i64 1
store i8 %43, i8* %45
br label %46
46: ; preds = %28, %9
ret void
}

LLVM IR (-O2):
define void @fat_setClusterRecord12(i8* nocapture %0, i32 %1, i32 %2) {
%4 = icmp eq i32 %2, 0
br i1 %4, label %14, label %5
5: ; preds = %3
%6 = load i8, i8* %0
%7 = and i8 %6, 15
%8 = trunc i32 %1 to i8
%9 = shl i8 %8, 4
%10 = or i8 %7, %9
store i8 %10, i8* %0
%11 = lshr i32 %1, 4
%12 = trunc i32 %11 to i8
%13 = getelementptr inbounds i8, i8* %0, i64 1
store i8 %12, i8* %13
br label %23
14: ; preds = %3
%15 = trunc i32 %1 to i8
store i8 %15, i8* %0
%16 = getelementptr inbounds i8, i8* %0, i64 1
%17 = load i8, i8* %16
%18 = and i8 %17, -16
%19 = lshr i32 %1, 8
%20 = trunc i32 %19 to i8
%21 = and i8 %20, 15
%22 = or i8 %18, %21
store i8 %22, i8* %16
br label %23
23: ; preds = %14, %5
ret void
}