#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
scalar_t__ chk_mbr(unsigned char *);
int get16(unsigned char *, int);
int /*<<< orphan*/ memcmp(unsigned char *, char *, int);
int get_fstype(unsigned char *buf) {
  if (chk_mbr(buf))
    return 1;
  if (get16(&buf[1024], 56) == 0xEF53)
    return 5;
  if (get16(&buf[0], 0x1FE) != 0xAA55)
    return 0;
  if (!memcmp(&buf[0x36], "FAT", 3))
    return ((buf[0x26] == 0x28) || (buf[0x26] == 0x29)) ? 2 : 0;
  if (!memcmp(&buf[0x52], "FAT32", 5))
    return ((buf[0x42] == 0x28) || (buf[0x42] == 0x29)) ? 3 : 0;
  if (!memcmp(&buf[0x3], "NTFS", 4))
    return ((buf[0] == 0xEB) && (buf[1] == 0x52)) ? 4 : 0;
  return 0;
}


x86 assembly (clang, -O0):
<get_fstype>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rdi
call   1050 <chk_mbr@plt>
cmp    $0x0,%rax
je     115b <get_fstype+0x2b>
movl   $0x1,-0x4(%rbp)
jmp    12d8 <get_fstype+0x1a8>
mov    -0x10(%rbp),%rdi
add    $0x400,%rdi
mov    $0x38,%esi
call   1040 <get16@plt>
cmp    $0xef53,%eax
jne    1187 <get_fstype+0x57>
movl   $0x5,-0x4(%rbp)
jmp    12d8 <get_fstype+0x1a8>
mov    -0x10(%rbp),%rdi
mov    $0x1fe,%esi
call   1040 <get16@plt>
cmp    $0xaa55,%eax
je     11ac <get_fstype+0x7c>
movl   $0x0,-0x4(%rbp)
jmp    12d8 <get_fstype+0x1a8>
mov    -0x10(%rbp),%rdi
add    $0x36,%rdi
lea    0xe45(%rip),%rsi
mov    $0x3,%edx
call   1030 <memcmp@plt>
cmp    $0x0,%eax
jne    120d <get_fstype+0xdd>
mov    -0x10(%rbp),%rax
movzbl 0x26(%rax),%ecx
mov    $0x1,%al
cmp    $0x28,%ecx
mov    %al,-0x11(%rbp)
je     11f5 <get_fstype+0xc5>
mov    -0x10(%rbp),%rax
movzbl 0x26(%rax),%eax
cmp    $0x29,%eax
sete   %al
mov    %al,-0x11(%rbp)
mov    -0x11(%rbp),%dl
xor    %eax,%eax
mov    $0x2,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d8 <get_fstype+0x1a8>
mov    -0x10(%rbp),%rdi
add    $0x52,%rdi
lea    0xde8(%rip),%rsi
mov    $0x5,%edx
call   1030 <memcmp@plt>
cmp    $0x0,%eax
jne    126e <get_fstype+0x13e>
mov    -0x10(%rbp),%rax
movzbl 0x42(%rax),%ecx
mov    $0x1,%al
cmp    $0x28,%ecx
mov    %al,-0x12(%rbp)
je     1256 <get_fstype+0x126>
mov    -0x10(%rbp),%rax
movzbl 0x42(%rax),%eax
cmp    $0x29,%eax
sete   %al
mov    %al,-0x12(%rbp)
mov    -0x12(%rbp),%dl
xor    %eax,%eax
mov    $0x3,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d8 <get_fstype+0x1a8>
mov    -0x10(%rbp),%rdi
add    $0x3,%rdi
lea    0xd8d(%rip),%rsi
mov    $0x4,%edx
call   1030 <memcmp@plt>
cmp    $0x0,%eax
jne    12d1 <get_fstype+0x1a1>
mov    -0x10(%rbp),%rax
movzbl (%rax),%ecx
xor    %eax,%eax
cmp    $0xeb,%ecx
mov    %al,-0x13(%rbp)
jne    12b9 <get_fstype+0x189>
mov    -0x10(%rbp),%rax
movzbl 0x1(%rax),%eax
cmp    $0x52,%eax
sete   %al
mov    %al,-0x13(%rbp)
mov    -0x13(%rbp),%dl
xor    %eax,%eax
mov    $0x4,%ecx
test   $0x1,%dl
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12d8 <get_fstype+0x1a8>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_fstype>:
push   %rbp
push   %rbx
push   %rax
mov    %rdi,%rbx
call   1050 <chk_mbr@plt>
mov    $0x1,%ebp
test   %rax,%rax
jne    11ff <get_fstype+0xcf>
lea    0x400(%rbx),%rdi
mov    $0x38,%esi
call   1040 <get16@plt>
mov    $0x5,%ebp
cmp    $0xef53,%eax
je     11ff <get_fstype+0xcf>
mov    %rbx,%rdi
mov    $0x1fe,%esi
call   1040 <get16@plt>
xor    %ebp,%ebp
cmp    $0xaa55,%eax
jne    11ff <get_fstype+0xcf>
lea    0x36(%rbx),%rdi
lea    0xe75(%rip),%rsi
mov    $0x3,%edx
call   1030 <memcmp@plt>
test   %eax,%eax
je     11df <get_fstype+0xaf>
lea    0x52(%rbx),%rdi
lea    0xe60(%rip),%rsi
mov    $0x5,%edx
call   1030 <memcmp@plt>
test   %eax,%eax
je     11f0 <get_fstype+0xc0>
lea    0x3(%rbx),%rdi
lea    0xe4d(%rip),%rsi
mov    $0x4,%edx
call   1030 <memcmp@plt>
test   %eax,%eax
jne    11ff <get_fstype+0xcf>
cmpb   $0xeb,(%rbx)
jne    11ff <get_fstype+0xcf>
xor    %ebp,%ebp
cmpb   $0x52,0x1(%rbx)
sete   %bpl
shl    $0x2,%ebp
jmp    11ff <get_fstype+0xcf>
mov    0x26(%rbx),%al
and    $0xfe,%al
xor    %ebp,%ebp
cmp    $0x28,%al
sete   %bpl
add    %ebp,%ebp
jmp    11ff <get_fstype+0xcf>
mov    0x42(%rbx),%al
and    $0xfe,%al
xor    %ecx,%ecx
cmp    $0x28,%al
sete   %cl
lea    (%rcx,%rcx,2),%ebp
mov    %ebp,%eax
add    $0x8,%rsp
pop    %rbx
pop    %rbp
ret

