void TimerOCxRefClear(unsigned long ulBase, unsigned long ulChannel,
                      unsigned long ulOCClear) {
  unsigned long ulTempccmr = 0;

  ;

  ;

  ;
  if ((ulChannel == 1) || (ulChannel == 2)) {
    ulTempccmr = (*((volatile unsigned long *)(ulBase + 0x00000018)));
    if (ulChannel == 1) {
      ulTempccmr &= ~0x00000080;
      ulTempccmr |= ulOCClear;
    } else {
      ulTempccmr &= ~0x00008000;
      ulTempccmr |= (ulOCClear << 8);
    }
    (*((volatile unsigned long *)(ulBase + 0x00000018))) = ulTempccmr;
  } else {
    ulTempccmr = (*((volatile unsigned long *)(ulBase + 0x0000001C)));
    if (ulChannel == 3) {
      ulTempccmr &= ~0x00000080;
      ulTempccmr |= ulOCClear;
    } else {
      ulTempccmr &= ~0x00008000;
      ulTempccmr |= (ulOCClear << 8);
    }
    (*((volatile unsigned long *)(ulBase + 0x0000001C))) = ulTempccmr;
  }
}


x86 assembly (clang, -O0):
<TimerOCxRefClear>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movq   $0x0,-0x20(%rbp)
cmpq   $0x1,-0x10(%rbp)
je     112e <TimerOCxRefClear+0x2e>
cmpq   $0x2,-0x10(%rbp)
jne    1193 <TimerOCxRefClear+0x93>
mov    -0x8(%rbp),%rax
mov    0x18(%rax),%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x1,-0x10(%rbp)
jne    1164 <TimerOCxRefClear+0x64>
mov    -0x20(%rbp),%rax
and    $0xffffffffffffff7f,%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
or     -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    1182 <TimerOCxRefClear+0x82>
mov    -0x20(%rbp),%rax
and    $0xffffffffffff7fff,%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
shl    $0x8,%rax
or     -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x18(%rax)
jmp    11f3 <TimerOCxRefClear+0xf3>
mov    -0x8(%rbp),%rax
mov    0x1c(%rax),%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x3,-0x10(%rbp)
jne    11c9 <TimerOCxRefClear+0xc9>
mov    -0x20(%rbp),%rax
and    $0xffffffffffffff7f,%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
or     -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    11e7 <TimerOCxRefClear+0xe7>
mov    -0x20(%rbp),%rax
and    $0xffffffffffff7fff,%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
shl    $0x8,%rax
or     -0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x1c(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<TimerOCxRefClear>:
lea    -0x1(%rsi),%rax
cmp    $0x1,%rax
ja     1122 <TimerOCxRefClear+0x22>
mov    0x18(%rdi),%rax
cmp    $0x1,%rsi
jne    1134 <TimerOCxRefClear+0x34>
and    $0xffffffffffffff7f,%rax
or     %rdx,%rax
mov    %rax,0x18(%rdi)
ret
mov    0x1c(%rdi),%rax
cmp    $0x3,%rsi
jne    1146 <TimerOCxRefClear+0x46>
and    $0xffffffffffffff7f,%rax
jmp    1150 <TimerOCxRefClear+0x50>
and    $0xffffffffffff7fff,%rax
shl    $0x8,%rdx
or     %rax,%rdx
mov    %rdx,0x18(%rdi)
ret
and    $0xffffffffffff7fff,%rax
shl    $0x8,%rdx
or     %rdx,%rax
mov    %rax,0x1c(%rdi)
ret

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

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