void USBDevEndpointConfigGet(unsigned long ulBase, unsigned long ulEndpoint,
                             unsigned long *pulMaxPacketSize,
                             unsigned long *pulFlags) {
  unsigned long ulRegister;
  ;
  ;

  ;
  if (*pulFlags & 0x00002000) {
    *pulFlags = 0x00002000;
    *pulMaxPacketSize = (unsigned long)(*(
        (volatile unsigned char *)(ulBase + (ulEndpoint - 0x10) + 0x00000110)));
    ulRegister = (unsigned long)(*(
        (volatile unsigned char *)(ulBase + (ulEndpoint - 0x10) + 0x00000113)));
    if (ulRegister & 0x00000080) {
      *pulFlags |= 0x00000001;
    }
    if (ulRegister & 0x00000010) {
      if (ulRegister & 0x00000004) {
        *pulFlags |= 0x00000010;
      } else {
        *pulFlags |= 0x00000008;
      }
    }
    if (ulRegister & 0x00000040) {
      *pulFlags |= 0x00000000;
    } else {
      *pulFlags |= 0x00000100;
    }
  } else {
    *pulFlags = 0x00001000;
    *pulMaxPacketSize = (unsigned long)(*(
        (volatile unsigned char *)(ulBase + (ulEndpoint - 0x10) + 0x00000114)));
    ulRegister = (unsigned long)(*(
        (volatile unsigned char *)(ulBase + (ulEndpoint - 0x10) + 0x00000117)));
    if (ulRegister & 0x00000080) {
      *pulFlags |= 0x00000004;
    }
    if (ulRegister & 0x00000020) {
      if (ulRegister & 0x00000008) {
        *pulFlags |= 0x00000010;
      } else {
        *pulFlags |= 0x00000008;
      }
    }
    if (ulRegister & 0x00000040) {
      *pulFlags |= 0x00000000;
    } else {
      *pulFlags |= 0x00000100;
    }
  }
}


x86 assembly (clang, -O0):
<USBDevEndpointConfigGet>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
and    $0x2000,%rax
cmp    $0x0,%rax
je     121a <USBDevEndpointConfigGet+0x11a>
mov    -0x20(%rbp),%rax
movq   $0x2000,(%rax)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    $0x10,%rcx
add    %rcx,%rax
mov    0x110(%rax),%al
movzbl %al,%eax
mov    %eax,%ecx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    $0x10,%rcx
add    %rcx,%rax
mov    0x113(%rax),%al
movzbl %al,%eax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
and    $0x80,%rax
cmp    $0x0,%rax
je     1195 <USBDevEndpointConfigGet+0x95>
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
or     $0x1,%rcx
mov    %rcx,(%rax)
mov    -0x28(%rbp),%rax
and    $0x10,%rax
cmp    $0x0,%rax
je     11df <USBDevEndpointConfigGet+0xdf>
mov    -0x28(%rbp),%rax
and    $0x4,%rax
cmp    $0x0,%rax
je     11cc <USBDevEndpointConfigGet+0xcc>
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
or     $0x10,%rcx
mov    %rcx,(%rax)
jmp    11da <USBDevEndpointConfigGet+0xda>
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
or     $0x8,%rcx
mov    %rcx,(%rax)
jmp    11df <USBDevEndpointConfigGet+0xdf>
mov    -0x28(%rbp),%rax
and    $0x40,%rax
cmp    $0x0,%rax
je     1204 <USBDevEndpointConfigGet+0x104>
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
or     $0x0,%rcx
mov    %rcx,(%rax)
jmp    1215 <USBDevEndpointConfigGet+0x115>
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
or     $0x100,%rcx
mov    %rcx,(%rax)
jmp    1309 <USBDevEndpointConfigGet+0x209>
mov    -0x20(%rbp),%rax
movq   $0x1000,(%rax)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    $0x10,%rcx
add    %rcx,%rax
mov    0x114(%rax),%al
movzbl %al,%eax
mov    %eax,%ecx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    $0x10,%rcx
add    %rcx,%rax
mov    0x117(%rax),%al
movzbl %al,%eax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
and    $0x80,%rax
cmp    $0x0,%rax
je     1284 <USBDevEndpointConfigGet+0x184>
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
or     $0x4,%rcx
mov    %rcx,(%rax)
mov    -0x28(%rbp),%rax
and    $0x20,%rax
cmp    $0x0,%rax
je     12ce <USBDevEndpointConfigGet+0x1ce>
mov    -0x28(%rbp),%rax
and    $0x8,%rax
cmp    $0x0,%rax
je     12bb <USBDevEndpointConfigGet+0x1bb>
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
or     $0x10,%rcx
mov    %rcx,(%rax)
jmp    12c9 <USBDevEndpointConfigGet+0x1c9>
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
or     $0x8,%rcx
mov    %rcx,(%rax)
jmp    12ce <USBDevEndpointConfigGet+0x1ce>
mov    -0x28(%rbp),%rax
and    $0x40,%rax
cmp    $0x0,%rax
je     12f3 <USBDevEndpointConfigGet+0x1f3>
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
or     $0x0,%rcx
mov    %rcx,(%rax)
jmp    1304 <USBDevEndpointConfigGet+0x204>
mov    -0x20(%rbp),%rax
mov    (%rax),%rcx
or     $0x100,%rcx
mov    %rcx,(%rax)
jmp    1309 <USBDevEndpointConfigGet+0x209>
pop    %rbp
ret

