void GPMCECCSizeValSet(unsigned int baseAddr, unsigned int eccSize,
                       unsigned int eccSizeVal) {
  if (eccSize == (0)) {
    (*((volatile unsigned int *)(baseAddr + (0x1FC)))) &= ~(0x000FF000u);
    (*((volatile unsigned int *)(baseAddr + (0x1FC)))) |=
        ((eccSizeVal << (0x0000000Cu)) & (0x000FF000u));
  } else if (eccSize == (1)) {
    (*((volatile unsigned int *)(baseAddr + (0x1FC)))) &= ~(0x3FC00000u);
    (*((volatile unsigned int *)(baseAddr + (0x1FC)))) |=
        ((eccSizeVal << (0x00000016u)) & (0x3FC00000u));
  }
}


x86 assembly (clang, -O0):
<GPMCECCSizeValSet>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
cmpl   $0x0,-0x8(%rbp)
jne    114c <GPMCECCSizeValSet+0x4c>
mov    -0x4(%rbp),%eax
add    $0x1fc,%eax
mov    %eax,%eax
mov    (%rax),%ecx
and    $0xfff00fff,%ecx
mov    %ecx,(%rax)
mov    -0xc(%rbp),%edx
shl    $0xc,%edx
and    $0xff000,%edx
mov    -0x4(%rbp),%eax
add    $0x1fc,%eax
mov    %eax,%eax
mov    (%rax),%ecx
or     %edx,%ecx
mov    %ecx,(%rax)
jmp    118b <GPMCECCSizeValSet+0x8b>
cmpl   $0x1,-0x8(%rbp)
jne    1186 <GPMCECCSizeValSet+0x86>
mov    -0x4(%rbp),%eax
add    $0x1fc,%eax
mov    %eax,%eax
mov    (%rax),%ecx
and    $0xc03fffff,%ecx
mov    %ecx,(%rax)
mov    -0xc(%rbp),%edx
shl    $0x16,%edx
and    $0x3fc00000,%edx
mov    -0x4(%rbp),%eax
add    $0x1fc,%eax
mov    %eax,%eax
mov    (%rax),%ecx
or     %edx,%ecx
mov    %ecx,(%rax)
jmp    118b <GPMCECCSizeValSet+0x8b>
pop    %rbp
ret

x86 assembly (clang, -O2):
<GPMCECCSizeValSet>:
test   %esi,%esi
je     111a <GPMCECCSizeValSet+0x1a>
cmp    $0x1,%esi
jne    1137 <GPMCECCSizeValSet+0x37>
mov    $0x3fc00000,%eax
mov    $0x16,%ecx
mov    $0xc03fffff,%esi
jmp    1129 <GPMCECCSizeValSet+0x29>
mov    $0xff000,%eax
mov    $0xc,%ecx
mov    $0xfff00fff,%esi
add    $0x1fc,%edi
and    %esi,(%rdi)
shl    %cl,%edx
and    %eax,%edx
or     %edx,(%rdi)
ret

LLVM IR (-O0):
define void @GPMCECCSizeValSet(i32 %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
store i32 %0, i32* %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%7 = load i32, i32* %5
%8 = icmp eq i32 %7, 0
br i1 %8, label %9, label %25
9: ; preds = %3
%10 = load i32, i32* %4
%11 = add i32 %10, 508
%12 = zext i32 %11 to i64
%13 = inttoptr i64 %12 to i32*
%14 = load volatile i32, i32* %13
%15 = and i32 %14, -1044481
store volatile i32 %15, i32* %13
%16 = load i32, i32* %6
%17 = shl i32 %16, 12
%18 = and i32 %17, 1044480
%19 = load i32, i32* %4
%20 = add i32 %19, 508
%21 = zext i32 %20 to i64
%22 = inttoptr i64 %21 to i32*
%23 = load volatile i32, i32* %22
%24 = or i32 %23, %18
store volatile i32 %24, i32* %22
br label %45
25: ; preds = %3
%26 = load i32, i32* %5
%27 = icmp eq i32 %26, 1
br i1 %27, label %28, label %44
28: ; preds = %25
%29 = load i32, i32* %4
%30 = add i32 %29, 508
%31 = zext i32 %30 to i64
%32 = inttoptr i64 %31 to i32*
%33 = load volatile i32, i32* %32
%34 = and i32 %33, -1069547521
store volatile i32 %34, i32* %32
%35 = load i32, i32* %6
%36 = shl i32 %35, 22
%37 = and i32 %36, 1069547520
%38 = load i32, i32* %4
%39 = add i32 %38, 508
%40 = zext i32 %39 to i64
%41 = inttoptr i64 %40 to i32*
%42 = load volatile i32, i32* %41
%43 = or i32 %42, %37
store volatile i32 %43, i32* %41
br label %44
44: ; preds = %28, %25
br label %45
45: ; preds = %44, %9
ret void
}

LLVM IR (-O2):
define void @GPMCECCSizeValSet(i32 %0, i32 %1, i32 %2) {
switch i32 %1, label %18 [
i32 0, label %5
i32 1, label %4
]
4: ; preds = %3
br label %5
5: ; preds = %3, %4
%6 = phi i32 [ -1069547521, %4 ], [ -1044481, %3 ]
%7 = phi i32 [ 22, %4 ], [ 12, %3 ]
%8 = phi i32 [ 1069547520, %4 ], [ 1044480, %3 ]
%9 = add i32 %0, 508
%10 = zext i32 %9 to i64
%11 = inttoptr i64 %10 to i32*
%12 = load volatile i32, i32* %11
%13 = and i32 %12, %6
store volatile i32 %13, i32* %11
%14 = shl i32 %2, %7
%15 = and i32 %14, %8
%16 = load volatile i32, i32* %11
%17 = or i32 %16, %15
store volatile i32 %17, i32* %11
br label %18
18: ; preds = %5, %3
ret void
}