void SysCtlUSBPLLEnable(void) {
  unsigned long ulMWRAllow;
  ulMWRAllow = (*((volatile unsigned long *)(0x400FB980)));
  (*((volatile unsigned long *)(0x400FB980))) = 0xA5A5A5A5;
  (*((volatile unsigned long *)(0x400FB820))) =
      0x00000002 | ((*((volatile unsigned long *)(0x400FB820))) & ~0x00000004);
  while (!((*((volatile unsigned long *)(0x400FB828))) & 0x00000001))
    ;
  (*((volatile unsigned long *)(0x400FB820))) |= 0x00000004;
  (*((volatile unsigned long *)(0x400FB980))) = ulMWRAllow;
}


x86 assembly (clang, -O0):
<SysCtlUSBPLLEnable>:
push   %rbp
mov    %rsp,%rbp
mov    $0x400fb980,%eax
mov    (%rax),%rax
mov    %rax,-0x8(%rbp)
mov    $0x400fb980,%eax
mov    $0xa5a5a5a5,%ecx
mov    %rcx,(%rax)
mov    $0x400fb820,%eax
mov    (%rax),%rcx
and    $0xfffffffffffffffb,%rcx
or     $0x2,%rcx
mov    $0x400fb820,%eax
mov    %rcx,(%rax)
mov    $0x400fb828,%eax
mov    (%rax),%rax
and    $0x1,%rax
cmp    $0x0,%rax
setne  %al
xor    $0xff,%al
test   $0x1,%al
jne    1157 <SysCtlUSBPLLEnable+0x57>
jmp    115c <SysCtlUSBPLLEnable+0x5c>
jmp    1135 <SysCtlUSBPLLEnable+0x35>
mov    $0x400fb820,%eax
mov    (%rax),%rcx
or     $0x4,%rcx
mov    $0x400fb820,%eax
mov    %rcx,(%rax)
mov    -0x8(%rbp),%rcx
mov    $0x400fb980,%eax
mov    %rcx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<SysCtlUSBPLLEnable>:
mov    0x400fb980,%rax
40
mov    $0xa5a5a5a5,%ecx
mov    %rcx,0x400fb980
40
mov    0x400fb820,%rcx
40
and    $0xfffffffffffffff9,%rcx
or     $0x2,%rcx
mov    %rcx,0x400fb820
40
nopl   (%rax)
testq  $0x1,0x400fb828
je     1130 <SysCtlUSBPLLEnable+0x30>
orq    $0x4,0x400fb820
40 04
mov    %rax,0x400fb980
40
ret

LLVM IR (-O0):
define void @SysCtlUSBPLLEnable() {
%1 = alloca i64
%2 = load volatile i64, i64* inttoptr (i64 1074772352 to i64*)
store i64 %2, i64* %1
store volatile i64 2779096485, i64* inttoptr (i64 1074772352 to i64*)
%3 = load volatile i64, i64* inttoptr (i64 1074772000 to i64*)
%4 = and i64 %3, -5
%5 = or i64 2, %4
store volatile i64 %5, i64* inttoptr (i64 1074772000 to i64*)
br label %6
6: ; preds = %11, %0
%7 = load volatile i64, i64* inttoptr (i64 1074772008 to i64*)
%8 = and i64 %7, 1
%9 = icmp ne i64 %8, 0
%10 = xor i1 %9, true
br i1 %10, label %11, label %12
11: ; preds = %6
br label %6
12: ; preds = %6
%13 = load volatile i64, i64* inttoptr (i64 1074772000 to i64*)
%14 = or i64 %13, 4
store volatile i64 %14, i64* inttoptr (i64 1074772000 to i64*)
%15 = load i64, i64* %1
store volatile i64 %15, i64* inttoptr (i64 1074772352 to i64*)
ret void
}

LLVM IR (-O2):
define void @SysCtlUSBPLLEnable() {
%1 = load volatile i64, i64* inttoptr (i64 1074772352 to i64*)
store volatile i64 2779096485, i64* inttoptr (i64 1074772352 to i64*)
%2 = load volatile i64, i64* inttoptr (i64 1074772000 to i64*)
%3 = and i64 %2, -7
%4 = or i64 %3, 2
store volatile i64 %4, i64* inttoptr (i64 1074772000 to i64*)
br label %5
5: ; preds = %5, %0
%6 = load volatile i64, i64* inttoptr (i64 1074772008 to i64*)
%7 = and i64 %6, 1
%8 = icmp eq i64 %7, 0
br i1 %8, label %5, label %9
9: ; preds = %5
%10 = load volatile i64, i64* inttoptr (i64 1074772000 to i64*)
%11 = or i64 %10, 4
store volatile i64 %11, i64* inttoptr (i64 1074772000 to i64*)
store volatile i64 %1, i64* inttoptr (i64 1074772352 to i64*)
ret void
}