#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 */
typedef int uint64_t;

/* Variables and functions */
unsigned char *sg_scsi_sense_desc_find(unsigned char const *, int,
                                       int /*<<< orphan*/);
int sg_get_sense_info_fld(const unsigned char *sensep, int sb_len,
                          uint64_t *info_outp) {
  int j;
  const unsigned char *ucp;
  uint64_t ull;
  if (info_outp)
    *info_outp = 0;
  if (sb_len < 7)
    return 0;
  switch (sensep[0] & 0x7f) {
  case 0x70:
  case 0x71:
    if (info_outp)
      *info_outp = ((unsigned int)sensep[3] << 24) + (sensep[4] << 16) +
                   (sensep[5] << 8) + sensep[6];
    return (sensep[0] & 0x80) ? 1 : 0;
  case 0x72:
  case 0x73:
    ucp = sg_scsi_sense_desc_find(sensep, sb_len, 0);
    if (ucp && (0xa == ucp[1])) {
      ull = 0;
      for (j = 0; j < 8; ++j) {
        if (j > 0)
          ull <<= 8;
        ull |= ucp[4 + j];
      }
      if (info_outp)
        *info_outp = ull;
      return !!(ucp[2] & 0x80);
    } else
      return 0;
  default:
    return 0;
  }
}


