#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 */
int ILLEGAL_REQUEST;
int RECOVERED_ERROR;
int UNIT_ATTENTION;
int sg_err_category_new(int scsi_status, int msg_status, int host_status,
                        int driver_status, const unsigned char *sense_buffer,
                        int sb_len) {
  scsi_status &= 0x7e;
  if (!scsi_status && !host_status && !driver_status) {
    return 0;
  }
  if ((scsi_status == 0x2) || (scsi_status == 0x22) ||
      ((driver_status & 0xf) == 0x08)) {
    if (sense_buffer && (sb_len > 2)) {
      int sense_key;
      unsigned char asc;
      if (sense_buffer[0] & 0x2) {
        sense_key = sense_buffer[1] & 0xf;
        asc = sense_buffer[2];
      } else {
        sense_key = sense_buffer[2] & 0xf;
        asc = (sb_len > 12) ? sense_buffer[12] : 0;
      }
      if (sense_key == RECOVERED_ERROR) {
        return 4;
      } else if (sense_key == UNIT_ATTENTION) {
        if (0x28 == asc) {
          return 1;
        }
        if (0x29 == asc) {
          return 2;
        }
      } else if (sense_key == ILLEGAL_REQUEST) {
        return 5;
      }
    }
    return 98;
  }
  if (host_status) {
    if ((host_status == 0x01) || (host_status == 0x02) ||
        (host_status == 0x03)) {
      return 3;
    }
  }
  if (driver_status) {
    if (driver_status == 0x06) {
      return 3;
    }
  }
  return 99;
}