LLVM IR (-O0):
@.str = [4 x i8] c"FAT\00"
@.str.1 = [6 x i8] c"FAT32\00"
@.str.2 = [5 x i8] c"NTFS\00"
define i32 @get_fstype(i8* %0) {
%2 = alloca i32
%3 = alloca i8*
store i8* %0, i8** %3
%4 = load i8*, i8** %3
%5 = call i64 @chk_mbr(i8* %4)
%6 = icmp ne i64 %5, 0
br i1 %6, label %7, label %8
7: ; preds = %1
store i32 1, i32* %2
br label %84
8: ; preds = %1
%9 = load i8*, i8** %3
%10 = getelementptr inbounds i8, i8* %9, i64 1024
%11 = call i32 @get16(i8* %10, i32 56)
%12 = icmp eq i32 %11, 61267
br i1 %12, label %13, label %14
13: ; preds = %8
store i32 5, i32* %2
br label %84
14: ; preds = %8
%15 = load i8*, i8** %3
%16 = getelementptr inbounds i8, i8* %15, i64 0
%17 = call i32 @get16(i8* %16, i32 510)
%18 = icmp ne i32 %17, 43605
br i1 %18, label %19, label %20
19: ; preds = %14
store i32 0, i32* %2
br label %84
20: ; preds = %14
%21 = load i8*, i8** %3
%22 = getelementptr inbounds i8, i8* %21, i64 54
%23 = call i32 @memcmp(i8* %22, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 3)
%24 = icmp ne i32 %23, 0
br i1 %24, label %41, label %25
25: ; preds = %20
%26 = load i8*, i8** %3
%27 = getelementptr inbounds i8, i8* %26, i64 38
%28 = load i8, i8* %27
%29 = zext i8 %28 to i32
%30 = icmp eq i32 %29, 40
br i1 %30, label %37, label %31
31: ; preds = %25
%32 = load i8*, i8** %3
%33 = getelementptr inbounds i8, i8* %32, i64 38
%34 = load i8, i8* %33
%35 = zext i8 %34 to i32
%36 = icmp eq i32 %35, 41
br label %37
37: ; preds = %31, %25
%38 = phi i1 [ true, %25 ], [ %36, %31 ]
%39 = zext i1 %38 to i64
%40 = select i1 %38, i32 2, i32 0
store i32 %40, i32* %2
br label %84
41: ; preds = %20
%42 = load i8*, i8** %3
%43 = getelementptr inbounds i8, i8* %42, i64 82
%44 = call i32 @memcmp(i8* %43, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i64 0, i64 0), i32 5)
%45 = icmp ne i32 %44, 0
br i1 %45, label %62, label %46
46: ; preds = %41
%47 = load i8*, i8** %3
%48 = getelementptr inbounds i8, i8* %47, i64 66
%49 = load i8, i8* %48
%50 = zext i8 %49 to i32
%51 = icmp eq i32 %50, 40
br i1 %51, label %58, label %52
52: ; preds = %46
%53 = load i8*, i8** %3
%54 = getelementptr inbounds i8, i8* %53, i64 66
%55 = load i8, i8* %54
%56 = zext i8 %55 to i32
%57 = icmp eq i32 %56, 41
br label %58
58: ; preds = %52, %46
%59 = phi i1 [ true, %46 ], [ %57, %52 ]
%60 = zext i1 %59 to i64
%61 = select i1 %59, i32 3, i32 0
store i32 %61, i32* %2
br label %84
62: ; preds = %41
%63 = load i8*, i8** %3
%64 = getelementptr inbounds i8, i8* %63, i64 3
%65 = call i32 @memcmp(i8* %64, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i32 4)
%66 = icmp ne i32 %65, 0
br i1 %66, label %83, label %67
67: ; preds = %62
%68 = load i8*, i8** %3
%69 = getelementptr inbounds i8, i8* %68, i64 0
%70 = load i8, i8* %69
%71 = zext i8 %70 to i32
%72 = icmp eq i32 %71, 235
br i1 %72, label %73, label %79
73: ; preds = %67
%74 = load i8*, i8** %3
%75 = getelementptr inbounds i8, i8* %74, i64 1
%76 = load i8, i8* %75
%77 = zext i8 %76 to i32
%78 = icmp eq i32 %77, 82
br label %79
79: ; preds = %73, %67
%80 = phi i1 [ false, %67 ], [ %78, %73 ]
%81 = zext i1 %80 to i64
%82 = select i1 %80, i32 4, i32 0
store i32 %82, i32* %2
br label %84
83: ; preds = %62
store i32 0, i32* %2
br label %84
84: ; preds = %83, %79, %58, %37, %19, %13, %7
%85 = load i32, i32* %2
ret i32 %85
}

