void PWMOutputDisable(unsigned long ulBase, unsigned long ulChannel) {
  ;
  ;
  (*((volatile unsigned long *)(ulBase + 0x00000000))) &= ~0x00000080;
  (*((volatile unsigned long *)(ulBase + 0x00000018 + (ulChannel / 2) * 4))) &=
      ~(0x00000008 << (ulChannel % 2) * 8);
  (*((volatile unsigned long *)(ulBase + 0x00000020))) &=
      ~(1 << (ulChannel * 4));
}


x86 assembly (clang, -O0):
<PWMOutputDisable>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
and    $0xffffffffffffff7f,%rcx
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
and    $0x1,%rax
shl    $0x3,%rax
mov    %eax,%ecx
mov    $0x8,%eax
shl    %cl,%eax
xor    $0xffffffff,%eax
movslq %eax,%rdx
mov    -0x8(%rbp),%rax
add    $0x18,%rax
mov    -0x10(%rbp),%rcx
shr    $0x1,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    (%rax),%rcx
and    %rdx,%rcx
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
shl    $0x2,%rax
mov    %eax,%ecx
mov    $0x1,%eax
shl    %cl,%eax
xor    $0xffffffff,%eax
movslq %eax,%rdx
mov    -0x8(%rbp),%rax
mov    0x20(%rax),%rcx
and    %rdx,%rcx
mov    %rcx,0x20(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<PWMOutputDisable>:
andq   $0xffffffffffffff7f,(%rdi)
lea    0x0(,%rsi,8),%ecx
and    $0x8,%cl
mov    $0x8,%eax
shl    %cl,%eax
not    %eax
cltq
lea    0x0(,%rsi,4),%ecx
and    $0xfffffffffffffffe,%rsi
and    %rax,0x18(%rdi,%rsi,2)
mov    $0xfffffffe,%eax
rol    %cl,%eax
cltq
and    %rax,0x20(%rdi)
ret

LLVM IR (-O0):
define void @PWMOutputDisable(i64 %0, i64 %1) {
%3 = alloca i64
%4 = alloca i64
store i64 %0, i64* %3
store i64 %1, i64* %4
%5 = load i64, i64* %3
%6 = add i64 %5, 0
%7 = inttoptr i64 %6 to i64*
%8 = load volatile i64, i64* %7
%9 = and i64 %8, -129
store volatile i64 %9, i64* %7
%10 = load i64, i64* %4
%11 = urem i64 %10, 2
%12 = mul i64 %11, 8
%13 = trunc i64 %12 to i32
%14 = shl i32 8, %13
%15 = xor i32 %14, -1
%16 = sext i32 %15 to i64
%17 = load i64, i64* %3
%18 = add i64 %17, 24
%19 = load i64, i64* %4
%20 = udiv i64 %19, 2
%21 = mul i64 %20, 4
%22 = add i64 %18, %21
%23 = inttoptr i64 %22 to i64*
%24 = load volatile i64, i64* %23
%25 = and i64 %24, %16
store volatile i64 %25, i64* %23
%26 = load i64, i64* %4
%27 = mul i64 %26, 4
%28 = trunc i64 %27 to i32
%29 = shl i32 1, %28
%30 = xor i32 %29, -1
%31 = sext i32 %30 to i64
%32 = load i64, i64* %3
%33 = add i64 %32, 32
%34 = inttoptr i64 %33 to i64*
%35 = load volatile i64, i64* %34
%36 = and i64 %35, %31
store volatile i64 %36, i64* %34
ret void
}

LLVM IR (-O2):
define void @PWMOutputDisable(i64 %0, i64 %1) {
%3 = inttoptr i64 %0 to i64*
%4 = load volatile i64, i64* %3
%5 = and i64 %4, -129
store volatile i64 %5, i64* %3
%6 = trunc i64 %1 to i32
%7 = shl i32 %6, 3
%8 = and i32 %7, 8
%9 = shl nuw nsw i32 8, %8
%10 = xor i32 %9, -1
%11 = sext i32 %10 to i64
%12 = add i64 %0, 24
%13 = shl i64 %1, 1
%14 = and i64 %13, -4
%15 = add i64 %12, %14
%16 = inttoptr i64 %15 to i64*
%17 = load volatile i64, i64* %16
%18 = and i64 %17, %11
store volatile i64 %18, i64* %16
%19 = shl i32 %6, 2
%20 = shl nuw i32 1, %19
%21 = xor i32 %20, -1
%22 = sext i32 %21 to i64
%23 = add i64 %0, 32
%24 = inttoptr i64 %23 to i64*
%25 = load volatile i64, i64* %24
%26 = and i64 %25, %22
store volatile i64 %26, i64* %24
ret void
}