void ADCMonitorSet(unsigned long ulBase, unsigned long ulHighThreshold,
                   unsigned long ulLowThreshold, unsigned long ulMoniChannel) {
  ;
  ;
  ;
  (*((volatile unsigned long *)(ulBase + 0x00000024))) &= ~0x00000FFF;
  (*((volatile unsigned long *)(ulBase + 0x00000024))) |= ulHighThreshold;
  (*((volatile unsigned long *)(ulBase + 0x00000028))) &= ~0x00000FFF;
  (*((volatile unsigned long *)(ulBase + 0x00000028))) |= ulLowThreshold;
  if (ulMoniChannel == 0x00000100) {
    (*((volatile unsigned long *)(ulBase + 0x00000004))) &= ~0x00000200;
  } else {
    (*((volatile unsigned long *)(ulBase + 0x00000004))) |= 0x00000200;
    (*((volatile unsigned long *)(ulBase + 0x00000004))) &= ~0x0000001F;
    (*((volatile unsigned long *)(ulBase + 0x00000004))) |= ulMoniChannel;
  }
}


x86 assembly (clang, -O0):
<ADCMonitorSet>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    0x24(%rax),%rcx
and    $0xfffffffffffff000,%rcx
mov    %rcx,0x24(%rax)
mov    -0x10(%rbp),%rdx
mov    -0x8(%rbp),%rax
mov    0x24(%rax),%rcx
or     %rdx,%rcx
mov    %rcx,0x24(%rax)
mov    -0x8(%rbp),%rax
mov    0x28(%rax),%rcx
and    $0xfffffffffffff000,%rcx
mov    %rcx,0x28(%rax)
mov    -0x18(%rbp),%rdx
mov    -0x8(%rbp),%rax
mov    0x28(%rax),%rcx
or     %rdx,%rcx
mov    %rcx,0x28(%rax)
cmpq   $0x100,-0x20(%rbp)
jne    1186 <ADCMonitorSet+0x86>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%rcx
and    $0xfffffffffffffdff,%rcx
mov    %rcx,0x4(%rax)
jmp    11bc <ADCMonitorSet+0xbc>
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%rcx
or     $0x200,%rcx
mov    %rcx,0x4(%rax)
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%rcx
and    $0xffffffffffffffe0,%rcx
mov    %rcx,0x4(%rax)
mov    -0x20(%rbp),%rdx
mov    -0x8(%rbp),%rax
mov    0x4(%rax),%rcx
or     %rdx,%rcx
mov    %rcx,0x4(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<ADCMonitorSet>:
andq   $0xfffffffffffff000,0x24(%rdi)
ff
or     %rsi,0x24(%rdi)
andq   $0xfffffffffffff000,0x28(%rdi)
ff
or     %rdx,0x28(%rdi)
mov    0x4(%rdi),%rax
cmp    $0x100,%rcx
jne    1130 <ADCMonitorSet+0x30>
and    $0xfffffffffffffdff,%rax
mov    %rax,0x4(%rdi)
ret
or     $0x200,%rax
mov    %rax,0x4(%rdi)
andq   $0xffffffffffffffe0,0x4(%rdi)
or     0x4(%rdi),%rcx
mov    %rcx,0x4(%rdi)
ret

LLVM IR (-O0):
define void @ADCMonitorSet(i64 %0, i64 %1, i64 %2, i64 %3) {
%5 = alloca i64
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
store i64 %0, i64* %5
store i64 %1, i64* %6
store i64 %2, i64* %7
store i64 %3, i64* %8
%9 = load i64, i64* %5
%10 = add i64 %9, 36
%11 = inttoptr i64 %10 to i64*
%12 = load volatile i64, i64* %11
%13 = and i64 %12, -4096
store volatile i64 %13, i64* %11
%14 = load i64, i64* %6
%15 = load i64, i64* %5
%16 = add i64 %15, 36
%17 = inttoptr i64 %16 to i64*
%18 = load volatile i64, i64* %17
%19 = or i64 %18, %14
store volatile i64 %19, i64* %17
%20 = load i64, i64* %5
%21 = add i64 %20, 40
%22 = inttoptr i64 %21 to i64*
%23 = load volatile i64, i64* %22
%24 = and i64 %23, -4096
store volatile i64 %24, i64* %22
%25 = load i64, i64* %7
%26 = load i64, i64* %5
%27 = add i64 %26, 40
%28 = inttoptr i64 %27 to i64*
%29 = load volatile i64, i64* %28
%30 = or i64 %29, %25
store volatile i64 %30, i64* %28
%31 = load i64, i64* %8
%32 = icmp eq i64 %31, 256
br i1 %32, label %33, label %39
33: ; preds = %4
%34 = load i64, i64* %5
%35 = add i64 %34, 4
%36 = inttoptr i64 %35 to i64*
%37 = load volatile i64, i64* %36
%38 = and i64 %37, -513
store volatile i64 %38, i64* %36
br label %56
39: ; preds = %4
%40 = load i64, i64* %5
%41 = add i64 %40, 4
%42 = inttoptr i64 %41 to i64*
%43 = load volatile i64, i64* %42
%44 = or i64 %43, 512
store volatile i64 %44, i64* %42
%45 = load i64, i64* %5
%46 = add i64 %45, 4
%47 = inttoptr i64 %46 to i64*
%48 = load volatile i64, i64* %47
%49 = and i64 %48, -32
store volatile i64 %49, i64* %47
%50 = load i64, i64* %8
%51 = load i64, i64* %5
%52 = add i64 %51, 4
%53 = inttoptr i64 %52 to i64*
%54 = load volatile i64, i64* %53
%55 = or i64 %54, %50
store volatile i64 %55, i64* %53
br label %56
56: ; preds = %39, %33
ret void
}

LLVM IR (-O2):
define void @ADCMonitorSet(i64 %0, i64 %1, i64 %2, i64 %3) {
%5 = add i64 %0, 36
%6 = inttoptr i64 %5 to i64*
%7 = load volatile i64, i64* %6
%8 = and i64 %7, -4096
store volatile i64 %8, i64* %6
%9 = load volatile i64, i64* %6
%10 = or i64 %9, %1
store volatile i64 %10, i64* %6
%11 = add i64 %0, 40
%12 = inttoptr i64 %11 to i64*
%13 = load volatile i64, i64* %12
%14 = and i64 %13, -4096
store volatile i64 %14, i64* %12
%15 = load volatile i64, i64* %12
%16 = or i64 %15, %2
store volatile i64 %16, i64* %12
%17 = icmp eq i64 %3, 256
%18 = add i64 %0, 4
%19 = inttoptr i64 %18 to i64*
%20 = load volatile i64, i64* %19
br i1 %17, label %21, label %23
21: ; preds = %4
%22 = and i64 %20, -513
br label %29
23: ; preds = %4
%24 = or i64 %20, 512
store volatile i64 %24, i64* %19
%25 = load volatile i64, i64* %19
%26 = and i64 %25, -32
store volatile i64 %26, i64* %19
%27 = load volatile i64, i64* %19
%28 = or i64 %27, %3
br label %29
29: ; preds = %23, %21
%30 = phi i64 [ %28, %23 ], [ %22, %21 ]
store volatile i64 %30, i64* %19
ret void
}