x86 assembly (clang, -O0):
<sg_get_sense_info_fld>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
je     1138 <sg_get_sense_info_fld+0x28>
mov    -0x20(%rbp),%rax
movl   $0x0,(%rax)
cmpl   $0x7,-0x14(%rbp)
jge    114e <sg_get_sense_info_fld+0x3e>
movl   $0x0,-0x4(%rbp)
jmp    12af <sg_get_sense_info_fld+0x19f>
mov    -0x10(%rbp),%rax
movzbl (%rax),%eax
and    $0x7f,%eax
mov    %eax,-0x38(%rbp)
add    $0xffffff90,%eax
sub    $0x2,%eax
jb     1180 <sg_get_sense_info_fld+0x70>
jmp    116c <sg_get_sense_info_fld+0x5c>
mov    -0x38(%rbp),%eax
add    $0xffffff8e,%eax
sub    $0x2,%eax
jb     11e2 <sg_get_sense_info_fld+0xd2>
jmp    12a8 <sg_get_sense_info_fld+0x198>
cmpq   $0x0,-0x20(%rbp)
je     11c0 <sg_get_sense_info_fld+0xb0>
mov    -0x10(%rbp),%rax
movzbl 0x3(%rax),%ecx
shl    $0x18,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x4(%rax),%eax
shl    $0x10,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x5(%rax),%eax
shl    $0x8,%eax
add    %eax,%ecx
mov    -0x10(%rbp),%rax
movzbl 0x6(%rax),%eax
add    %eax,%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x10(%rbp),%rax
movzbl (%rax),%edx
and    $0x80,%edx
xor    %eax,%eax
mov    $0x1,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
mov    %eax,-0x4(%rbp)
jmp    12af <sg_get_sense_info_fld+0x19f>
mov    -0x10(%rbp),%rdi
mov    -0x14(%rbp),%esi
xor    %edx,%edx
call   1030 <sg_scsi_sense_desc_find@plt>
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
je     129c <sg_get_sense_info_fld+0x18c>
mov    -0x30(%rbp),%rax
movzbl 0x1(%rax),%ecx
mov    $0xa,%eax
cmp    %ecx,%eax
jne    129c <sg_get_sense_info_fld+0x18c>
movl   $0x0,-0x34(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x8,-0x24(%rbp)
jge    1264 <sg_get_sense_info_fld+0x154>
cmpl   $0x0,-0x24(%rbp)
jle    123f <sg_get_sense_info_fld+0x12f>
mov    -0x34(%rbp),%eax
shl    $0x8,%eax
mov    %eax,-0x34(%rbp)
mov    -0x30(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    $0x4,%ecx
movslq %ecx,%rcx
movzbl (%rax,%rcx,1),%eax
or     -0x34(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1222 <sg_get_sense_info_fld+0x112>
cmpq   $0x0,-0x20(%rbp)
je     1278 <sg_get_sense_info_fld+0x168>
mov    -0x34(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x30(%rbp),%rax
movzbl 0x2(%rax),%eax
and    $0x80,%eax
cmp    $0x0,%eax
setne  %al
xor    $0xff,%al
xor    $0xff,%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x4(%rbp)
jmp    12af <sg_get_sense_info_fld+0x19f>
movl   $0x0,-0x4(%rbp)
jmp    12af <sg_get_sense_info_fld+0x19f>
movl   $0x0,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sg_get_sense_info_fld>:
push   %rbp
push   %rbx
push   %rax
mov    %rdx,%rbx
test   %rdx,%rdx
je     1121 <sg_get_sense_info_fld+0x11>
movl   $0x0,(%rbx)
cmp    $0x7,%esi
jge    112a <sg_get_sense_info_fld+0x1a>
xor    %ebp,%ebp
jmp    117b <sg_get_sense_info_fld+0x6b>
movzbl (%rdi),%ebp
mov    %ebp,%eax
and    $0x7f,%eax
lea    -0x72(%rax),%ecx
cmp    $0x2,%ecx
jb     1153 <sg_get_sense_info_fld+0x43>
add    $0xffffff90,%eax
cmp    $0x1,%eax
ja     1126 <sg_get_sense_info_fld+0x16>
test   %rbx,%rbx
je     1177 <sg_get_sense_info_fld+0x67>
mov    0x3(%rdi),%eax
bswap  %eax
mov    %eax,(%rbx)
mov    (%rdi),%bpl
jmp    1177 <sg_get_sense_info_fld+0x67>
xor    %ebp,%ebp
xor    %edx,%edx
call   1030 <sg_scsi_sense_desc_find@plt>
test   %rax,%rax
je     117b <sg_get_sense_info_fld+0x6b>
cmpb   $0xa,0x1(%rax)
jne    1126 <sg_get_sense_info_fld+0x16>
test   %rbx,%rbx
je     1173 <sg_get_sense_info_fld+0x63>
mov    0x8(%rax),%ecx
bswap  %ecx
mov    %ecx,(%rbx)
mov    0x2(%rax),%bpl
shr    $0x7,%bpl
movzbl %bpl,%eax
add    $0x8,%rsp
pop    %rbx
pop    %rbp
ret

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

LLVM IR (-O2):
define i32 @sg_get_sense_info_fld(i8* %0, i32 %1, i32* writeonly %2) {
%4 = icmp eq i32* %2, null
br i1 %4, label %6, label %5
5: ; preds = %3
store i32 0, i32* %2
br label %6
6: ; preds = %5, %3
%7 = icmp slt i32 %1, 7
br i1 %7, label %67, label %8
8: ; preds = %6
%9 = load i8, i8* %0
%10 = and i8 %9, 127
%11 = zext i8 %10 to i32
switch i32 %11, label %67 [
i32 112, label %12
i32 113, label %12
i32 114, label %36
i32 115, label %36
]
12: ; preds = %8, %8
br i1 %4, label %33, label %13
13: ; preds = %12
%14 = getelementptr inbounds i8, i8* %0, i64 3
%15 = load i8, i8* %14
%16 = zext i8 %15 to i32
%17 = shl nuw i32 %16, 24
%18 = getelementptr inbounds i8, i8* %0, i64 4
%19 = load i8, i8* %18
%20 = zext i8 %19 to i32
%21 = shl nuw nsw i32 %20, 16
%22 = or i32 %21, %17
%23 = getelementptr inbounds i8, i8* %0, i64 5
%24 = load i8, i8* %23
%25 = zext i8 %24 to i32
%26 = shl nuw nsw i32 %25, 8
%27 = or i32 %22, %26
%28 = getelementptr inbounds i8, i8* %0, i64 6
%29 = load i8, i8* %28
%30 = zext i8 %29 to i32
%31 = or i32 %27, %30
store i32 %31, i32* %2
%32 = load i8, i8* %0
br label %33
33: ; preds = %13, %12
%34 = phi i8 [ %32, %13 ], [ %9, %12 ]
%35 = lshr i8 %34, 7
br label %67
36: ; preds = %8, %8
%37 = tail call i8* @sg_scsi_sense_desc_find(i8* %0, i32 %1, i32 0)
%38 = icmp eq i8* %37, null
br i1 %38, label %67, label %39
39: ; preds = %36
%40 = getelementptr inbounds i8, i8* %37, i64 1
%41 = load i8, i8* %40
%42 = icmp eq i8 %41, 10
br i1 %42, label %43, label %67
43: ; preds = %39
br i1 %4, label %63, label %44
44: ; preds = %43
%45 = getelementptr inbounds i8, i8* %37, i64 8
%46 = load i8, i8* %45
%47 = zext i8 %46 to i32
%48 = shl nuw nsw i32 %47, 16
%49 = getelementptr inbounds i8, i8* %37, i64 9
%50 = load i8, i8* %49
%51 = zext i8 %50 to i32
%52 = shl nuw nsw i32 %51, 8
%53 = or i32 %48, %52
%54 = getelementptr inbounds i8, i8* %37, i64 10
%55 = load i8, i8* %54
%56 = zext i8 %55 to i32
%57 = or i32 %53, %56
%58 = shl nuw i32 %57, 8
%59 = getelementptr inbounds i8, i8* %37, i64 11
%60 = load i8, i8* %59
%61 = zext i8 %60 to i32
%62 = or i32 %58, %61
store i32 %62, i32* %2
br label %63
63: ; preds = %44, %43
%64 = getelementptr inbounds i8, i8* %37, i64 2
%65 = load i8, i8* %64
%66 = lshr i8 %65, 7
br label %67
67: ; preds = %8, %36, %39, %6, %63, %33
%68 = phi i8 [ %66, %63 ], [ %35, %33 ], [ 0, %6 ], [ 0, %39 ], [ 0, %36 ], [ 0, %8 ]
%69 = zext i8 %68 to i32
ret i32 %69
}