x86 assembly (clang, -O2):
<USBDevEndpointConfigGet>:
testb  $0x20,0x1(%rcx)
jne    1136 <USBDevEndpointConfigGet+0x36>
movq   $0x1000,(%rcx)
movzbl 0x104(%rdi,%rsi,1),%eax
mov    %rax,(%rdx)
movzbl 0x107(%rdi,%rsi,1),%eax
test   $0x80,%al
je     1127 <USBDevEndpointConfigGet+0x27>
orb    $0x4,(%rcx)
test   $0x20,%al
je     116a <USBDevEndpointConfigGet+0x6a>
mov    %eax,%edx
and    $0x8,%edx
add    $0x8,%rdx
jmp    1167 <USBDevEndpointConfigGet+0x67>
movq   $0x2000,(%rcx)
movzbl 0x100(%rdi,%rsi,1),%eax
mov    %rax,(%rdx)
movzbl 0x103(%rdi,%rsi,1),%eax
test   $0x80,%al
je     1157 <USBDevEndpointConfigGet+0x57>
orb    $0x1,(%rcx)
test   $0x10,%al
je     116a <USBDevEndpointConfigGet+0x6a>
mov    %eax,%edx
and    $0x4,%edx
add    %rdx,%rdx
add    $0x8,%rdx
or     %rdx,(%rcx)
test   $0x40,%al
jne    1172 <USBDevEndpointConfigGet+0x72>
orb    $0x1,0x1(%rcx)
ret

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

LLVM IR (-O2):
define void @USBDevEndpointConfigGet(i64 %0, i64 %1, i64* nocapture writeonly %2, i64* nocapture %3) {
%5 = load i64, i64* %3
%6 = and i64 %5, 8192
%7 = icmp eq i64 %6, 0
br i1 %7, label %36, label %8
8: ; preds = %4
store i64 8192, i64* %3
%9 = add i64 %0, -16
%10 = add i64 %9, %1
%11 = add i64 %10, 272
%12 = inttoptr i64 %11 to i8*
%13 = load volatile i8, i8* %12
%14 = zext i8 %13 to i64
store i64 %14, i64* %2
%15 = add i64 %10, 275
%16 = inttoptr i64 %15 to i8*
%17 = load volatile i8, i8* %16
%18 = zext i8 %17 to i64
%19 = and i64 %18, 128
%20 = icmp eq i64 %19, 0
br i1 %20, label %24, label %21
21: ; preds = %8
%22 = load i64, i64* %3
%23 = or i64 %22, 1
store i64 %23, i64* %3
br label %24
24: ; preds = %21, %8
%25 = and i64 %18, 16
%26 = icmp eq i64 %25, 0
br i1 %26, label %33, label %27
27: ; preds = %24
%28 = and i64 %18, 4
%29 = icmp eq i64 %28, 0
%30 = load i64, i64* %3
%31 = select i1 %29, i64 8, i64 16
%32 = or i64 %30, %31
store i64 %32, i64* %3
br label %33
33: ; preds = %27, %24
%34 = and i64 %18, 64
%35 = icmp eq i64 %34, 0
br i1 %35, label %64, label %67
36: ; preds = %4
store i64 4096, i64* %3
%37 = add i64 %0, -16
%38 = add i64 %37, %1
%39 = add i64 %38, 276
%40 = inttoptr i64 %39 to i8*
%41 = load volatile i8, i8* %40
%42 = zext i8 %41 to i64
store i64 %42, i64* %2
%43 = add i64 %38, 279
%44 = inttoptr i64 %43 to i8*
%45 = load volatile i8, i8* %44
%46 = zext i8 %45 to i64
%47 = and i64 %46, 128
%48 = icmp eq i64 %47, 0
br i1 %48, label %52, label %49
49: ; preds = %36
%50 = load i64, i64* %3
%51 = or i64 %50, 4
store i64 %51, i64* %3
br label %52
52: ; preds = %49, %36
%53 = and i64 %46, 32
%54 = icmp eq i64 %53, 0
br i1 %54, label %61, label %55
55: ; preds = %52
%56 = and i64 %46, 8
%57 = icmp eq i64 %56, 0
%58 = load i64, i64* %3
%59 = select i1 %57, i64 8, i64 16
%60 = or i64 %58, %59
store i64 %60, i64* %3
br label %61
61: ; preds = %55, %52
%62 = and i64 %46, 64
%63 = icmp eq i64 %62, 0
br i1 %63, label %64, label %67
64: ; preds = %61, %33
%65 = load i64, i64* %3
%66 = or i64 %65, 256
store i64 %66, i64* %3
br label %67
67: ; preds = %64, %61, %33
ret void
}