void DAC_Init(void) {
  volatile unsigned long delay;
  (*((volatile unsigned long *)0x400FE104)) |= 0x00000010;
  (*((volatile unsigned long *)0x400FE108)) |= 0x00000001;
  delay = (*((volatile unsigned long *)0x400FE108));
  (*((volatile unsigned long *)0x40004420)) |= 0x02C;
  (*((volatile unsigned long *)0x4000451C)) |= 0x02C;
  (*((volatile unsigned long *)0x40008004)) &= ~0x00000002;
  (*((volatile unsigned long *)0x40008004)) &= ~0x00000004;
  (*((volatile unsigned long *)0x40008010)) =
      ((*((volatile unsigned long *)0x40008010)) & ~0x000000FF) + 2;
  (*((volatile unsigned long *)0x40008000)) &= ~0x0000FF00;
  (*((volatile unsigned long *)0x40008000)) &= 0x00000040;
  (*((volatile unsigned long *)0x40008000)) |= 0x00000080;
  (*((volatile unsigned long *)0x40008000)) =
      ((*((volatile unsigned long *)0x40008000)) & ~0x00000030) + 0x00000000;
  (*((volatile unsigned long *)0x40008000)) =
      ((*((volatile unsigned long *)0x40008000)) & ~0x0000000F) + 0x0000000F;
  (*((volatile unsigned long *)0x40008004)) |= 0x00000002;
}


x86 assembly (clang, -O0):
<DAC_Init>:
push   %rbp
mov    %rsp,%rbp
mov    $0x400fe104,%eax
mov    (%rax),%rcx
or     $0x10,%rcx
mov    $0x400fe104,%eax
mov    %rcx,(%rax)
mov    $0x400fe108,%eax
mov    (%rax),%rcx
or     $0x1,%rcx
mov    $0x400fe108,%eax
mov    %rcx,(%rax)
mov    $0x400fe108,%eax
mov    (%rax),%rax
mov    %rax,-0x8(%rbp)
mov    $0x40004420,%eax
mov    (%rax),%rcx
or     $0x2c,%rcx
mov    $0x40004420,%eax
mov    %rcx,(%rax)
mov    $0x4000451c,%eax
mov    (%rax),%rcx
or     $0x2c,%rcx
mov    $0x4000451c,%eax
mov    %rcx,(%rax)
mov    $0x40008004,%eax
mov    (%rax),%rcx
and    $0xfffffffffffffffd,%rcx
mov    $0x40008004,%eax
mov    %rcx,(%rax)
mov    $0x40008004,%eax
mov    (%rax),%rcx
and    $0xfffffffffffffffb,%rcx
mov    $0x40008004,%eax
mov    %rcx,(%rax)
mov    $0x40008010,%eax
mov    (%rax),%rcx
and    $0xffffffffffffff00,%rcx
add    $0x2,%rcx
mov    $0x40008010,%eax
mov    %rcx,(%rax)
mov    $0x40008000,%eax
mov    (%rax),%rcx
and    $0xffffffffffff00ff,%rcx
mov    $0x40008000,%eax
mov    %rcx,(%rax)
mov    $0x40008000,%eax
mov    (%rax),%rcx
and    $0x40,%rcx
mov    $0x40008000,%eax
mov    %rcx,(%rax)
mov    $0x40008000,%eax
mov    (%rax),%rcx
or     $0x80,%rcx
mov    $0x40008000,%eax
mov    %rcx,(%rax)
mov    $0x40008000,%eax
mov    (%rax),%rcx
and    $0xffffffffffffffcf,%rcx
add    $0x0,%rcx
mov    $0x40008000,%eax
mov    %rcx,(%rax)
mov    $0x40008000,%eax
mov    (%rax),%rcx
and    $0xfffffffffffffff0,%rcx
add    $0xf,%rcx
mov    $0x40008000,%eax
mov    %rcx,(%rax)
mov    $0x40008004,%eax
mov    (%rax),%rcx
or     $0x2,%rcx
mov    $0x40008004,%eax
mov    %rcx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<DAC_Init>:
orq    $0x10,0x400fe104
40 10
orq    $0x1,0x400fe108
40 01
mov    0x400fe108,%rax
40
mov    %rax,-0x8(%rsp)
orq    $0x2c,0x40004420
40 2c
orq    $0x2c,0x4000451c
40 2c
andq   $0xfffffffffffffffd,0x40008004
40 fd
andq   $0xfffffffffffffffb,0x40008004
40 fb
mov    $0xffffffffffffff00,%rax
and    0x40008010,%rax
40
or     $0x2,%rax
mov    %rax,0x40008010
40
andq   $0xffffffffffff00ff,0x40008000
andq   $0x40,0x40008000
40 40
orq    $0x80,0x40008000
andq   $0xffffffffffffffcf,0x40008000
40 cf
orq    $0xf,0x40008000
40 0f
orq    $0x2,0x40008004
40 02
ret

