#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 unsigned char uint8_t;
typedef int uint32_t;

/* Variables and functions */
void USBDevEndpointConfigSet(uint32_t ui32Base, uint32_t ui32Endpoint,
                             uint32_t ui32MaxPacketSize, uint32_t ui32Flags) {
  uint32_t ui32Register;
  ;

  ;
  if (ui32Flags & 0x00002000) {
    (*((volatile unsigned short *)(ui32Base + (ui32Endpoint - 0x10) +
                                   0x00000110))) = ui32MaxPacketSize;
    ui32Register = 0;
    if (ui32Flags & 0x00000001) {
      ui32Register |= 0x00000080;
    }
    if (ui32Flags & 0x00000010) {
      ui32Register |= 0x00000010 | 0x00000004;
    } else if (ui32Flags & 0x00000008) {
      ui32Register |= 0x00000010;
    }
    if ((ui32Flags & 0x00000300) == 0x00000000) {
      ui32Register |= 0x00000040;
    }
    (*((volatile unsigned char *)(ui32Base + (ui32Endpoint - 0x10) +
                                  0x00000113))) = (uint8_t)ui32Register;
    (*((volatile unsigned char *)(ui32Base + (ui32Endpoint - 0x10) +
                                  0x00000112))) = 0x00000040;
  } else {
    (*((volatile unsigned short *)(ui32Base + (ui32Endpoint - 0x10) +
                                   0x00000114))) = ui32MaxPacketSize;
    ui32Register = 0;
    if (ui32Flags & 0x00000004) {
      ui32Register = 0x00000080;
    }
    if (ui32Flags & 0x00000010) {
      ui32Register |= 0x00000020 | 0x00000008;
    } else if (ui32Flags & 0x00000008) {
      ui32Register |= 0x00000020;
    }
    if (ui32Flags & 0x00000020) {
      ui32Register |= 0x00000010;
    }
    if ((ui32Flags & 0x00000300) == 0x00000000) {
      ui32Register |= 0x00000040;
    }
    (*((volatile unsigned char *)(ui32Base + (ui32Endpoint - 0x10) +
                                  0x00000117))) = (uint8_t)ui32Register;
    (*((volatile unsigned char *)(ui32Base + (ui32Endpoint - 0x10) +
                                  0x00000116))) = 0x00000080;
  }
}


