void USBIntEnable(unsigned long ulBase, unsigned long ulFlags) {
  ;
  ;
  if (ulFlags & (0x0000000E | 0x0000000E | 0x00000001)) {
    (*((volatile unsigned short *)(ulBase + 0x00000006))) |=
        ulFlags & (0x0000000E | 0x0000000E | 0x00000001);
  }
  if (ulFlags & (0x00000E00 | 0x00000E00)) {
    (*((volatile unsigned short *)(ulBase + 0x00000008))) |=
        ((ulFlags & (0x00000E00 | 0x00000E00)) >> 8);
  }
  if (ulFlags & 0xFF000000) {
    (*((volatile unsigned char *)(ulBase + 0x0000000B))) |=
        (ulFlags & 0xFF000000) >> 24;
  }
  if (ulFlags & 0x00010000) {
    (*((volatile unsigned long *)(ulBase + 0x00000408))) = 0x00000001;
  }
  if (ulFlags & 0x00020000) {
    (*((volatile unsigned long *)(0x40050000 + 0x00000448))) = 0x00000001;
  }
}


x86 assembly (clang, -O0):
<USBIntEnable>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
and    $0xf,%rax
cmp    $0x0,%rax
je     1138 <USBIntEnable+0x38>
mov    -0x10(%rbp),%rdx
and    $0xf,%rdx
mov    -0x8(%rbp),%rax
mov    0x6(%rax),%cx
movzwl %cx,%ecx
or     %rdx,%rcx
mov    %cx,0x6(%rax)
mov    -0x10(%rbp),%rax
and    $0xe00,%rax
cmp    $0x0,%rax
je     116d <USBIntEnable+0x6d>
mov    -0x10(%rbp),%rdx
and    $0xe00,%rdx
shr    $0x8,%rdx
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%cx
movzwl %cx,%ecx
or     %rdx,%rcx
mov    %cx,0x8(%rax)
movabs $0xff000000,%rax
and    -0x10(%rbp),%rax
cmp    $0x0,%rax
je     11a7 <USBIntEnable+0xa7>
movabs $0xff000000,%rdx
and    -0x10(%rbp),%rdx
shr    $0x18,%rdx
mov    -0x8(%rbp),%rax
mov    0xb(%rax),%cl
movzbl %cl,%ecx
or     %rdx,%rcx
mov    %cl,0xb(%rax)
mov    -0x10(%rbp),%rax
and    $0x10000,%rax
cmp    $0x0,%rax
je     11ca <USBIntEnable+0xca>
mov    -0x8(%rbp),%rax
movq   $0x1,0x408(%rax)
mov    -0x10(%rbp),%rax
and    $0x20000,%rax
cmp    $0x0,%rax
je     11ea <USBIntEnable+0xea>
mov    $0x40050448,%eax
movq   $0x1,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<USBIntEnable>:
mov    %rsi,%rax
and    $0xf,%rax
je     110d <USBIntEnable+0xd>
or     %ax,0x6(%rdi)
mov    %rsi,%rax
and    $0xe00,%rax
je     1120 <USBIntEnable+0x20>
shr    $0x8,%rax
or     %ax,0x8(%rdi)
mov    $0xff000000,%eax
and    %rsi,%rax
je     1131 <USBIntEnable+0x31>
shr    $0x18,%rax
or     %al,0xb(%rdi)
test   $0x10000,%esi
jne    1142 <USBIntEnable+0x42>
test   $0x20000,%esi
jne    1155 <USBIntEnable+0x55>
ret
movq   $0x1,0x408(%rdi)
test   $0x20000,%esi
je     1141 <USBIntEnable+0x41>
movq   $0x1,0x40050448
ret

