void adc_init(void) {
  (*(volatile unsigned int *)((0x40023800 + 0x44))) |= 1 << 8;
  (*(volatile unsigned int *)((((((unsigned int)0x40000000) + 0x10000) +
                                0x2000) +
                               0x300) +
                              0x4)) &= ~(1 << 23);
  (*(volatile unsigned int *)((((((unsigned int)0x40000000) + 0x10000) +
                                0x2000) +
                               0x300) +
                              0x4)) &= ~(1 << 22);
  (*(volatile unsigned int *)(((((unsigned int)0x40000000) + 0x10000) +
                               0x2000) +
                              0x08)) &= ~(1 << 0);
  (*(volatile unsigned int *)(((((unsigned int)0x40000000) + 0x10000) +
                               0x2000) +
                              0x04)) &= ~(1 << 8);
  (*(volatile unsigned int *)(((((unsigned int)0x40000000) + 0x10000) +
                               0x2000) +
                              0x08)) &= ~(1 << 1);
  (*(volatile unsigned int *)(((((unsigned int)0x40000000) + 0x10000) +
                               0x2000) +
                              0x08)) &= ~(1 << 28);
  (*(volatile unsigned int *)(((((unsigned int)0x40000000) + 0x10000) +
                               0x2000) +
                              0x08)) &= ~(1 << 11);
  (*(volatile unsigned int *)(((((unsigned int)0x40000000) + 0x10000) +
                               0x2000) +
                              0x0c)) |= (0x0 << ((0x10 - 10) * 3)) |
                                        (0x0 << ((0x11 - 10) * 3)) |
                                        (0x0 << ((0x12 - 10) * 3));
  (*(volatile unsigned int *)(((((unsigned int)0x40000000) + 0x10000) +
                               0x2000) +
                              0x04)) |= (1 << 5);
  (*(volatile unsigned int *)(((((unsigned int)0x40000000) + 0x10000) +
                               0x2000) +
                              0x2c)) = 0;
}


x86 assembly (clang, -O0):
<adc_init>:
push   %rbp
mov    %rsp,%rbp
mov    $0x40023844,%eax
mov    (%rax),%ecx
or     $0x100,%ecx
mov    $0x40023844,%eax
mov    %ecx,(%rax)
mov    $0x40012304,%eax
mov    (%rax),%ecx
and    $0xff7fffff,%ecx
mov    $0x40012304,%eax
mov    %ecx,(%rax)
mov    $0x40012304,%eax
mov    (%rax),%ecx
and    $0xffbfffff,%ecx
mov    $0x40012304,%eax
mov    %ecx,(%rax)
mov    $0x40012008,%eax
mov    (%rax),%ecx
and    $0xfffffffe,%ecx
mov    $0x40012008,%eax
mov    %ecx,(%rax)
mov    $0x40012004,%eax
mov    (%rax),%ecx
and    $0xfffffeff,%ecx
mov    $0x40012004,%eax
mov    %ecx,(%rax)
mov    $0x40012008,%eax
mov    (%rax),%ecx
and    $0xfffffffd,%ecx
mov    $0x40012008,%eax
mov    %ecx,(%rax)
mov    $0x40012008,%eax
mov    (%rax),%ecx
and    $0xefffffff,%ecx
mov    $0x40012008,%eax
mov    %ecx,(%rax)
mov    $0x40012008,%eax
mov    (%rax),%ecx
and    $0xfffff7ff,%ecx
mov    $0x40012008,%eax
mov    %ecx,(%rax)
mov    $0x4001200c,%eax
mov    (%rax),%ecx
or     $0x0,%ecx
mov    $0x4001200c,%eax
mov    %ecx,(%rax)
mov    $0x40012004,%eax
mov    (%rax),%ecx
or     $0x20,%ecx
mov    $0x40012004,%eax
mov    %ecx,(%rax)
mov    $0x4001202c,%eax
movl   $0x0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<adc_init>:
orl    $0x100,0x40023844
andl   $0xff7fffff,0x40012304
ff ff 7f ff
andl   $0xffbfffff,0x40012304
ff ff bf ff
andl   $0xfffffffe,0x40012008
fe
andl   $0xfffffeff,0x40012004
ff fe ff ff
andl   $0xfffffffd,0x40012008
fd
andl   $0xefffffff,0x40012008
ff ff ff ef
andl   $0xfffff7ff,0x40012008
ff f7 ff ff
mov    0x4001200c,%eax
mov    %eax,0x4001200c
orl    $0x20,0x40012004
20
movl   $0x0,0x4001202c
ret

