void TimerBaseConfigure(unsigned long ulBase, unsigned long ulCountMode,
                        unsigned long ulCRRValue, unsigned long ulPrescaler,
                        unsigned long ulCLKDiv, unsigned long ulRepCnt) {
  unsigned long ulTempCR1;

  ;

  ;
  ;
  ;

  ;

  ulTempCR1 = (*((volatile unsigned long *)(ulBase + 0x00000000)));
  if ((ulBase == 0x40012C00) || (ulBase == 0x40013400) ||
      (ulBase == 0x40000000) || (ulBase == 0x40000400) ||
      (ulBase == 0x40000800) || (ulBase == 0x40000C00)) {
    ulTempCR1 &= ~(0x00000010 | 0x00000060);
    (*((volatile unsigned long *)(ulBase + 0x00000000))) = ulTempCR1;
    ulTempCR1 |= ulCountMode;
  }
  if ((ulBase != 0x40001000) && (ulBase != 0x40001400)) {
    ulTempCR1 &= ~0x00000300;
    ulTempCR1 |= ulCLKDiv;
  }
  (*((volatile unsigned long *)(ulBase + 0x00000000))) = ulTempCR1;
  (*((volatile unsigned long *)(ulBase + 0x0000002C))) = ulCRRValue;
  (*((volatile unsigned long *)(ulBase + 0x00000028))) = ulPrescaler;
  if ((ulBase == 0x40012C00) || (ulBase == 0x40013400)) {
    (*((volatile unsigned long *)(ulBase + 0x00000030))) = ulRepCnt;
  }
  (*((volatile unsigned long *)(ulBase + 0x00000014))) = 0x00000001;
}