LLVM IR (-O0):
define void @USBIntEnable(i64 %0, i64 %1) {
%3 = alloca i64
%4 = alloca i64
store i64 %0, i64* %3
store i64 %1, i64* %4
%5 = load i64, i64* %4
%6 = and i64 %5, 15
%7 = icmp ne i64 %6, 0
br i1 %7, label %8, label %18
8: ; preds = %2
%9 = load i64, i64* %4
%10 = and i64 %9, 15
%11 = load i64, i64* %3
%12 = add i64 %11, 6
%13 = inttoptr i64 %12 to i16*
%14 = load volatile i16, i16* %13
%15 = zext i16 %14 to i64
%16 = or i64 %15, %10
%17 = trunc i64 %16 to i16
store volatile i16 %17, i16* %13
br label %18
18: ; preds = %8, %2
%19 = load i64, i64* %4
%20 = and i64 %19, 3584
%21 = icmp ne i64 %20, 0
br i1 %21, label %22, label %33
22: ; preds = %18
%23 = load i64, i64* %4
%24 = and i64 %23, 3584
%25 = lshr i64 %24, 8
%26 = load i64, i64* %3
%27 = add i64 %26, 8
%28 = inttoptr i64 %27 to i16*
%29 = load volatile i16, i16* %28
%30 = zext i16 %29 to i64
%31 = or i64 %30, %25
%32 = trunc i64 %31 to i16
store volatile i16 %32, i16* %28
br label %33
33: ; preds = %22, %18
%34 = load i64, i64* %4
%35 = and i64 %34, 4278190080
%36 = icmp ne i64 %35, 0
br i1 %36, label %37, label %48
37: ; preds = %33
%38 = load i64, i64* %4
%39 = and i64 %38, 4278190080
%40 = lshr i64 %39, 24
%41 = load i64, i64* %3
%42 = add i64 %41, 11
%43 = inttoptr i64 %42 to i8*
%44 = load volatile i8, i8* %43
%45 = zext i8 %44 to i64
%46 = or i64 %45, %40
%47 = trunc i64 %46 to i8
store volatile i8 %47, i8* %43
br label %48
48: ; preds = %37, %33
%49 = load i64, i64* %4
%50 = and i64 %49, 65536
%51 = icmp ne i64 %50, 0
br i1 %51, label %52, label %56
52: ; preds = %48
%53 = load i64, i64* %3
%54 = add i64 %53, 1032
%55 = inttoptr i64 %54 to i64*
store volatile i64 1, i64* %55
br label %56
56: ; preds = %52, %48
%57 = load i64, i64* %4
%58 = and i64 %57, 131072
%59 = icmp ne i64 %58, 0
br i1 %59, label %60, label %61
60: ; preds = %56
store volatile i64 1, i64* inttoptr (i64 1074070600 to i64*)
br label %61
61: ; preds = %60, %56
ret void
}

LLVM IR (-O2):
define void @USBIntEnable(i64 %0, i64 %1) {
%3 = and i64 %1, 15
%4 = icmp eq i64 %3, 0
br i1 %4, label %11, label %5
5: ; preds = %2
%6 = add i64 %0, 6
%7 = inttoptr i64 %6 to i16*
%8 = load volatile i16, i16* %7
%9 = trunc i64 %3 to i16
%10 = or i16 %8, %9
store volatile i16 %10, i16* %7
br label %11
11: ; preds = %5, %2
%12 = and i64 %1, 3584
%13 = icmp eq i64 %12, 0
br i1 %13, label %21, label %14
14: ; preds = %11
%15 = lshr exact i64 %12, 8
%16 = add i64 %0, 8
%17 = inttoptr i64 %16 to i16*
%18 = load volatile i16, i16* %17
%19 = trunc i64 %15 to i16
%20 = or i16 %18, %19
store volatile i16 %20, i16* %17
br label %21
21: ; preds = %14, %11
%22 = and i64 %1, 4278190080
%23 = icmp eq i64 %22, 0
br i1 %23, label %31, label %24
24: ; preds = %21
%25 = lshr exact i64 %22, 24
%26 = add i64 %0, 11
%27 = inttoptr i64 %26 to i8*
%28 = load volatile i8, i8* %27
%29 = trunc i64 %25 to i8
%30 = or i8 %28, %29
store volatile i8 %30, i8* %27
br label %31
31: ; preds = %24, %21
%32 = and i64 %1, 65536
%33 = icmp eq i64 %32, 0
br i1 %33, label %37, label %34
34: ; preds = %31
%35 = add i64 %0, 1032
%36 = inttoptr i64 %35 to i64*
store volatile i64 1, i64* %36
br label %37
37: ; preds = %34, %31
%38 = and i64 %1, 131072
%39 = icmp eq i64 %38, 0
br i1 %39, label %41, label %40
40: ; preds = %37
store volatile i64 1, i64* inttoptr (i64 1074070600 to i64*)
br label %41
41: ; preds = %40, %37
ret void
}