#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
unsigned long SysCtlAPB1ClockGet();
unsigned long SysCtlAPB2ClockGet();
void SPIConfig(unsigned long ulBase, unsigned long ulBitRate,
               unsigned long ulConfig) {
  unsigned long ulPCLK;
  unsigned long ulPreDiv;

  ;

  ;

  ;

  ;

  ;

  ;
  ;
  (*((volatile unsigned long *)(ulBase + 0x00000000))) &= ~0x00000087;
  (*((volatile unsigned long *)(ulBase + 0x00000000))) |= ulConfig;
  if (ulBase == 0x40013000) {
    ulPCLK = SysCtlAPB2ClockGet();
  } else {
    ulPCLK = SysCtlAPB1ClockGet();
  }
  ulPreDiv = (((ulPCLK / ulBitRate) + 1) >> 1) - 1;
  if (ulPreDiv <= 2) {
    ulPreDiv = 0;
  } else if (ulPreDiv <= 4) {
    ulPreDiv = 1;
  } else if (ulPreDiv <= 8) {
    ulPreDiv = 2;
  } else if (ulPreDiv <= 16) {
    ulPreDiv = 3;
  } else if (ulPreDiv <= 32) {
    ulPreDiv = 4;
  } else if (ulPreDiv <= 64) {
    ulPreDiv = 5;
  } else if (ulPreDiv <= 128) {
    ulPreDiv = 6;
  } else {
    ulPreDiv = 7;
  }
  (*((volatile unsigned long *)(ulBase + 0x00000000))) &= ~0x00000038;
  (*((volatile unsigned long *)(ulBase + 0x00000000))) |= (ulPreDiv << 3);
}