LLVM IR (-O0):
define void @DAC_Init() {
%1 = alloca i64
%2 = load volatile i64, i64* inttoptr (i64 1074782468 to i64*)
%3 = or i64 %2, 16
store volatile i64 %3, i64* inttoptr (i64 1074782468 to i64*)
%4 = load volatile i64, i64* inttoptr (i64 1074782472 to i64*)
%5 = or i64 %4, 1
store volatile i64 %5, i64* inttoptr (i64 1074782472 to i64*)
%6 = load volatile i64, i64* inttoptr (i64 1074782472 to i64*)
store volatile i64 %6, i64* %1
%7 = load volatile i64, i64* inttoptr (i64 1073759264 to i64*)
%8 = or i64 %7, 44
store volatile i64 %8, i64* inttoptr (i64 1073759264 to i64*)
%9 = load volatile i64, i64* inttoptr (i64 1073759516 to i64*)
%10 = or i64 %9, 44
store volatile i64 %10, i64* inttoptr (i64 1073759516 to i64*)
%11 = load volatile i64, i64* inttoptr (i64 1073774596 to i64*)
%12 = and i64 %11, -3
store volatile i64 %12, i64* inttoptr (i64 1073774596 to i64*)
%13 = load volatile i64, i64* inttoptr (i64 1073774596 to i64*)
%14 = and i64 %13, -5
store volatile i64 %14, i64* inttoptr (i64 1073774596 to i64*)
%15 = load volatile i64, i64* inttoptr (i64 1073774608 to i64*)
%16 = and i64 %15, -256
%17 = add i64 %16, 2
store volatile i64 %17, i64* inttoptr (i64 1073774608 to i64*)
%18 = load volatile i64, i64* inttoptr (i64 1073774592 to i64*)
%19 = and i64 %18, -65281
store volatile i64 %19, i64* inttoptr (i64 1073774592 to i64*)
%20 = load volatile i64, i64* inttoptr (i64 1073774592 to i64*)
%21 = and i64 %20, 64
store volatile i64 %21, i64* inttoptr (i64 1073774592 to i64*)
%22 = load volatile i64, i64* inttoptr (i64 1073774592 to i64*)
%23 = or i64 %22, 128
store volatile i64 %23, i64* inttoptr (i64 1073774592 to i64*)
%24 = load volatile i64, i64* inttoptr (i64 1073774592 to i64*)
%25 = and i64 %24, -49
%26 = add i64 %25, 0
store volatile i64 %26, i64* inttoptr (i64 1073774592 to i64*)
%27 = load volatile i64, i64* inttoptr (i64 1073774592 to i64*)
%28 = and i64 %27, -16
%29 = add i64 %28, 15
store volatile i64 %29, i64* inttoptr (i64 1073774592 to i64*)
%30 = load volatile i64, i64* inttoptr (i64 1073774596 to i64*)
%31 = or i64 %30, 2
store volatile i64 %31, i64* inttoptr (i64 1073774596 to i64*)
ret void
}

LLVM IR (-O2):
define void @DAC_Init() {
%1 = alloca i64
%2 = bitcast i64* %1 to i8*
%3 = load volatile i64, i64* inttoptr (i64 1074782468 to i64*)
%4 = or i64 %3, 16
store volatile i64 %4, i64* inttoptr (i64 1074782468 to i64*)
%5 = load volatile i64, i64* inttoptr (i64 1074782472 to i64*)
%6 = or i64 %5, 1
store volatile i64 %6, i64* inttoptr (i64 1074782472 to i64*)
%7 = load volatile i64, i64* inttoptr (i64 1074782472 to i64*)
store volatile i64 %7, i64* %1
%8 = load volatile i64, i64* inttoptr (i64 1073759264 to i64*)
%9 = or i64 %8, 44
store volatile i64 %9, i64* inttoptr (i64 1073759264 to i64*)
%10 = load volatile i64, i64* inttoptr (i64 1073759516 to i64*)
%11 = or i64 %10, 44
store volatile i64 %11, i64* inttoptr (i64 1073759516 to i64*)
%12 = load volatile i64, i64* inttoptr (i64 1073774596 to i64*)
%13 = and i64 %12, -3
store volatile i64 %13, i64* inttoptr (i64 1073774596 to i64*)
%14 = load volatile i64, i64* inttoptr (i64 1073774596 to i64*)
%15 = and i64 %14, -5
store volatile i64 %15, i64* inttoptr (i64 1073774596 to i64*)
%16 = load volatile i64, i64* inttoptr (i64 1073774608 to i64*)
%17 = and i64 %16, -256
%18 = or i64 %17, 2
store volatile i64 %18, i64* inttoptr (i64 1073774608 to i64*)
%19 = load volatile i64, i64* inttoptr (i64 1073774592 to i64*)
%20 = and i64 %19, -65281
store volatile i64 %20, i64* inttoptr (i64 1073774592 to i64*)
%21 = load volatile i64, i64* inttoptr (i64 1073774592 to i64*)
%22 = and i64 %21, 64
store volatile i64 %22, i64* inttoptr (i64 1073774592 to i64*)
%23 = load volatile i64, i64* inttoptr (i64 1073774592 to i64*)
%24 = or i64 %23, 128
store volatile i64 %24, i64* inttoptr (i64 1073774592 to i64*)
%25 = load volatile i64, i64* inttoptr (i64 1073774592 to i64*)
%26 = and i64 %25, -49
store volatile i64 %26, i64* inttoptr (i64 1073774592 to i64*)
%27 = load volatile i64, i64* inttoptr (i64 1073774592 to i64*)
%28 = or i64 %27, 15
store volatile i64 %28, i64* inttoptr (i64 1073774592 to i64*)
%29 = load volatile i64, i64* inttoptr (i64 1073774596 to i64*)
%30 = or i64 %29, 2
store volatile i64 %30, i64* inttoptr (i64 1073774596 to i64*)
ret void
}