void USBHostEndpointStatusClear(unsigned long ulBase, unsigned long ulEndpoint,
                                unsigned long ulFlags) {
  ;

  ;
  if (ulEndpoint == 0x00000000) {
    (*((volatile unsigned char *)(ulBase + 0x00000102))) &= ~ulFlags;
  } else {
    (*((volatile unsigned char *)(ulBase + 0x00000112 +
                                  (ulEndpoint - 0x10)))) &= ~ulFlags;
    (*((volatile unsigned char *)(ulBase + 0x00000116 +
                                  (ulEndpoint - 0x10)))) &= ~(ulFlags >> 16);
  }
}


x86 assembly (clang, -O0):
<USBHostEndpointStatusClear>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
jne    113e <USBHostEndpointStatusClear+0x3e>
mov    -0x18(%rbp),%rdx
xor    $0xffffffffffffffff,%rdx
mov    -0x8(%rbp),%rax
mov    0x102(%rax),%cl
movzbl %cl,%ecx
and    %rdx,%rcx
mov    %cl,0x102(%rax)
jmp    1190 <USBHostEndpointStatusClear+0x90>
mov    -0x18(%rbp),%rdx
xor    $0xffffffffffffffff,%rdx
mov    -0x8(%rbp),%rax
add    $0x112,%rax
mov    -0x10(%rbp),%rcx
sub    $0x10,%rcx
add    %rcx,%rax
mov    (%rax),%cl
movzbl %cl,%ecx
and    %rdx,%rcx
mov    %cl,(%rax)
mov    -0x18(%rbp),%rdx
shr    $0x10,%rdx
xor    $0xffffffffffffffff,%rdx
mov    -0x8(%rbp),%rax
add    $0x116,%rax
mov    -0x10(%rbp),%rcx
sub    $0x10,%rcx
add    %rcx,%rax
mov    (%rax),%cl
movzbl %cl,%ecx
and    %rdx,%rcx
mov    %cl,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<USBHostEndpointStatusClear>:
test   %rsi,%rsi
je     1120 <USBHostEndpointStatusClear+0x20>
mov    %edx,%eax
not    %al
and    %al,0x102(%rsi,%rdi,1)
shr    $0x10,%rdx
add    %rsi,%rdi
add    $0x106,%rdi
jmp    1127 <USBHostEndpointStatusClear+0x27>
add    $0x102,%rdi
not    %dl
and    %dl,(%rdi)
ret

LLVM IR (-O0):
define void @USBHostEndpointStatusClear(i64 %0, i64 %1, i64 %2) {
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64
store i64 %0, i64* %4
store i64 %1, i64* %5
store i64 %2, i64* %6
%7 = load i64, i64* %5
%8 = icmp eq i64 %7, 0
br i1 %8, label %9, label %19
9: ; preds = %3
%10 = load i64, i64* %6
%11 = xor i64 %10, -1
%12 = load i64, i64* %4
%13 = add i64 %12, 258
%14 = inttoptr i64 %13 to i8*
%15 = load volatile i8, i8* %14
%16 = zext i8 %15 to i64
%17 = and i64 %16, %11
%18 = trunc i64 %17 to i8
store volatile i8 %18, i8* %14
br label %45
19: ; preds = %3
%20 = load i64, i64* %6
%21 = xor i64 %20, -1
%22 = load i64, i64* %4
%23 = add i64 %22, 274
%24 = load i64, i64* %5
%25 = sub i64 %24, 16
%26 = add i64 %23, %25
%27 = inttoptr i64 %26 to i8*
%28 = load volatile i8, i8* %27
%29 = zext i8 %28 to i64
%30 = and i64 %29, %21
%31 = trunc i64 %30 to i8
store volatile i8 %31, i8* %27
%32 = load i64, i64* %6
%33 = lshr i64 %32, 16
%34 = xor i64 %33, -1
%35 = load i64, i64* %4
%36 = add i64 %35, 278
%37 = load i64, i64* %5
%38 = sub i64 %37, 16
%39 = add i64 %36, %38
%40 = inttoptr i64 %39 to i8*
%41 = load volatile i8, i8* %40
%42 = zext i8 %41 to i64
%43 = and i64 %42, %34
%44 = trunc i64 %43 to i8
store volatile i8 %44, i8* %40
br label %45
45: ; preds = %19, %9
ret void
}

LLVM IR (-O2):
define void @USBHostEndpointStatusClear(i64 %0, i64 %1, i64 %2) {
%4 = icmp eq i64 %1, 0
br i1 %4, label %5, label %7
5: ; preds = %3
%6 = add i64 %0, 258
br label %18
7: ; preds = %3
%8 = add i64 %1, -16
%9 = add i64 %8, %0
%10 = add i64 %9, 274
%11 = inttoptr i64 %10 to i8*
%12 = load volatile i8, i8* %11
%13 = trunc i64 %2 to i8
%14 = xor i8 %13, -1
%15 = and i8 %12, %14
store volatile i8 %15, i8* %11
%16 = lshr i64 %2, 16
%17 = add i64 %9, 278
br label %18
18: ; preds = %7, %5
%19 = phi i64 [ %17, %7 ], [ %6, %5 ]
%20 = phi i64 [ %16, %7 ], [ %2, %5 ]
%21 = inttoptr i64 %19 to i8*
%22 = load volatile i8, i8* %21
%23 = trunc i64 %20 to i8
%24 = xor i8 %23, -1
%25 = and i8 %22, %24
store volatile i8 %25, i8* %21
ret void
}