x86 assembly (clang, -O0):
<TimerBaseConfigure>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x40012c00,-0x8(%rbp)
40
je     117b <TimerBaseConfigure+0x7b>
cmpq   $0x40013400,-0x8(%rbp)
40
je     117b <TimerBaseConfigure+0x7b>
cmpq   $0x40000000,-0x8(%rbp)
40
je     117b <TimerBaseConfigure+0x7b>
cmpq   $0x40000400,-0x8(%rbp)
40
je     117b <TimerBaseConfigure+0x7b>
cmpq   $0x40000800,-0x8(%rbp)
40
je     117b <TimerBaseConfigure+0x7b>
cmpq   $0x40000c00,-0x8(%rbp)
40
jne    119e <TimerBaseConfigure+0x9e>
mov    -0x38(%rbp),%rax
and    $0xffffffffffffff8f,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
or     -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x40001000,-0x8(%rbp)
40
je     11d4 <TimerBaseConfigure+0xd4>
cmpq   $0x40001400,-0x8(%rbp)
40
je     11d4 <TimerBaseConfigure+0xd4>
mov    -0x38(%rbp),%rax
and    $0xfffffffffffffcff,%rax
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%rax
or     -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x2c(%rax)
mov    -0x20(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x28(%rax)
cmpq   $0x40012c00,-0x8(%rbp)
40
je     1213 <TimerBaseConfigure+0x113>
cmpq   $0x40013400,-0x8(%rbp)
40
jne    121f <TimerBaseConfigure+0x11f>
mov    -0x30(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x30(%rax)
mov    -0x8(%rbp),%rax
movq   $0x1,0x14(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<TimerBaseConfigure>:
mov    (%rdi),%r10
cmp    $0x40000bff,%rdi
jg     1129 <TimerBaseConfigure+0x29>
cmp    $0x40000000,%rdi
je     1144 <TimerBaseConfigure+0x44>
cmp    $0x40000400,%rdi
je     1144 <TimerBaseConfigure+0x44>
cmp    $0x40000800,%rdi
je     1144 <TimerBaseConfigure+0x44>
jmp    114e <TimerBaseConfigure+0x4e>
cmp    $0x40000c00,%rdi
je     1144 <TimerBaseConfigure+0x44>
cmp    $0x40013400,%rdi
je     1144 <TimerBaseConfigure+0x44>
cmp    $0x40012c00,%rdi
jne    114e <TimerBaseConfigure+0x4e>
and    $0xffffffffffffff8f,%r10
mov    %r10,(%rdi)
or     %rsi,%r10
mov    %rdi,%rsi
and    $0xfffffffffffffbff,%rsi
mov    %r10,%rax
and    $0xfffffffffffffcff,%rax
or     %r8,%rax
cmp    $0x40001000,%rsi
cmove  %r10,%rax
mov    %rax,(%rdi)
mov    %rdx,0x2c(%rdi)
mov    %rcx,0x28(%rdi)
cmp    $0x40013400,%rdi
je     118c <TimerBaseConfigure+0x8c>
cmp    $0x40012c00,%rdi
jne    1190 <TimerBaseConfigure+0x90>
mov    %r9,0x30(%rdi)
movq   $0x1,0x14(%rdi)
ret

LLVM IR (-O0):
define void @TimerBaseConfigure(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5) {
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
%10 = alloca i64
%11 = alloca i64
%12 = alloca i64
%13 = alloca i64
store i64 %0, i64* %7
store i64 %1, i64* %8
store i64 %2, i64* %9
store i64 %3, i64* %10
store i64 %4, i64* %11
store i64 %5, i64* %12
%14 = load i64, i64* %7
%15 = add i64 %14, 0
%16 = inttoptr i64 %15 to i64*
%17 = load volatile i64, i64* %16
store i64 %17, i64* %13
%18 = load i64, i64* %7
%19 = icmp eq i64 %18, 1073818624
br i1 %19, label %35, label %20
20: ; preds = %6
%21 = load i64, i64* %7
%22 = icmp eq i64 %21, 1073820672
br i1 %22, label %35, label %23
23: ; preds = %20
%24 = load i64, i64* %7
%25 = icmp eq i64 %24, 1073741824
br i1 %25, label %35, label %26
26: ; preds = %23
%27 = load i64, i64* %7
%28 = icmp eq i64 %27, 1073742848
br i1 %28, label %35, label %29
29: ; preds = %26
%30 = load i64, i64* %7
%31 = icmp eq i64 %30, 1073743872
br i1 %31, label %35, label %32
32: ; preds = %29
%33 = load i64, i64* %7
%34 = icmp eq i64 %33, 1073744896
br i1 %34, label %35, label %45
35: ; preds = %32, %29, %26, %23, %20, %6
%36 = load i64, i64* %13
%37 = and i64 %36, -113
store i64 %37, i64* %13
%38 = load i64, i64* %13
%39 = load i64, i64* %7
%40 = add i64 %39, 0
%41 = inttoptr i64 %40 to i64*
store volatile i64 %38, i64* %41
%42 = load i64, i64* %8
%43 = load i64, i64* %13
%44 = or i64 %43, %42
store i64 %44, i64* %13
br label %45
45: ; preds = %35, %32
%46 = load i64, i64* %7
%47 = icmp ne i64 %46, 1073745920
br i1 %47, label %48, label %57
48: ; preds = %45
%49 = load i64, i64* %7
%50 = icmp ne i64 %49, 1073746944
br i1 %50, label %51, label %57
51: ; preds = %48
%52 = load i64, i64* %13
%53 = and i64 %52, -769
store i64 %53, i64* %13
%54 = load i64, i64* %11
%55 = load i64, i64* %13
%56 = or i64 %55, %54
store i64 %56, i64* %13
br label %57
57: ; preds = %51, %48, %45
%58 = load i64, i64* %13
%59 = load i64, i64* %7
%60 = add i64 %59, 0
%61 = inttoptr i64 %60 to i64*
store volatile i64 %58, i64* %61
%62 = load i64, i64* %9
%63 = load i64, i64* %7
%64 = add i64 %63, 44
%65 = inttoptr i64 %64 to i64*
store volatile i64 %62, i64* %65
%66 = load i64, i64* %10
%67 = load i64, i64* %7
%68 = add i64 %67, 40
%69 = inttoptr i64 %68 to i64*
store volatile i64 %66, i64* %69
%70 = load i64, i64* %7
%71 = icmp eq i64 %70, 1073818624
br i1 %71, label %75, label %72
72: ; preds = %57
%73 = load i64, i64* %7
%74 = icmp eq i64 %73, 1073820672
br i1 %74, label %75, label %80
75: ; preds = %72, %57
%76 = load i64, i64* %12
%77 = load i64, i64* %7
%78 = add i64 %77, 48
%79 = inttoptr i64 %78 to i64*
store volatile i64 %76, i64* %79
br label %80
80: ; preds = %75, %72
%81 = load i64, i64* %7
%82 = add i64 %81, 20
%83 = inttoptr i64 %82 to i64*
store volatile i64 1, i64* %83
ret void
}

LLVM IR (-O2):
define void @TimerBaseConfigure(i64 %0, i64 %1, i64 %2, i64 %3, i64 %4, i64 %5) {
%7 = inttoptr i64 %0 to i64*
%8 = load volatile i64, i64* %7
switch i64 %0, label %12 [
i64 1073820672, label %9
i64 1073818624, label %9
i64 1073744896, label %9
i64 1073743872, label %9
i64 1073742848, label %9
i64 1073741824, label %9
]
9: ; preds = %6, %6, %6, %6, %6, %6
%10 = and i64 %8, -113
store volatile i64 %10, i64* %7
%11 = or i64 %10, %1
br label %12
12: ; preds = %6, %9
%13 = phi i64 [ %11, %9 ], [ %8, %6 ]
%14 = and i64 %0, -1025
%15 = icmp eq i64 %14, 1073745920
%16 = and i64 %13, -769
%17 = or i64 %16, %4
%18 = select i1 %15, i64 %13, i64 %17
store volatile i64 %18, i64* %7
%19 = add i64 %0, 44
%20 = inttoptr i64 %19 to i64*
store volatile i64 %2, i64* %20
%21 = add i64 %0, 40
%22 = inttoptr i64 %21 to i64*
store volatile i64 %3, i64* %22
switch i64 %0, label %26 [
i64 1073820672, label %23
i64 1073818624, label %23
]
23: ; preds = %12, %12
%24 = add nuw nsw i64 %0, 48
%25 = inttoptr i64 %24 to i64*
store volatile i64 %5, i64* %25
br label %26
26: ; preds = %12, %23
%27 = add i64 %0, 20
%28 = inttoptr i64 %27 to i64*
store volatile i64 1, i64* %28
ret void
}