x86 assembly (clang, -O0):
<SPIConfig>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
and    $0xffffffffffffff78,%rcx
mov    %rcx,(%rax)
mov    -0x18(%rbp),%rdx
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
or     %rdx,%rcx
mov    %rcx,(%rax)
cmpq   $0x40013000,-0x8(%rbp)
40
jne    1174 <SPIConfig+0x54>
mov    $0x0,%al
call   1040 <SysCtlAPB2ClockGet@plt>
mov    %rax,-0x20(%rbp)
jmp    117f <SPIConfig+0x5f>
mov    $0x0,%al
call   1030 <SysCtlAPB1ClockGet@plt>
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
xor    %ecx,%ecx
mov    %ecx,%edx
divq   -0x10(%rbp)
add    $0x1,%rax
shr    $0x1,%rax
sub    $0x1,%rax
mov    %rax,-0x28(%rbp)
cmpq   $0x2,-0x28(%rbp)
ja     11b3 <SPIConfig+0x93>
movq   $0x0,-0x28(%rbp)
jmp    126c <SPIConfig+0x14c>
cmpq   $0x4,-0x28(%rbp)
ja     11cb <SPIConfig+0xab>
movq   $0x1,-0x28(%rbp)
jmp    1267 <SPIConfig+0x147>
cmpq   $0x8,-0x28(%rbp)
ja     11e3 <SPIConfig+0xc3>
movq   $0x2,-0x28(%rbp)
jmp    1262 <SPIConfig+0x142>
cmpq   $0x10,-0x28(%rbp)
ja     11fb <SPIConfig+0xdb>
movq   $0x3,-0x28(%rbp)
jmp    125d <SPIConfig+0x13d>
cmpq   $0x20,-0x28(%rbp)
ja     1213 <SPIConfig+0xf3>
movq   $0x4,-0x28(%rbp)
jmp    1258 <SPIConfig+0x138>
cmpq   $0x40,-0x28(%rbp)
ja     122b <SPIConfig+0x10b>
movq   $0x5,-0x28(%rbp)
jmp    1253 <SPIConfig+0x133>
cmpq   $0x80,-0x28(%rbp)
ja     1246 <SPIConfig+0x126>
movq   $0x6,-0x28(%rbp)
jmp    124e <SPIConfig+0x12e>
movq   $0x7,-0x28(%rbp)
jmp    1253 <SPIConfig+0x133>
jmp    1258 <SPIConfig+0x138>
jmp    125d <SPIConfig+0x13d>
jmp    1262 <SPIConfig+0x142>
jmp    1267 <SPIConfig+0x147>
jmp    126c <SPIConfig+0x14c>
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
and    $0xffffffffffffffc7,%rcx
mov    %rcx,(%rax)
mov    -0x28(%rbp),%rdx
shl    $0x3,%rdx
mov    -0x8(%rbp),%rax
mov    (%rax),%rcx
or     %rdx,%rcx
mov    %rcx,(%rax)
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<SPIConfig>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%rbx
andq   $0xffffffffffffff78,(%rdi)
or     %rdx,(%rdi)
xor    %eax,%eax
cmp    $0x40013000,%rdi
jne    1146 <SPIConfig+0x26>
call   1040 <SysCtlAPB2ClockGet@plt>
jmp    114b <SPIConfig+0x2b>
call   1030 <SysCtlAPB1ClockGet@plt>
mov    %rax,%rcx
or     %r14,%rcx
shr    $0x20,%rcx
je     115e <SPIConfig+0x3e>
xor    %edx,%edx
div    %r14
jmp    1163 <SPIConfig+0x43>
xor    %edx,%edx
div    %r14d
add    $0x1,%rax
shr    %rax
add    $0xffffffffffffffff,%rax
cmp    $0x3,%rax
jae    1178 <SPIConfig+0x58>
xor    %ecx,%ecx
jmp    11c2 <SPIConfig+0xa2>
mov    $0x8,%ecx
cmp    $0x5,%rax
jb     11c2 <SPIConfig+0xa2>
mov    $0x10,%ecx
cmp    $0x9,%rax
jb     11c2 <SPIConfig+0xa2>
mov    $0x18,%ecx
cmp    $0x11,%rax
jb     11c2 <SPIConfig+0xa2>
mov    $0x20,%ecx
cmp    $0x21,%rax
jb     11c2 <SPIConfig+0xa2>
mov    $0x28,%ecx
cmp    $0x41,%rax
jb     11c2 <SPIConfig+0xa2>
xor    %ecx,%ecx
cmp    $0x81,%rax
setae  %cl
lea    0x30(,%rcx,8),%rcx
andq   $0xffffffffffffffc7,(%rbx)
or     %rcx,(%rbx)
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define void @SPIConfig(i64 %0, i64 %1, i64 %2) {
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64
store i64 %0, i64* %4
store i64 %1, i64* %5
store i64 %2, i64* %6
%9 = load i64, i64* %4
%10 = add i64 %9, 0
%11 = inttoptr i64 %10 to i64*
%12 = load volatile i64, i64* %11
%13 = and i64 %12, -136
store volatile i64 %13, i64* %11
%14 = load i64, i64* %6
%15 = load i64, i64* %4
%16 = add i64 %15, 0
%17 = inttoptr i64 %16 to i64*
%18 = load volatile i64, i64* %17
%19 = or i64 %18, %14
store volatile i64 %19, i64* %17
%20 = load i64, i64* %4
%21 = icmp eq i64 %20, 1073819648
br i1 %21, label %22, label %24
22: ; preds = %3
%23 = call i64 (...) @SysCtlAPB2ClockGet()
store i64 %23, i64* %7
br label %26
24: ; preds = %3
%25 = call i64 (...) @SysCtlAPB1ClockGet()
store i64 %25, i64* %7
br label %26
26: ; preds = %24, %22
%27 = load i64, i64* %7
%28 = load i64, i64* %5
%29 = udiv i64 %27, %28
%30 = add i64 %29, 1
%31 = lshr i64 %30, 1
%32 = sub i64 %31, 1
store i64 %32, i64* %8
%33 = load i64, i64* %8
%34 = icmp ule i64 %33, 2
br i1 %34, label %35, label %36
35: ; preds = %26
store i64 0, i64* %8
br label %67
36: ; preds = %26
%37 = load i64, i64* %8
%38 = icmp ule i64 %37, 4
br i1 %38, label %39, label %40
39: ; preds = %36
store i64 1, i64* %8
br label %66
40: ; preds = %36
%41 = load i64, i64* %8
%42 = icmp ule i64 %41, 8
br i1 %42, label %43, label %44
43: ; preds = %40
store i64 2, i64* %8
br label %65
44: ; preds = %40
%45 = load i64, i64* %8
%46 = icmp ule i64 %45, 16
br i1 %46, label %47, label %48
47: ; preds = %44
store i64 3, i64* %8
br label %64
48: ; preds = %44
%49 = load i64, i64* %8
%50 = icmp ule i64 %49, 32
br i1 %50, label %51, label %52
51: ; preds = %48
store i64 4, i64* %8
br label %63
52: ; preds = %48
%53 = load i64, i64* %8
%54 = icmp ule i64 %53, 64
br i1 %54, label %55, label %56
55: ; preds = %52
store i64 5, i64* %8
br label %62
56: ; preds = %52
%57 = load i64, i64* %8
%58 = icmp ule i64 %57, 128
br i1 %58, label %59, label %60
59: ; preds = %56
store i64 6, i64* %8
br label %61
60: ; preds = %56
store i64 7, i64* %8
br label %61
61: ; preds = %60, %59
br label %62
62: ; preds = %61, %55
br label %63
63: ; preds = %62, %51
br label %64
64: ; preds = %63, %47
br label %65
65: ; preds = %64, %43
br label %66
66: ; preds = %65, %39
br label %67
67: ; preds = %66, %35
%68 = load i64, i64* %4
%69 = add i64 %68, 0
%70 = inttoptr i64 %69 to i64*
%71 = load volatile i64, i64* %70
%72 = and i64 %71, -57
store volatile i64 %72, i64* %70
%73 = load i64, i64* %8
%74 = shl i64 %73, 3
%75 = load i64, i64* %4
%76 = add i64 %75, 0
%77 = inttoptr i64 %76 to i64*
%78 = load volatile i64, i64* %77
%79 = or i64 %78, %74
store volatile i64 %79, i64* %77
ret void
}

