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 < ((((*((volatile unsigned long *)(0x400FE000))) &
                      (0x70000000 | 0x00FF0000)) == (0x10000000 | 0x00050000))
                        ? 10
                        : 1))
              ? ((((*((volatile unsigned long *)(0x400FE000))) &
                   (0x70000000 | 0x00FF0000)) == (0x10000000 | 0x00050000))
                     ? 10
                     : 1)
              : ulDiv;
  ulDiv = (ulDiv > 65535) ? 65535 : ulDiv;
  ulTemp = ((ulDiv << 16) & 0xFFFF0000);
  ulDiv =
      ((ulPoll == 0) ? 0
                     : ((((ulPECIClk / 1000) * ulPoll) + (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)
mov    -0x40(%rbp),%rax
mov    $0x400fe000,%ecx
mov    (%rcx),%rsi
and    $0x70ff0000,%rsi
mov    $0x1,%ecx
mov    $0xa,%edx
cmp    $0x10050000,%rsi
cmove  %edx,%ecx
movslq %ecx,%rcx
cmp    %rcx,%rax
jae    11db <PECIConfigSet+0xdb>
mov    $0x400fe000,%eax
mov    (%rax),%rdx
and    $0x70ff0000,%rdx
mov    $0x1,%eax
mov    $0xa,%ecx
cmp    $0x10050000,%rdx
cmove  %ecx,%eax
cltq
mov    %rax,-0x48(%rbp)
jmp    11e3 <PECIConfigSet+0xe3>
mov    -0x40(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,-0x40(%rbp)
cmpq   $0xffff,-0x40(%rbp)
jbe    1207 <PECIConfigSet+0x107>
mov    $0xffff,%eax
mov    %rax,-0x50(%rbp)
jmp    120f <PECIConfigSet+0x10f>
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    1246 <PECIConfigSet+0x146>
xor    %eax,%eax
mov    %rax,-0x58(%rbp)
jmp    1267 <PECIConfigSet+0x167>
mov    -0x10(%rbp),%rax
mov    $0x3e8,%ecx
xor    %edx,%edx
div    %rcx
imul   -0x20(%rbp),%rax
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     1137 <PECIConfigSet+0x37>
xor    %edx,%edx
div    %r10
mov    %rax,%r8
jmp    113f <PECIConfigSet+0x3f>
xor    %edx,%edx
div    %r10d
mov    %eax,%r8d
mov    0x400fe000,%rax
40
and    $0x70ff0000,%eax
xor    %edx,%edx
cmp    $0x10050000,%eax
sete   %dl
lea    (%rdx,%rdx,8),%rax
add    $0x1,%rax
cmp    %rax,%r8
jae    1182 <PECIConfigSet+0x82>
mov    0x400fe000,%rax
40
and    $0x70ff0000,%eax
xor    %edx,%edx
cmp    $0x10050000,%eax
sete   %dl
lea    (%rdx,%rdx,8),%r8
add    $0x1,%r8
test   %rcx,%rcx
je     11af <PECIConfigSet+0xaf>
shr    $0x3,%rsi
movabs $0x20c49ba5e353f7cf,%rdx
9b c4 20
mov    %rsi,%rax
mul    %rdx
shr    $0x4,%edx
imul   %edx,%ecx
add    $0xfff,%ecx
shr    $0xc,%ecx
movzwl %cx,%eax
jmp    11b1 <PECIConfigSet+0xb1>
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 = load volatile i64, i64* inttoptr (i64 1074782208 to i64*)
%37 = and i64 %36, 1895759872
%38 = icmp eq i64 %37, 268763136
%39 = zext i1 %38 to i64
%40 = select i1 %38, i32 10, i32 1
%41 = sext i32 %40 to i64
%42 = icmp ult i64 %35, %41
br i1 %42, label %43, label %50
43: ; preds = %6
%44 = load volatile i64, i64* inttoptr (i64 1074782208 to i64*)
%45 = and i64 %44, 1895759872
%46 = icmp eq i64 %45, 268763136
%47 = zext i1 %46 to i64
%48 = select i1 %46, i32 10, i32 1
%49 = sext i32 %48 to i64
br label %52
50: ; preds = %6
%51 = load i64, i64* %14
br label %52
52: ; preds = %50, %43
%53 = phi i64 [ %49, %43 ], [ %51, %50 ]
store i64 %53, i64* %14
%54 = load i64, i64* %14
%55 = icmp ugt i64 %54, 65535
br i1 %55, label %56, label %57
56: ; preds = %52
br label %59
57: ; preds = %52
%58 = load i64, i64* %14
br label %59
59: ; preds = %57, %56
%60 = phi i64 [ 65535, %56 ], [ %58, %57 ]
store i64 %60, i64* %14
%61 = load i64, i64* %14
%62 = shl i64 %61, 16
%63 = and i64 %62, 4294901760
store i64 %63, i64* %13
%64 = load i64, i64* %10
%65 = icmp eq i64 %64, 0
br i1 %65, label %66, label %67
66: ; preds = %59
br label %74
67: ; preds = %59
%68 = load i64, i64* %8
%69 = udiv i64 %68, 1000
%70 = load i64, i64* %10
%71 = mul i64 %69, %70
%72 = add i64 %71, 4095
%73 = udiv i64 %72, 4096
br label %74
74: ; preds = %67, %66
%75 = phi i64 [ 0, %66 ], [ %73, %67 ]
store i64 %75, i64* %14
%76 = load i64, i64* %14
%77 = shl i64 %76, 0
%78 = and i64 %77, 65535
%79 = load i64, i64* %13
%80 = or i64 %79, %78
store i64 %80, i64* %13
%81 = load i64, i64* %13
%82 = load i64, i64* %7
%83 = add i64 %82, 4
%84 = inttoptr i64 %83 to i64*
store volatile i64 %81, i64* %84
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 = load volatile i64, i64* inttoptr (i64 1074782208 to i64*)
%18 = and i64 %17, 1895759872
%19 = icmp eq i64 %18, 268763136
%20 = select i1 %19, i64 10, i64 1
%21 = icmp ult i64 %16, %20
br i1 %21, label %22, label %27
22: ; preds = %6
%23 = load volatile i64, i64* inttoptr (i64 1074782208 to i64*)
%24 = and i64 %23, 1895759872
%25 = icmp eq i64 %24, 268763136
%26 = select i1 %25, i64 10, i64 1
br label %27
27: ; preds = %6, %22
%28 = phi i64 [ %26, %22 ], [ %16, %6 ]
%29 = icmp eq i64 %3, 0
br i1 %29, label %36, label %30
30: ; preds = %27
%31 = udiv i64 %1, 1000
%32 = mul i64 %31, %3
%33 = add i64 %32, 4095
%34 = lshr i64 %33, 12
%35 = and i64 %34, 65535
br label %36
36: ; preds = %27, %30
%37 = phi i64 [ %35, %30 ], [ 0, %27 ]
%38 = icmp ult i64 %28, 65535
%39 = select i1 %38, i64 %28, i64 65535
%40 = shl nuw nsw i64 %39, 16
%41 = and i64 %40, 4294901760
%42 = or i64 %37, %41
%43 = add i64 %0, 4
%44 = inttoptr i64 %43 to i64*
store volatile i64 %42, i64* %44
ret void
}