void init_gpio() {
  volatile unsigned long delay;
  (*(volatile unsigned long *)0x400fe06c) |= 0x20;
  (*(volatile unsigned long *)0x400fe608) |= 0x20;
  delay = (*(volatile unsigned long *)0x400fe608);
  (void)delay;
  (*(volatile unsigned long *)0x4005d520) = 0x4c4f434b;
  (*(volatile unsigned long *)0x4005d524) |= 0x01;
  (*(volatile unsigned long *)0x4005d400) |= 0x0e;
  (*(volatile unsigned long *)0x4005d510) |= 0x11;
  (*(volatile unsigned long *)0x4005d51c) |= 0x1f;
}


x86 assembly (clang, -O0):
<init_gpio>:
push   %rbp
mov    %rsp,%rbp
mov    $0x400fe06c,%eax
mov    (%rax),%rcx
or     $0x20,%rcx
mov    $0x400fe06c,%eax
mov    %rcx,(%rax)
mov    $0x400fe608,%eax
mov    (%rax),%rcx
or     $0x20,%rcx
mov    $0x400fe608,%eax
mov    %rcx,(%rax)
mov    $0x400fe608,%eax
mov    (%rax),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
mov    $0x4005d520,%eax
movq   $0x4c4f434b,(%rax)
mov    $0x4005d524,%eax
mov    (%rax),%rcx
or     $0x1,%rcx
mov    $0x4005d524,%eax
mov    %rcx,(%rax)
mov    $0x4005d400,%eax
mov    (%rax),%rcx
or     $0xe,%rcx
mov    $0x4005d400,%eax
mov    %rcx,(%rax)
mov    $0x4005d510,%eax
mov    (%rax),%rcx
or     $0x11,%rcx
mov    $0x4005d510,%eax
mov    %rcx,(%rax)
mov    $0x4005d51c,%eax
mov    (%rax),%rcx
or     $0x1f,%rcx
mov    $0x4005d51c,%eax
mov    %rcx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<init_gpio>:
orq    $0x20,0x400fe06c
40 20
orq    $0x20,0x400fe608
40 20
mov    0x400fe608,%rax
40
mov    %rax,-0x8(%rsp)
mov    -0x8(%rsp),%rax
movq   $0x4c4f434b,0x4005d520
40 4b 43 4f 4c
orq    $0x1,0x4005d524
40 01
orq    $0xe,0x4005d400
40 0e
orq    $0x11,0x4005d510
40 11
orq    $0x1f,0x4005d51c
40 1f
ret

LLVM IR (-O0):
define void @init_gpio() {
%1 = alloca i64
%2 = load volatile i64, i64* inttoptr (i64 1074782316 to i64*)
%3 = or i64 %2, 32
store volatile i64 %3, i64* inttoptr (i64 1074782316 to i64*)
%4 = load volatile i64, i64* inttoptr (i64 1074783752 to i64*)
%5 = or i64 %4, 32
store volatile i64 %5, i64* inttoptr (i64 1074783752 to i64*)
%6 = load volatile i64, i64* inttoptr (i64 1074783752 to i64*)
store volatile i64 %6, i64* %1
%7 = load volatile i64, i64* %1
store volatile i64 1280262987, i64* inttoptr (i64 1074124064 to i64*)
%8 = load volatile i64, i64* inttoptr (i64 1074124068 to i64*)
%9 = or i64 %8, 1
store volatile i64 %9, i64* inttoptr (i64 1074124068 to i64*)
%10 = load volatile i64, i64* inttoptr (i64 1074123776 to i64*)
%11 = or i64 %10, 14
store volatile i64 %11, i64* inttoptr (i64 1074123776 to i64*)
%12 = load volatile i64, i64* inttoptr (i64 1074124048 to i64*)
%13 = or i64 %12, 17
store volatile i64 %13, i64* inttoptr (i64 1074124048 to i64*)
%14 = load volatile i64, i64* inttoptr (i64 1074124060 to i64*)
%15 = or i64 %14, 31
store volatile i64 %15, i64* inttoptr (i64 1074124060 to i64*)
ret void
}

LLVM IR (-O2):
define void @init_gpio() {
%1 = alloca i64
%2 = bitcast i64* %1 to i8*
%3 = load volatile i64, i64* inttoptr (i64 1074782316 to i64*)
%4 = or i64 %3, 32
store volatile i64 %4, i64* inttoptr (i64 1074782316 to i64*)
%5 = load volatile i64, i64* inttoptr (i64 1074783752 to i64*)
%6 = or i64 %5, 32
store volatile i64 %6, i64* inttoptr (i64 1074783752 to i64*)
%7 = load volatile i64, i64* inttoptr (i64 1074783752 to i64*)
store volatile i64 %7, i64* %1
%8 = load volatile i64, i64* %1
store volatile i64 1280262987, i64* inttoptr (i64 1074124064 to i64*)
%9 = load volatile i64, i64* inttoptr (i64 1074124068 to i64*)
%10 = or i64 %9, 1
store volatile i64 %10, i64* inttoptr (i64 1074124068 to i64*)
%11 = load volatile i64, i64* inttoptr (i64 1074123776 to i64*)
%12 = or i64 %11, 14
store volatile i64 %12, i64* inttoptr (i64 1074123776 to i64*)
%13 = load volatile i64, i64* inttoptr (i64 1074124048 to i64*)
%14 = or i64 %13, 17
store volatile i64 %14, i64* inttoptr (i64 1074124048 to i64*)
%15 = load volatile i64, i64* inttoptr (i64 1074124060 to i64*)
%16 = or i64 %15, 31
store volatile i64 %16, i64* inttoptr (i64 1074124060 to i64*)
ret void
}