LLVM IR (-O2):
define void @SPIConfig(i64 %0, i64 %1, i64 %2) {
%4 = inttoptr i64 %0 to i64*
%5 = load volatile i64, i64* %4
%6 = and i64 %5, -136
store volatile i64 %6, i64* %4
%7 = load volatile i64, i64* %4
%8 = or i64 %7, %2
store volatile i64 %8, i64* %4
%9 = icmp eq i64 %0, 1073819648
br i1 %9, label %10, label %12
10: ; preds = %3
%11 = tail call i64 (...) @SysCtlAPB2ClockGet()
br label %14
12: ; preds = %3
%13 = tail call i64 (...) @SysCtlAPB1ClockGet()
br label %14
14: ; preds = %12, %10
%15 = phi i64 [ %11, %10 ], [ %13, %12 ]
%16 = udiv i64 %15, %1
%17 = add i64 %16, 1
%18 = lshr i64 %17, 1
%19 = add nsw i64 %18, -1
%20 = icmp ult i64 %19, 3
br i1 %20, label %34, label %21
21: ; preds = %14
%22 = icmp ult i64 %19, 5
br i1 %22, label %34, label %23
23: ; preds = %21
%24 = icmp ult i64 %19, 9
br i1 %24, label %34, label %25
25: ; preds = %23
%26 = icmp ult i64 %19, 17
br i1 %26, label %34, label %27
27: ; preds = %25
%28 = icmp ult i64 %19, 33
br i1 %28, label %34, label %29
29: ; preds = %27
%30 = icmp ult i64 %19, 65
br i1 %30, label %34, label %31
31: ; preds = %29
%32 = icmp ult i64 %19, 129
%33 = select i1 %32, i64 48, i64 56
br label %34
34: ; preds = %31, %29, %27, %25, %23, %21, %14
%35 = phi i64 [ 0, %14 ], [ 8, %21 ], [ 16, %23 ], [ 24, %25 ], [ 32, %27 ], [ 40, %29 ], [ %33, %31 ]
%36 = load volatile i64, i64* %4
%37 = and i64 %36, -57
store volatile i64 %37, i64* %4
%38 = load volatile i64, i64* %4
%39 = or i64 %38, %35
store volatile i64 %39, i64* %4
ret void
}