x86 assembly (clang, -O0):
<sg_err_category_new>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
mov    -0x8(%rbp),%eax
and    $0x7e,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x0,-0x8(%rbp)
jne    114b <sg_err_category_new+0x4b>
cmpl   $0x0,-0x10(%rbp)
jne    114b <sg_err_category_new+0x4b>
cmpl   $0x0,-0x14(%rbp)
jne    114b <sg_err_category_new+0x4b>
movl   $0x0,-0x4(%rbp)
jmp    12f8 <sg_err_category_new+0x1f8>
cmpl   $0x2,-0x8(%rbp)
je     116e <sg_err_category_new+0x6e>
cmpl   $0x22,-0x8(%rbp)
je     116e <sg_err_category_new+0x6e>
mov    -0x14(%rbp),%eax
and    $0xf,%eax
cmp    $0x8,%eax
jne    1293 <sg_err_category_new+0x193>
cmpq   $0x0,-0x20(%rbp)
je     1287 <sg_err_category_new+0x187>
cmpl   $0x2,-0x24(%rbp)
jle    1287 <sg_err_category_new+0x187>
mov    -0x20(%rbp),%rax
movzbl (%rax),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     11b3 <sg_err_category_new+0xb3>
mov    -0x20(%rbp),%rax
movzbl 0x1(%rax),%eax
and    $0xf,%eax
mov    %eax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    0x2(%rax),%al
mov    %al,-0x29(%rbp)
jmp    11eb <sg_err_category_new+0xeb>
mov    -0x20(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0xf,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0xc,-0x24(%rbp)
jle    11db <sg_err_category_new+0xdb>
mov    -0x20(%rbp),%rax
movzbl 0xc(%rax),%eax
mov    %eax,-0x30(%rbp)
jmp    11e5 <sg_err_category_new+0xe5>
xor    %eax,%eax
mov    %eax,-0x30(%rbp)
jmp    11e5 <sg_err_category_new+0xe5>
mov    -0x30(%rbp),%eax
mov    %al,-0x29(%rbp)
mov    -0x28(%rbp),%eax
mov    0x2ddb(%rip),%rcx
cmp    (%rcx),%eax
jne    1209 <sg_err_category_new+0x109>
movl   $0x4,-0x4(%rbp)
jmp    12f8 <sg_err_category_new+0x1f8>
mov    -0x28(%rbp),%eax
mov    0x2dd5(%rip),%rcx
cmp    (%rcx),%eax
jne    125a <sg_err_category_new+0x15a>
movzbl -0x29(%rbp),%ecx
mov    $0x28,%eax
cmp    %ecx,%eax
jne    1238 <sg_err_category_new+0x138>
movl   $0x1,-0x4(%rbp)
jmp    12f8 <sg_err_category_new+0x1f8>
movzbl -0x29(%rbp),%ecx
mov    $0x29,%eax
cmp    %ecx,%eax
jne    1255 <sg_err_category_new+0x155>
movl   $0x2,-0x4(%rbp)
jmp    12f8 <sg_err_category_new+0x1f8>
jmp    127d <sg_err_category_new+0x17d>
mov    -0x28(%rbp),%eax
mov    0x2d74(%rip),%rcx
cmp    (%rcx),%eax
jne    1278 <sg_err_category_new+0x178>
movl   $0x5,-0x4(%rbp)
jmp    12f8 <sg_err_category_new+0x1f8>
jmp    127d <sg_err_category_new+0x17d>
jmp    1282 <sg_err_category_new+0x182>
jmp    1287 <sg_err_category_new+0x187>
movl   $0x62,-0x4(%rbp)
jmp    12f8 <sg_err_category_new+0x1f8>
cmpl   $0x0,-0x10(%rbp)
je     12cc <sg_err_category_new+0x1cc>
cmpl   $0x1,-0x10(%rbp)
je     12bb <sg_err_category_new+0x1bb>
cmpl   $0x2,-0x10(%rbp)
je     12bb <sg_err_category_new+0x1bb>
cmpl   $0x3,-0x10(%rbp)
jne    12c7 <sg_err_category_new+0x1c7>
movl   $0x3,-0x4(%rbp)
jmp    12f8 <sg_err_category_new+0x1f8>
jmp    12cc <sg_err_category_new+0x1cc>
cmpl   $0x0,-0x14(%rbp)
je     12f1 <sg_err_category_new+0x1f1>
cmpl   $0x6,-0x14(%rbp)
jne    12ec <sg_err_category_new+0x1ec>
movl   $0x3,-0x4(%rbp)
jmp    12f8 <sg_err_category_new+0x1f8>
jmp    12f1 <sg_err_category_new+0x1f1>
movl   $0x63,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<sg_err_category_new>:
mov    %edi,%eax
and    $0x7e,%eax
or     %edx,%eax
or     %ecx,%eax
je     1140 <sg_err_category_new+0x40>
and    $0x5e,%edi
cmp    $0x2,%edi
je     1143 <sg_err_category_new+0x43>
mov    %ecx,%eax
and    $0xf,%eax
cmp    $0x8,%eax
je     1143 <sg_err_category_new+0x43>
add    $0xffffffff,%edx
mov    $0x3,%eax
cmp    $0x3,%edx
jb     11bd <sg_err_category_new+0xbd>
cmp    $0x6,%ecx
mov    $0x3,%ecx
mov    $0x63,%eax
cmove  %ecx,%eax
jmp    11bd <sg_err_category_new+0xbd>
xor    %eax,%eax
ret
mov    $0x62,%eax
test   %r8,%r8
je     11bd <sg_err_category_new+0xbd>
cmp    $0x3,%r9d
jl     11bd <sg_err_category_new+0xbd>
testb  $0x2,(%r8)
jne    116c <sg_err_category_new+0x6c>
mov    0x2(%r8),%cl
mov    $0xc,%edx
cmp    $0xd,%r9d
jae    1175 <sg_err_category_new+0x75>
xor    %edx,%edx
jmp    1179 <sg_err_category_new+0x79>
mov    0x1(%r8),%cl
mov    $0x2,%edx
mov    (%r8,%rdx,1),%dl
and    $0xf,%cl
movzbl %cl,%esi
mov    0x2e4a(%rip),%rdi
mov    $0x4,%ecx
cmp    %esi,(%rdi)
jne    1192 <sg_err_category_new+0x92>
mov    %ecx,%eax
ret
mov    0x2e4f(%rip),%rcx
cmp    %esi,(%rcx)
jne    11ad <sg_err_category_new+0xad>
cmp    $0x28,%dl
je     11be <sg_err_category_new+0xbe>
cmp    $0x29,%dl
jne    11bd <sg_err_category_new+0xbd>
mov    $0x2,%eax
ret
mov    0x2e24(%rip),%rdx
mov    $0x5,%ecx
cmp    %esi,(%rdx)
je     118f <sg_err_category_new+0x8f>
ret
mov    $0x1,%eax
ret

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

LLVM IR (-O2):
@RECOVERED_ERROR = global i32 0
@UNIT_ATTENTION = global i32 0
@ILLEGAL_REQUEST = global i32 0
define i32 @sg_err_category_new(i32 %0, i32 %1, i32 %2, i32 %3, i8* %4, i32 %5) {
%7 = and i32 %0, 126
%8 = or i32 %7, %2
%9 = or i32 %8, %3
%10 = icmp eq i32 %9, 0
br i1 %10, label %60, label %11
11: ; preds = %6
%12 = and i32 %0, 94
%13 = icmp eq i32 %12, 2
%14 = and i32 %3, 15
%15 = icmp eq i32 %14, 8
%16 = or i1 %13, %15
br i1 %16, label %17, label %54
17: ; preds = %11
%18 = icmp ne i8* %4, null
%19 = icmp sgt i32 %5, 2
%20 = and i1 %18, %19
br i1 %20, label %21, label %60
21: ; preds = %17
%22 = load i8, i8* %4
%23 = and i8 %22, 2
%24 = icmp eq i8 %23, 0
br i1 %24, label %28, label %25
25: ; preds = %21
%26 = getelementptr inbounds i8, i8* %4, i64 1
%27 = load i8, i8* %26
br label %32
28: ; preds = %21
%29 = getelementptr inbounds i8, i8* %4, i64 2
%30 = load i8, i8* %29
%31 = icmp ugt i32 %5, 12
br i1 %31, label %32, label %37
32: ; preds = %28, %25
%33 = phi i64 [ 2, %25 ], [ 12, %28 ]
%34 = phi i8 [ %27, %25 ], [ %30, %28 ]
%35 = getelementptr inbounds i8, i8* %4, i64 %33
%36 = load i8, i8* %35
br label %37
37: ; preds = %32, %28
%38 = phi i8 [ %30, %28 ], [ %34, %32 ]
%39 = phi i8 [ 0, %28 ], [ %36, %32 ]
%40 = and i8 %38, 15
%41 = zext i8 %40 to i32
%42 = load i32, i32* @RECOVERED_ERROR
%43 = icmp eq i32 %42, %41
br i1 %43, label %52, label %44
44: ; preds = %37
%45 = load i32, i32* @UNIT_ATTENTION
%46 = icmp eq i32 %45, %41
br i1 %46, label %47, label %49
47: ; preds = %44
switch i8 %39, label %60 [
i8 40, label %52
i8 41, label %48
]
48: ; preds = %47
br label %52
49: ; preds = %44
%50 = load i32, i32* @ILLEGAL_REQUEST
%51 = icmp eq i32 %50, %41
br i1 %51, label %52, label %60
52: ; preds = %48, %37, %47, %49
%53 = phi i32 [ 5, %49 ], [ 1, %47 ], [ 4, %37 ], [ 2, %48 ]
br label %60
54: ; preds = %11
%55 = add i32 %2, -1
%56 = icmp ult i32 %55, 3
br i1 %56, label %60, label %57
57: ; preds = %54
%58 = icmp eq i32 %3, 6
%59 = select i1 %58, i32 3, i32 99
br label %60
60: ; preds = %17, %49, %47, %52, %57, %54, %6
%61 = phi i32 [ 0, %6 ], [ 3, %54 ], [ %59, %57 ], [ %53, %52 ], [ 98, %47 ], [ 98, %49 ], [ 98, %17 ]
ret i32 %61
}