#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 uint32_t;

/* Variables and functions */
void USBDevEndpointStallClear(uint32_t ui32Base, uint32_t ui32Endpoint,
                              uint32_t ui32Flags) {
  ;

  ;
  ;
  if (ui32Endpoint == 0x00000000) {
    (*((volatile unsigned char *)(ui32Base + 0x00000102))) &= ~0x00000004;
  } else if (ui32Flags == 0x00002000) {
    (*((volatile unsigned char *)(ui32Base + 0x00000112 +
                                  (ui32Endpoint - 0x10)))) &=
        ~(0x00000010 | 0x00000020);
    (*((volatile unsigned char *)(ui32Base + 0x00000112 +
                                  (ui32Endpoint - 0x10)))) |= 0x00000040;
  } else {
    (*((volatile unsigned char *)(ui32Base + 0x00000116 +
                                  (ui32Endpoint - 0x10)))) &=
        ~(0x00000020 | 0x00000040);
    (*((volatile unsigned char *)(ui32Base + 0x00000116 +
                                  (ui32Endpoint - 0x10)))) |= 0x00000080;
  }
}


x86 assembly (clang, -O0):
<USBDevEndpointStallClear>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
cmpl   $0x0,-0x8(%rbp)
jne    1130 <USBDevEndpointStallClear+0x30>
mov    -0x4(%rbp),%eax
add    $0x102,%eax
cltq
mov    (%rax),%cl
movzbl %cl,%ecx
and    $0xfffffffb,%ecx
mov    %cl,(%rax)
jmp    11ba <USBDevEndpointStallClear+0xba>
cmpl   $0x2000,-0xc(%rbp)
jne    117a <USBDevEndpointStallClear+0x7a>
mov    -0x4(%rbp),%eax
add    $0x112,%eax
mov    -0x8(%rbp),%ecx
sub    $0x10,%ecx
add    %ecx,%eax
cltq
mov    (%rax),%cl
movzbl %cl,%ecx
and    $0xffffffcf,%ecx
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
add    $0x112,%eax
mov    -0x8(%rbp),%ecx
sub    $0x10,%ecx
add    %ecx,%eax
cltq
mov    (%rax),%cl
movzbl %cl,%ecx
or     $0x40,%ecx
mov    %cl,(%rax)
jmp    11b5 <USBDevEndpointStallClear+0xb5>
mov    -0x4(%rbp),%eax
add    $0x116,%eax
mov    -0x8(%rbp),%ecx
sub    $0x10,%ecx
add    %ecx,%eax
cltq
mov    (%rax),%cl
movzbl %cl,%ecx
and    $0xffffff9f,%ecx
mov    %cl,(%rax)
mov    -0x4(%rbp),%eax
add    $0x116,%eax
mov    -0x8(%rbp),%ecx
sub    $0x10,%ecx
add    %ecx,%eax
cltq
mov    (%rax),%cl
movzbl %cl,%ecx
or     $0x80,%ecx
mov    %cl,(%rax)
jmp    11ba <USBDevEndpointStallClear+0xba>
pop    %rbp
ret

x86 assembly (clang, -O2):
<USBDevEndpointStallClear>:
test   %esi,%esi
je     111d <USBDevEndpointStallClear+0x1d>
cmp    $0x2000,%edx
jne    1128 <USBDevEndpointStallClear+0x28>
lea    (%rdi,%rsi,1),%eax
add    $0x102,%eax
cltq
andb   $0xcf,(%rax)
orb    $0x40,(%rax)
ret
movslq %edi,%rax
andb   $0xfb,0x102(%rax)
ret
lea    (%rsi,%rdi,1),%eax
add    $0x106,%eax
cltq
andb   $0x9f,(%rax)
orb    $0x80,(%rax)
ret

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

LLVM IR (-O2):
define void @USBDevEndpointStallClear(i32 %0, i32 %1, i32 %2) {
%4 = icmp eq i32 %1, 0
br i1 %4, label %5, label %11
5: ; preds = %3
%6 = add nsw i32 %0, 258
%7 = sext i32 %6 to i64
%8 = inttoptr i64 %7 to i8*
%9 = load volatile i8, i8* %8
%10 = and i8 %9, -5
store volatile i8 %10, i8* %8
br label %31
11: ; preds = %3
%12 = icmp eq i32 %2, 8192
br i1 %12, label %13, label %22
13: ; preds = %11
%14 = add i32 %0, 258
%15 = add i32 %14, %1
%16 = sext i32 %15 to i64
%17 = inttoptr i64 %16 to i8*
%18 = load volatile i8, i8* %17
%19 = and i8 %18, -49
store volatile i8 %19, i8* %17
%20 = load volatile i8, i8* %17
%21 = or i8 %20, 64
store volatile i8 %21, i8* %17
br label %31
22: ; preds = %11
%23 = add i32 %1, %0
%24 = add i32 %23, 262
%25 = sext i32 %24 to i64
%26 = inttoptr i64 %25 to i8*
%27 = load volatile i8, i8* %26
%28 = and i8 %27, -97
store volatile i8 %28, i8* %26
%29 = load volatile i8, i8* %26
%30 = or i8 %29, -128
store volatile i8 %30, i8* %26
br label %31
31: ; preds = %13, %22, %5
ret void
}