LLVM IR (-O2):
@.str = [4 x i8] c"FAT\00"
@.str.1 = [6 x i8] c"FAT32\00"
@.str.2 = [5 x i8] c"NTFS\00"
define i32 @get_fstype(i8* %0) {
%2 = tail call i64 @chk_mbr(i8* %0)
%3 = icmp eq i64 %2, 0
br i1 %3, label %4, label %43
4: ; preds = %1
%5 = getelementptr inbounds i8, i8* %0, i64 1024
%6 = tail call i32 @get16(i8* %5, i32 56)
%7 = icmp eq i32 %6, 61267
br i1 %7, label %43, label %8
8: ; preds = %4
%9 = tail call i32 @get16(i8* %0, i32 510)
%10 = icmp eq i32 %9, 43605
br i1 %10, label %11, label %43
11: ; preds = %8
%12 = getelementptr inbounds i8, i8* %0, i64 54
%13 = tail call i32 @memcmp(i8* %12, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 3)
%14 = icmp eq i32 %13, 0
br i1 %14, label %15, label %21
15: ; preds = %11
%16 = getelementptr inbounds i8, i8* %0, i64 38
%17 = load i8, i8* %16
%18 = and i8 %17, -2
%19 = icmp eq i8 %18, 40
%20 = select i1 %19, i32 2, i32 0
br label %43
21: ; preds = %11
%22 = getelementptr inbounds i8, i8* %0, i64 82
%23 = tail call i32 @memcmp(i8* %22, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.1, i64 0, i64 0), i32 5)
%24 = icmp eq i32 %23, 0
br i1 %24, label %25, label %31
25: ; preds = %21
%26 = getelementptr inbounds i8, i8* %0, i64 66
%27 = load i8, i8* %26
%28 = and i8 %27, -2
%29 = icmp eq i8 %28, 40
%30 = select i1 %29, i32 3, i32 0
br label %43
31: ; preds = %21
%32 = getelementptr inbounds i8, i8* %0, i64 3
%33 = tail call i32 @memcmp(i8* %32, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.2, i64 0, i64 0), i32 4)
%34 = icmp eq i32 %33, 0
br i1 %34, label %35, label %43
35: ; preds = %31
%36 = load i8, i8* %0
%37 = icmp eq i8 %36, -21
br i1 %37, label %38, label %43
38: ; preds = %35
%39 = getelementptr inbounds i8, i8* %0, i64 1
%40 = load i8, i8* %39
%41 = icmp eq i8 %40, 82
%42 = select i1 %41, i32 4, i32 0
br label %43
43: ; preds = %31, %35, %38, %8, %4, %1, %25, %15
%44 = phi i32 [ %30, %25 ], [ %20, %15 ], [ 1, %1 ], [ 5, %4 ], [ 0, %8 ], [ 0, %35 ], [ %42, %38 ], [ 0, %31 ]
ret i32 %44
}