x86 assembly (clang, -O0):
<USBDevEndpointConfigSet>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    -0x10(%rbp),%eax
and    $0x2000,%eax
cmp    $0x0,%eax
je     11e4 <USBDevEndpointConfigSet+0xe4>
mov    -0xc(%rbp),%eax
mov    %ax,%cx
mov    -0x4(%rbp),%eax
mov    -0x8(%rbp),%edx
sub    $0x10,%edx
add    %edx,%eax
add    $0x110,%eax
cltq
mov    %cx,(%rax)
movl   $0x0,-0x14(%rbp)
mov    -0x10(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     115d <USBDevEndpointConfigSet+0x5d>
mov    -0x14(%rbp),%eax
or     $0x80,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     117a <USBDevEndpointConfigSet+0x7a>
mov    -0x14(%rbp),%eax
or     $0x14,%eax
mov    %eax,-0x14(%rbp)
jmp    1197 <USBDevEndpointConfigSet+0x97>
mov    -0x10(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     1192 <USBDevEndpointConfigSet+0x92>
mov    -0x14(%rbp),%eax
or     $0x10,%eax
mov    %eax,-0x14(%rbp)
jmp    1197 <USBDevEndpointConfigSet+0x97>
mov    -0x10(%rbp),%eax
and    $0x300,%eax
cmp    $0x0,%eax
jne    11b1 <USBDevEndpointConfigSet+0xb1>
mov    -0x14(%rbp),%eax
or     $0x40,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %al,%cl
mov    -0x4(%rbp),%eax
mov    -0x8(%rbp),%edx
sub    $0x10,%edx
add    %edx,%eax
add    $0x113,%eax
cltq
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
mov    -0x8(%rbp),%ecx
sub    $0x10,%ecx
add    %ecx,%eax
add    $0x112,%eax
cltq
movb   $0x40,(%rax)
jmp    12b6 <USBDevEndpointConfigSet+0x1b6>
mov    -0xc(%rbp),%eax
mov    %ax,%cx
mov    -0x4(%rbp),%eax
mov    -0x8(%rbp),%edx
sub    $0x10,%edx
add    %edx,%eax
add    $0x114,%eax
cltq
mov    %cx,(%rax)
movl   $0x0,-0x14(%rbp)
mov    -0x10(%rbp),%eax
and    $0x4,%eax
cmp    $0x0,%eax
je     121c <USBDevEndpointConfigSet+0x11c>
movl   $0x80,-0x14(%rbp)
mov    -0x10(%rbp),%eax
and    $0x10,%eax
cmp    $0x0,%eax
je     1239 <USBDevEndpointConfigSet+0x139>
mov    -0x14(%rbp),%eax
or     $0x28,%eax
mov    %eax,-0x14(%rbp)
jmp    1256 <USBDevEndpointConfigSet+0x156>
mov    -0x10(%rbp),%eax
and    $0x8,%eax
cmp    $0x0,%eax
je     1251 <USBDevEndpointConfigSet+0x151>
mov    -0x14(%rbp),%eax
or     $0x20,%eax
mov    %eax,-0x14(%rbp)
jmp    1256 <USBDevEndpointConfigSet+0x156>
mov    -0x10(%rbp),%eax
and    $0x20,%eax
cmp    $0x0,%eax
je     126e <USBDevEndpointConfigSet+0x16e>
mov    -0x14(%rbp),%eax
or     $0x10,%eax
mov    %eax,-0x14(%rbp)
mov    -0x10(%rbp),%eax
and    $0x300,%eax
cmp    $0x0,%eax
jne    1288 <USBDevEndpointConfigSet+0x188>
mov    -0x14(%rbp),%eax
or     $0x40,%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %al,%cl
mov    -0x4(%rbp),%eax
mov    -0x8(%rbp),%edx
sub    $0x10,%edx
add    %edx,%eax
add    $0x117,%eax
cltq
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
mov    -0x8(%rbp),%ecx
sub    $0x10,%ecx
add    %ecx,%eax
add    $0x116,%eax
cltq
movb   $0x80,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<USBDevEndpointConfigSet>:
lea    (%rdi,%rsi,1),%eax
add    $0xfffffff0,%eax
movslq %eax,%r9
test   $0x2000,%ecx
jne    1150 <USBDevEndpointConfigSet+0x50>
mov    %ecx,%esi
and    $0x4,%esi
shl    $0x5,%esi
lea    0x0(,%rcx,4),%edi
and    $0x20,%edi
test   $0x10,%cl
mov    $0x28,%eax
cmove  %edi,%eax
mov    %dx,0x114(%r9)
or     %esi,%eax
mov    %ecx,%edx
shr    %edx
and    $0x10,%edx
or     %eax,%edx
mov    $0x80,%r8b
mov    $0x116,%edi
mov    $0x117,%esi
jmp    1191 <USBDevEndpointConfigSet+0x91>
mov    %dx,0x110(%r9)
test   $0x10,%cl
jne    1179 <USBDevEndpointConfigSet+0x79>
mov    %ecx,%edx
rol    $0x4,%dl
mov    %edx,%esi
shr    $0x3,%sil
shl    $0x3,%dl
and    $0x80,%dl
or     %sil,%dl
and    $0x90,%dl
movzbl %dl,%edx
jmp    1184 <USBDevEndpointConfigSet+0x84>
mov    %ecx,%edx
shl    $0x7,%edx
or     $0x14,%edx
movzbl %dl,%edx
mov    $0x40,%r8b
mov    $0x112,%edi
mov    $0x113,%esi
mov    %edx,%eax
or     $0x40,%al
test   $0x300,%ecx
movzbl %al,%eax
cmovne %edx,%eax
mov    %esi,%ecx
mov    %al,(%r9,%rcx,1)
mov    %edi,%eax
mov    %r8b,(%r9,%rax,1)
ret

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

LLVM IR (-O2):
define void @USBDevEndpointConfigSet(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = and i32 %3, 8192
%6 = icmp eq i32 %5, 0
%7 = trunc i32 %2 to i16
%8 = add i32 %0, -16
%9 = add i32 %8, %1
br i1 %6, label %25, label %10
10: ; preds = %4
%11 = add nsw i32 %9, 272
%12 = sext i32 %11 to i64
%13 = inttoptr i64 %12 to i16*
store volatile i16 %7, i16* %13
%14 = and i32 %3, 16
%15 = icmp eq i32 %14, 0
br i1 %15, label %20, label %16
16: ; preds = %10
%17 = shl i32 %3, 7
%18 = and i32 %17, 128
%19 = or i32 %18, 20
br label %40
20: ; preds = %10
%21 = trunc i32 %3 to i8
%22 = tail call i8 @llvm.bitreverse.i8(i8 %21)
%23 = and i8 %22, -112
%24 = zext i8 %23 to i32
br label %40
25: ; preds = %4
%26 = add nsw i32 %9, 276
%27 = sext i32 %26 to i64
%28 = inttoptr i64 %27 to i16*
store volatile i16 %7, i16* %28
%29 = shl i32 %3, 5
%30 = and i32 %29, 128
%31 = and i32 %3, 16
%32 = icmp eq i32 %31, 0
%33 = shl i32 %3, 2
%34 = and i32 %33, 32
%35 = select i1 %32, i32 %34, i32 40
%36 = or i32 %30, %35
%37 = lshr i32 %3, 1
%38 = and i32 %37, 16
%39 = or i32 %36, %38
br label %40
40: ; preds = %16, %20, %25
%41 = phi i32 [ %39, %25 ], [ %19, %16 ], [ %24, %20 ]
%42 = phi i32 [ 279, %25 ], [ 275, %16 ], [ 275, %20 ]
%43 = phi i32 [ 278, %25 ], [ 274, %16 ], [ 274, %20 ]
%44 = phi i8 [ -128, %25 ], [ 64, %16 ], [ 64, %20 ]
%45 = and i32 %3, 768
%46 = icmp eq i32 %45, 0
%47 = or i32 %41, 64
%48 = select i1 %46, i32 %47, i32 %41
%49 = trunc i32 %48 to i8
%50 = add nsw i32 %9, %42
%51 = sext i32 %50 to i64
%52 = inttoptr i64 %51 to i8*
store volatile i8 %49, i8* %52
%53 = add nsw i32 %9, %43
%54 = sext i32 %53 to i64
%55 = inttoptr i64 %54 to i8*
store volatile i8 %44, i8* %55
ret void
}