#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 */
int /*<<< orphan*/ MicroDelay(int);
void UartInit(void) {
  (*((volatile unsigned int *)((0xFFFF4000 + 0x04))) = ((1 << 2)));
  (*((volatile unsigned int *)((0xFFFF0000 + 0x04))) = ((1 << 14) | (1 << 15)));
  (*((volatile unsigned int *)((0xFFFD0000 + 0x00))) =
       (0x00000004 | 0x00000008 | 0x00000020 | 0x00000080));
  (*((volatile unsigned int *)((0xFFFD0000 + 0x0C))) = (0xFFFFFFFF));
  (*((volatile unsigned int *)((0xFFFD0000 + 0x34))) = (0));
  (*((volatile unsigned int *)((0xFFFD0000 + 0x3C))) = (0));
  (*((volatile unsigned int *)((0xFFFD0000 + 0x20))) =
       (((73728000 / (8 * (115200)) + 1) / 2)));
  (*((volatile unsigned int *)((0xFFFD0000 + 0x04))) =
       (0x00000000 | 0x000000C0 | 0x00000800 | 0x00000000));
  (*((volatile unsigned int *)((0xFFFD0000 + 0x00))) =
       (0x00000010 | 0x00000040));
  MicroDelay(1000);
}


x86 assembly (clang, -O0):
<UartInit>:
push   %rbp
mov    %rsp,%rbp
mov    $0xffff4004,%eax
movl   $0x4,(%rax)
mov    $0xffff0004,%eax
movl   $0xc000,(%rax)
mov    $0xfffd0000,%eax
movl   $0xac,(%rax)
mov    $0xfffd000c,%eax
movl   $0xffffffff,(%rax)
mov    $0xfffd0034,%eax
movl   $0x0,(%rax)
mov    $0xfffd003c,%eax
movl   $0x0,(%rax)
mov    $0xfffd0020,%eax
movl   $0x28,(%rax)
mov    $0xfffd0004,%eax
movl   $0x8c0,(%rax)
mov    $0xfffd0000,%eax
movl   $0x50,(%rax)
mov    $0x3e8,%edi
call   1030 <MicroDelay@plt>
pop    %rbp
ret

x86 assembly (clang, -O2):
<UartInit>:
mov    $0xfffd0000,%eax
movl   $0x4,0x24004(%rax)
movl   $0xc000,0x20004(%rax)
movl   $0xac,(%rax)
movl   $0xffffffff,0xc(%rax)
movl   $0x0,0x34(%rax)
movl   $0x0,0x3c(%rax)
movl   $0x28,0x20(%rax)
movl   $0x8c0,0x4(%rax)
movl   $0x50,(%rax)
mov    $0x3e8,%edi
jmp    1030 <MicroDelay@plt>

LLVM IR (-O0):
define void @UartInit() {
store volatile i32 4, i32* inttoptr (i64 4294918148 to i32*)
store volatile i32 49152, i32* inttoptr (i64 4294901764 to i32*)
store volatile i32 172, i32* inttoptr (i64 4294770688 to i32*)
store volatile i32 -1, i32* inttoptr (i64 4294770700 to i32*)
store volatile i32 0, i32* inttoptr (i64 4294770740 to i32*)
store volatile i32 0, i32* inttoptr (i64 4294770748 to i32*)
store volatile i32 40, i32* inttoptr (i64 4294770720 to i32*)
store volatile i32 2240, i32* inttoptr (i64 4294770692 to i32*)
store volatile i32 80, i32* inttoptr (i64 4294770688 to i32*)
%1 = call i32 @MicroDelay(i32 1000)
ret void
}

LLVM IR (-O2):
define void @UartInit() {
store volatile i32 4, i32* inttoptr (i64 4294918148 to i32*)
store volatile i32 49152, i32* inttoptr (i64 4294901764 to i32*)
store volatile i32 172, i32* inttoptr (i64 4294770688 to i32*)
store volatile i32 -1, i32* inttoptr (i64 4294770700 to i32*)
store volatile i32 0, i32* inttoptr (i64 4294770740 to i32*)
store volatile i32 0, i32* inttoptr (i64 4294770748 to i32*)
store volatile i32 40, i32* inttoptr (i64 4294770720 to i32*)
store volatile i32 2240, i32* inttoptr (i64 4294770692 to i32*)
store volatile i32 80, i32* inttoptr (i64 4294770688 to i32*)
%1 = tail call i32 @MicroDelay(i32 1000)
ret void
}