LLVM IR (-O0):
define void @adc_init() {
%1 = load volatile i32, i32* inttoptr (i64 1073887300 to i32*)
%2 = or i32 %1, 256
store volatile i32 %2, i32* inttoptr (i64 1073887300 to i32*)
%3 = load volatile i32, i32* inttoptr (i64 1073816324 to i32*)
%4 = and i32 %3, -8388609
store volatile i32 %4, i32* inttoptr (i64 1073816324 to i32*)
%5 = load volatile i32, i32* inttoptr (i64 1073816324 to i32*)
%6 = and i32 %5, -4194305
store volatile i32 %6, i32* inttoptr (i64 1073816324 to i32*)
%7 = load volatile i32, i32* inttoptr (i64 1073815560 to i32*)
%8 = and i32 %7, -2
store volatile i32 %8, i32* inttoptr (i64 1073815560 to i32*)
%9 = load volatile i32, i32* inttoptr (i64 1073815556 to i32*)
%10 = and i32 %9, -257
store volatile i32 %10, i32* inttoptr (i64 1073815556 to i32*)
%11 = load volatile i32, i32* inttoptr (i64 1073815560 to i32*)
%12 = and i32 %11, -3
store volatile i32 %12, i32* inttoptr (i64 1073815560 to i32*)
%13 = load volatile i32, i32* inttoptr (i64 1073815560 to i32*)
%14 = and i32 %13, -268435457
store volatile i32 %14, i32* inttoptr (i64 1073815560 to i32*)
%15 = load volatile i32, i32* inttoptr (i64 1073815560 to i32*)
%16 = and i32 %15, -2049
store volatile i32 %16, i32* inttoptr (i64 1073815560 to i32*)
%17 = load volatile i32, i32* inttoptr (i64 1073815564 to i32*)
%18 = or i32 %17, 0
store volatile i32 %18, i32* inttoptr (i64 1073815564 to i32*)
%19 = load volatile i32, i32* inttoptr (i64 1073815556 to i32*)
%20 = or i32 %19, 32
store volatile i32 %20, i32* inttoptr (i64 1073815556 to i32*)
store volatile i32 0, i32* inttoptr (i64 1073815596 to i32*)
ret void
}

LLVM IR (-O2):
define void @adc_init() {
%1 = load volatile i32, i32* inttoptr (i64 1073887300 to i32*)
%2 = or i32 %1, 256
store volatile i32 %2, i32* inttoptr (i64 1073887300 to i32*)
%3 = load volatile i32, i32* inttoptr (i64 1073816324 to i32*)
%4 = and i32 %3, -8388609
store volatile i32 %4, i32* inttoptr (i64 1073816324 to i32*)
%5 = load volatile i32, i32* inttoptr (i64 1073816324 to i32*)
%6 = and i32 %5, -4194305
store volatile i32 %6, i32* inttoptr (i64 1073816324 to i32*)
%7 = load volatile i32, i32* inttoptr (i64 1073815560 to i32*)
%8 = and i32 %7, -2
store volatile i32 %8, i32* inttoptr (i64 1073815560 to i32*)
%9 = load volatile i32, i32* inttoptr (i64 1073815556 to i32*)
%10 = and i32 %9, -257
store volatile i32 %10, i32* inttoptr (i64 1073815556 to i32*)
%11 = load volatile i32, i32* inttoptr (i64 1073815560 to i32*)
%12 = and i32 %11, -3
store volatile i32 %12, i32* inttoptr (i64 1073815560 to i32*)
%13 = load volatile i32, i32* inttoptr (i64 1073815560 to i32*)
%14 = and i32 %13, -268435457
store volatile i32 %14, i32* inttoptr (i64 1073815560 to i32*)
%15 = load volatile i32, i32* inttoptr (i64 1073815560 to i32*)
%16 = and i32 %15, -2049
store volatile i32 %16, i32* inttoptr (i64 1073815560 to i32*)
%17 = load volatile i32, i32* inttoptr (i64 1073815564 to i32*)
store volatile i32 %17, i32* inttoptr (i64 1073815564 to i32*)
%18 = load volatile i32, i32* inttoptr (i64 1073815556 to i32*)
%19 = or i32 %18, 32
store volatile i32 %19, i32* inttoptr (i64 1073815556 to i32*)
store volatile i32 0, i32* inttoptr (i64 1073815596 to i32*)
ret void
}