void PECIConfigSet(unsigned long ulBase, unsigned long ulPECIClk,
                   unsigned long ulBaud, unsigned long ulPoll,
                   unsigned long ulOffset, unsigned long ulRetry) {
  unsigned long ulTemp, ulDiv;
  ;
  ;

  ;

  ;
  ulTemp = ((ulOffset << 16) & 0xFFFF0000);
  ulTemp |= ((ulRetry << 12) & 0x00007000);
  (*((volatile unsigned long *)(ulBase + 0x00000000))) = ulTemp;
  ulDiv = (ulPECIClk + (4 * ulBaud) - 1) / (4 * ulBaud);
  ulDiv = (ulDiv < 8) ? 8 : ulDiv;
  ulDiv = (ulDiv > 65535) ? 65535 : ulDiv;
  ulTemp = ((ulDiv << 16) & 0xFFFF0000);
  ulDiv =
      ((ulPoll == 0) ? 0
                     : ((((ulPECIClk * ulPoll) / 1000) + (4096 - 1)) / 4096));
  ulTemp |= ((ulDiv << 0) & 0x0000FFFF);
  ;
  (*((volatile unsigned long *)(ulBase + 0x00000004))) = ulTemp;
}


x86 assembly (clang, -O0):
<PECIConfigSet>:
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    -0x28(%rbp),%rax
shl    $0x10,%rax
movabs $0xffff0000,%rcx
and    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x30(%rbp),%rax
shl    $0xc,%rax
and    $0x7000,%rax
or     -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
mov    -0x18(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
sub    $0x1,%rax
mov    -0x18(%rbp),%rcx
shl    $0x2,%rcx
xor    %edx,%edx
div    %rcx
mov    %rax,-0x40(%rbp)
cmpq   $0x8,-0x40(%rbp)
jae    1193 <PECIConfigSet+0x93>
mov    $0x8,%eax
mov    %rax,-0x48(%rbp)
jmp    119b <PECIConfigSet+0x9b>
mov    -0x40(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,-0x40(%rbp)
cmpq   $0xffff,-0x40(%rbp)
jbe    11bf <PECIConfigSet+0xbf>
mov    $0xffff,%eax
mov    %rax,-0x50(%rbp)
jmp    11c7 <PECIConfigSet+0xc7>
mov    -0x40(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
shl    $0x10,%rax
movabs $0xffff0000,%rcx
and    %rcx,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x20(%rbp)
jne    11fe <PECIConfigSet+0xfe>
xor    %eax,%eax
mov    %rax,-0x58(%rbp)
jmp    121f <PECIConfigSet+0x11f>
mov    -0x10(%rbp),%rax
imul   -0x20(%rbp),%rax
mov    $0x3e8,%ecx
xor    %edx,%edx
div    %rcx
add    $0xfff,%rax
shr    $0xc,%rax
mov    %rax,-0x58(%rbp)
mov    -0x58(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
shl    $0x0,%rax
and    $0xffff,%rax
or     -0x38(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rcx
mov    -0x8(%rbp),%rax
mov    %rcx,0x4(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<PECIConfigSet>:
mov    %rdx,%r10
shl    $0x10,%r8d
and    $0x7,%r9d
shl    $0xc,%r9
or     %r8,%r9
mov    %r9,(%rdi)
lea    (%rsi,%rdx,4),%rax
add    $0xffffffffffffffff,%rax
shl    $0x2,%r10
mov    %rax,%rdx
or     %r10,%rdx
shr    $0x20,%rdx
je     1134 <PECIConfigSet+0x34>
xor    %edx,%edx
div    %r10
jmp    1139 <PECIConfigSet+0x39>
xor    %edx,%edx
div    %r10d
cmp    $0x9,%rax
mov    $0x8,%r8d
cmovae %rax,%r8
test   %rcx,%rcx
je     1175 <PECIConfigSet+0x75>
imul   %rsi,%rcx
shr    $0x3,%rcx
movabs $0x20c49ba5e353f7cf,%rdx
9b c4 20
mov    %rcx,%rax
mul    %rdx
shr    $0x4,%edx
add    $0xfff,%edx
shr    $0xc,%edx
movzwl %dx,%eax
jmp    1177 <PECIConfigSet+0x77>
xor    %eax,%eax
cmp    $0xffff,%r8
mov    $0xffff,%ecx
cmovb  %r8d,%ecx
shl    $0x10,%ecx
or     %rax,%rcx
mov    %rcx,0x4(%rdi)
ret

LLVM IR (-O0):
define void @PECIConfigSet(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
%14 = 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
%15 = load i64, i64* %11
%16 = shl i64 %15, 16
%17 = and i64 %16, 4294901760
store i64 %17, i64* %13
%18 = load i64, i64* %12
%19 = shl i64 %18, 12
%20 = and i64 %19, 28672
%21 = load i64, i64* %13
%22 = or i64 %21, %20
store i64 %22, i64* %13
%23 = load i64, i64* %13
%24 = load i64, i64* %7
%25 = add i64 %24, 0
%26 = inttoptr i64 %25 to i64*
store volatile i64 %23, i64* %26
%27 = load i64, i64* %8
%28 = load i64, i64* %9
%29 = mul i64 4, %28
%30 = add i64 %27, %29
%31 = sub i64 %30, 1
%32 = load i64, i64* %9
%33 = mul i64 4, %32
%34 = udiv i64 %31, %33
store i64 %34, i64* %14
%35 = load i64, i64* %14
%36 = icmp ult i64 %35, 8
br i1 %36, label %37, label %38
37: ; preds = %6
br label %40
38: ; preds = %6
%39 = load i64, i64* %14
br label %40
40: ; preds = %38, %37
%41 = phi i64 [ 8, %37 ], [ %39, %38 ]
store i64 %41, i64* %14
%42 = load i64, i64* %14
%43 = icmp ugt i64 %42, 65535
br i1 %43, label %44, label %45
44: ; preds = %40
br label %47
45: ; preds = %40
%46 = load i64, i64* %14
br label %47
47: ; preds = %45, %44
%48 = phi i64 [ 65535, %44 ], [ %46, %45 ]
store i64 %48, i64* %14
%49 = load i64, i64* %14
%50 = shl i64 %49, 16
%51 = and i64 %50, 4294901760
store i64 %51, i64* %13
%52 = load i64, i64* %10
%53 = icmp eq i64 %52, 0
br i1 %53, label %54, label %55
54: ; preds = %47
br label %62
55: ; preds = %47
%56 = load i64, i64* %8
%57 = load i64, i64* %10
%58 = mul i64 %56, %57
%59 = udiv i64 %58, 1000
%60 = add i64 %59, 4095
%61 = udiv i64 %60, 4096
br label %62
62: ; preds = %55, %54
%63 = phi i64 [ 0, %54 ], [ %61, %55 ]
store i64 %63, i64* %14
%64 = load i64, i64* %14
%65 = shl i64 %64, 0
%66 = and i64 %65, 65535
%67 = load i64, i64* %13
%68 = or i64 %67, %66
store i64 %68, i64* %13
%69 = load i64, i64* %13
%70 = load i64, i64* %7
%71 = add i64 %70, 4
%72 = inttoptr i64 %71 to i64*
store volatile i64 %69, i64* %72
ret void
}

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