void TimerEncoderInterfaceConfigure(unsigned long ulBase,
                                    unsigned long ulEncoderMode,
                                    unsigned long ulIC1Polarity,
                                    unsigned long ulIC2Polarity) {
  unsigned long ulTempsmcr = 0, ulTempccmr1 = 0, ulTempccer = 0;

  ;

  ;

  ;

  ;
  (*((volatile unsigned long *)(ulBase + 0x00000020))) &=
      ~(0x00000001 | 0x00000010);
  ulTempsmcr = (*((volatile unsigned long *)(ulBase + 0x00000008)));
  ulTempccmr1 = (*((volatile unsigned long *)(ulBase + 0x00000018)));
  ulTempccer = (*((volatile unsigned long *)(ulBase + 0x00000020)));
  ulTempsmcr &= ~0x00000007;
  ulTempsmcr |= ulEncoderMode;
  ulTempccmr1 &= ~(0x00000003 | 0x00000300);
  ulTempccmr1 |= (0x00000001 | 0x00000100);
  ulTempccer &= ~(0x00000002 | 0x00000020);
  ulTempccer |= (ulIC1Polarity | (ulIC2Polarity << 4));
  (*((volatile unsigned long *)(ulBase + 0x00000008))) = ulTempsmcr;
  (*((volatile unsigned long *)(ulBase + 0x00000018))) = ulTempccmr1;
  (*((volatile unsigned long *)(ulBase + 0x00000020))) = ulTempccer;
  (*((volatile unsigned long *)(ulBase + 0x00000020))) |=
      0x00000001 | 0x00000010;
}


x86 assembly (clang, -O0):
<TimerEncoderInterfaceConfigure>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movq   $0x0,-0x28(%rbp)
movq   $0x0,-0x30(%rbp)
movq   $0x0,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    0x20(%rax),%rcx
and    $0xffffffffffffffee,%rcx
mov    %rcx,0x20(%rax)
mov    -0x8(%rbp),%rax
mov    0x8(%rax),%rax
mov    %rax,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    0x18(%rax),%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    0x20(%rax),%rax
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%rax
and    $0xfffffffffffffff8,%rax
mov    %rax,-0x28(%rbp)
mov    -0x10(%rbp),%rax
or     -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
and    $0xfffffffffffffcfc,%rax
mov    %rax,-0x30(%rbp)
mov    -0x30(%rbp),%rax
or     $0x101,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
and    $0xffffffffffffffdd,%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x20(%rbp),%rcx
shl    $0x4,%rcx
or     %rcx,%rax
or     -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x28(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x8(%rax)
mov    -0x30(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x18(%rax)
mov    -0x38(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x20(%rax)
mov    -0x8(%rbp),%rax
mov    0x20(%rax),%rcx
or     $0x11,%rcx
mov    %rcx,0x20(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<TimerEncoderInterfaceConfigure>:
andq   $0xffffffffffffffee,0x20(%rdi)
mov    0x8(%rdi),%rax
mov    $0xfffffffffffffcfc,%r8
and    0x18(%rdi),%r8
mov    0x20(%rdi),%r9
and    $0xfffffffffffffff8,%rax
or     %rsi,%rax
or     $0x101,%r8
and    $0xffffffffffffffdd,%r9
shl    $0x4,%rcx
or     %rdx,%rcx
or     %r9,%rcx
mov    %rax,0x8(%rdi)
mov    %r8,0x18(%rdi)
mov    %rcx,0x20(%rdi)
orq    $0x11,0x20(%rdi)
ret

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

LLVM IR (-O2):
define void @TimerEncoderInterfaceConfigure(i64 %0, i64 %1, i64 %2, i64 %3) {
%5 = add i64 %0, 32
%6 = inttoptr i64 %5 to i64*
%7 = load volatile i64, i64* %6
%8 = and i64 %7, -18
store volatile i64 %8, i64* %6
%9 = add i64 %0, 8
%10 = inttoptr i64 %9 to i64*
%11 = load volatile i64, i64* %10
%12 = add i64 %0, 24
%13 = inttoptr i64 %12 to i64*
%14 = load volatile i64, i64* %13
%15 = load volatile i64, i64* %6
%16 = and i64 %11, -8
%17 = or i64 %16, %1
%18 = and i64 %14, -772
%19 = or i64 %18, 257
%20 = and i64 %15, -35
%21 = shl i64 %3, 4
%22 = or i64 %21, %2
%23 = or i64 %22, %20
store volatile i64 %17, i64* %10
store volatile i64 %19, i64* %13
store volatile i64 %23, i64* %6
%24 = load volatile i64, i64* %6
%25 = or i64 %24, 17
store volatile i64 %25, i64* %6
ret void
}