#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 */
size_t AT_BASE;
size_t AT_PAGESZ;
size_t AT_PHDR;
int DT_MIPS_LOCAL_GOTNO;
void __reloc_self(int c, size_t *a, size_t *dynv, size_t *got) {
  char *base;
  size_t t[20], n;
  for (a += c + 1; *a; a++)
    ;
  for (a++; *a; a += 2)
    if (*a < 20)
      t[*a] = a[1];
  base = (char *)t[AT_BASE];
  if (!base)
    base = (char *)(t[AT_PHDR] & -t[AT_PAGESZ]);
  for (a = dynv; *a; a += 2)
    if (*a - 0x70000000UL < 20)
      t[*a & 31] = a[1];
  n = t[DT_MIPS_LOCAL_GOTNO - 0x70000000];
  for (a = got; n; a++, n--)
    *a += (size_t)base;
}


x86 assembly (clang, -O0):
<__reloc_self>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x4(%rbp),%ecx
add    $0x1,%ecx
mov    -0x10(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmpq   $0x0,(%rax)
je     1153 <__reloc_self+0x53>
jmp    1142 <__reloc_self+0x42>
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
jmp    112f <__reloc_self+0x2f>
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmpq   $0x0,(%rax)
je     11a8 <__reloc_self+0xa8>
mov    -0x10(%rbp),%rax
cmpq   $0x14,(%rax)
jae    1192 <__reloc_self+0x92>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rcx
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
mov    %rcx,-0xd0(%rbp,%rax,8)
ff
jmp    1197 <__reloc_self+0x97>
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
jmp    115f <__reloc_self+0x5f>
mov    0x2e29(%rip),%rax
mov    (%rax),%rax
mov    -0xd0(%rbp,%rax,8),%rax
ff
mov    %rax,-0x28(%rbp)
cmpq   $0x0,-0x28(%rbp)
jne    11f6 <__reloc_self+0xf6>
mov    0x2df8(%rip),%rax
mov    (%rax),%rax
mov    -0xd0(%rbp,%rax,8),%rax
ff
mov    0x2dee(%rip),%rcx
mov    (%rcx),%rdx
xor    %ecx,%ecx
sub    -0xd0(%rbp,%rdx,8),%rcx
ff
and    %rcx,%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x10(%rbp)
mov    -0x10(%rbp),%rax
cmpq   $0x0,(%rax)
je     1254 <__reloc_self+0x154>
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
sub    $0x70000000,%rax
cmp    $0x14,%rax
jae    123e <__reloc_self+0x13e>
mov    -0x10(%rbp),%rax
mov    0x8(%rax),%rcx
mov    -0x10(%rbp),%rax
mov    (%rax),%rax
and    $0x1f,%rax
mov    %rcx,-0xd0(%rbp,%rax,8)
ff
jmp    1243 <__reloc_self+0x143>
mov    -0x10(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x10(%rbp)
jmp    11fe <__reloc_self+0xfe>
mov    0x2d8d(%rip),%rax
mov    (%rax),%eax
sub    $0x70000000,%eax
cltq
mov    -0xd0(%rbp,%rax,8),%rax
ff
mov    %rax,-0xd8(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x10(%rbp)
cmpq   $0x0,-0xd8(%rbp)
je     12ba <__reloc_self+0x1ba>
mov    -0x28(%rbp),%rcx
mov    -0x10(%rbp),%rax
add    (%rax),%rcx
mov    %rcx,(%rax)
mov    -0x10(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x10(%rbp)
mov    -0xd8(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0xd8(%rbp)
jmp    127b <__reloc_self+0x17b>
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<__reloc_self>:
sub    $0x28,%rsp
movslq %edi,%rax
lea    (%rsi,%rax,8),%rax
add    $0x18,%rax
nop
cmpq   $0x0,-0x10(%rax)
lea    0x8(%rax),%rax
jne    1110 <__reloc_self+0x10>
mov    -0x10(%rax),%rsi
jmp    1137 <__reloc_self+0x37>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    (%rax),%rsi
add    $0x10,%rax
test   %rsi,%rsi
je     114d <__reloc_self+0x4d>
cmp    $0x13,%rsi
ja     1130 <__reloc_self+0x30>
mov    -0x8(%rax),%rdi
mov    %rdi,-0x80(%rsp,%rsi,8)
jmp    1130 <__reloc_self+0x30>
mov    0x2e84(%rip),%rax
mov    (%rax),%rax
mov    -0x80(%rsp,%rax,8),%rax
test   %rax,%rax
jne    1181 <__reloc_self+0x81>
mov    0x2e60(%rip),%rax
mov    (%rax),%rsi
mov    0x2e5e(%rip),%rax
mov    (%rax),%rdi
xor    %eax,%eax
sub    -0x80(%rsp,%rdi,8),%rax
and    -0x80(%rsp,%rsi,8),%rax
mov    (%rdx),%rsi
test   %rsi,%rsi
je     11b7 <__reloc_self+0xb7>
add    $0x10,%rdx
jmp    119c <__reloc_self+0x9c>
nop
mov    (%rdx),%rsi
add    $0x10,%rdx
test   %rsi,%rsi
je     11b7 <__reloc_self+0xb7>
lea    -0x70000000(%rsi),%rdi
cmp    $0x13,%rdi
ja     1190 <__reloc_self+0x90>
mov    -0x8(%rdx),%rdi
and    $0x1f,%esi
mov    %rdi,-0x80(%rsp,%rsi,8)
jmp    1190 <__reloc_self+0x90>
mov    0x2e2a(%rip),%rdx
movslq (%rdx),%rdx
lea    (%rsp,%rdx,8),%rdx
add    $0xffffffffffffff80,%rdx
movabs $0xfffffffc80000000,%rsi
ff ff ff
mov    (%rsi,%rdx,1),%rdx
test   %rdx,%rdx
je     12ad <__reloc_self+0x1ad>
cmp    $0x4,%rdx
jb     1298 <__reloc_self+0x198>
mov    %rdx,%r8
and    $0xfffffffffffffffc,%r8
movq   %rax,%xmm0
pshufd $0x44,%xmm0,%xmm0
lea    -0x4(%r8),%rsi
mov    %rsi,%r9
shr    $0x2,%r9
add    $0x1,%r9
test   %rsi,%rsi
je     12b2 <__reloc_self+0x1b2>
mov    %r9,%rsi
and    $0xfffffffffffffffe,%rsi
xor    %edi,%edi
nopl   0x0(%rax)
movdqu (%rcx,%rdi,8),%xmm1
movdqu 0x10(%rcx,%rdi,8),%xmm2
movdqu 0x20(%rcx,%rdi,8),%xmm3
movdqu 0x30(%rcx,%rdi,8),%xmm4
paddq  %xmm0,%xmm1
paddq  %xmm0,%xmm2
movdqu %xmm1,(%rcx,%rdi,8)
movdqu %xmm2,0x10(%rcx,%rdi,8)
paddq  %xmm0,%xmm3
paddq  %xmm0,%xmm4
movdqu %xmm3,0x20(%rcx,%rdi,8)
movdqu %xmm4,0x30(%rcx,%rdi,8)
add    $0x8,%rdi
add    $0xfffffffffffffffe,%rsi
jne    1220 <__reloc_self+0x120>
test   $0x1,%r9b
je     128c <__reloc_self+0x18c>
movdqu (%rcx,%rdi,8),%xmm1
movdqu 0x10(%rcx,%rdi,8),%xmm2
paddq  %xmm0,%xmm1
paddq  %xmm0,%xmm2
movdqu %xmm1,(%rcx,%rdi,8)
movdqu %xmm2,0x10(%rcx,%rdi,8)
cmp    %r8,%rdx
je     12ad <__reloc_self+0x1ad>
and    $0x3,%edx
lea    (%rcx,%r8,8),%rcx
xor    %esi,%esi
nopw   0x0(%rax,%rax,1)
add    %rax,(%rcx,%rsi,8)
add    $0x1,%rsi
cmp    %rsi,%rdx
jne    12a0 <__reloc_self+0x1a0>
add    $0x28,%rsp
ret
xor    %edi,%edi
test   $0x1,%r9b
jne    126e <__reloc_self+0x16e>
jmp    128c <__reloc_self+0x18c>

LLVM IR (-O0):
@AT_BASE = global i64 0
@AT_PHDR = global i64 0
@AT_PAGESZ = global i64 0
@DT_MIPS_LOCAL_GOTNO = global i32 0
define void @__reloc_self(i32 %0, i64* %1, i64* %2, i64* %3) {
%5 = alloca i32
%6 = alloca i64*
%7 = alloca i64*
%8 = alloca i64*
%9 = alloca i8*
%10 = alloca [20 x i64]
%11 = alloca i64
store i32 %0, i32* %5
store i64* %1, i64** %6
store i64* %2, i64** %7
store i64* %3, i64** %8
%12 = load i32, i32* %5
%13 = add nsw i32 %12, 1
%14 = load i64*, i64** %6
%15 = sext i32 %13 to i64
%16 = getelementptr inbounds i64, i64* %14, i64 %15
store i64* %16, i64** %6
br label %17
17: ; preds = %22, %4
%18 = load i64*, i64** %6
%19 = load i64, i64* %18
%20 = icmp ne i64 %19, 0
br i1 %20, label %21, label %25
21: ; preds = %17
br label %22
22: ; preds = %21
%23 = load i64*, i64** %6
%24 = getelementptr inbounds i64, i64* %23, i32 1
store i64* %24, i64** %6
br label %17
25: ; preds = %17
%26 = load i64*, i64** %6
%27 = getelementptr inbounds i64, i64* %26, i32 1
store i64* %27, i64** %6
br label %28
28: ; preds = %44, %25
%29 = load i64*, i64** %6
%30 = load i64, i64* %29
%31 = icmp ne i64 %30, 0
br i1 %31, label %32, label %47
32: ; preds = %28
%33 = load i64*, i64** %6
%34 = load i64, i64* %33
%35 = icmp ult i64 %34, 20
br i1 %35, label %36, label %43
36: ; preds = %32
%37 = load i64*, i64** %6
%38 = getelementptr inbounds i64, i64* %37, i64 1
%39 = load i64, i64* %38
%40 = load i64*, i64** %6
%41 = load i64, i64* %40
%42 = getelementptr inbounds [20 x i64], [20 x i64]* %10, i64 0, i64 %41
store i64 %39, i64* %42
br label %43
43: ; preds = %36, %32
br label %44
44: ; preds = %43
%45 = load i64*, i64** %6
%46 = getelementptr inbounds i64, i64* %45, i64 2
store i64* %46, i64** %6
br label %28
47: ; preds = %28
%48 = load i64, i64* @AT_BASE
%49 = getelementptr inbounds [20 x i64], [20 x i64]* %10, i64 0, i64 %48
%50 = load i64, i64* %49
%51 = inttoptr i64 %50 to i8*
store i8* %51, i8** %9
%52 = load i8*, i8** %9
%53 = icmp ne i8* %52, null
br i1 %53, label %64, label %54
54: ; preds = %47
%55 = load i64, i64* @AT_PHDR
%56 = getelementptr inbounds [20 x i64], [20 x i64]* %10, i64 0, i64 %55
%57 = load i64, i64* %56
%58 = load i64, i64* @AT_PAGESZ
%59 = getelementptr inbounds [20 x i64], [20 x i64]* %10, i64 0, i64 %58
%60 = load i64, i64* %59
%61 = sub i64 0, %60
%62 = and i64 %57, %61
%63 = inttoptr i64 %62 to i8*
store i8* %63, i8** %9
br label %64
64: ; preds = %54, %47
%65 = load i64*, i64** %7
store i64* %65, i64** %6
br label %66
66: ; preds = %84, %64
%67 = load i64*, i64** %6
%68 = load i64, i64* %67
%69 = icmp ne i64 %68, 0
br i1 %69, label %70, label %87
70: ; preds = %66
%71 = load i64*, i64** %6
%72 = load i64, i64* %71
%73 = sub i64 %72, 1879048192
%74 = icmp ult i64 %73, 20
br i1 %74, label %75, label %83
75: ; preds = %70
%76 = load i64*, i64** %6
%77 = getelementptr inbounds i64, i64* %76, i64 1
%78 = load i64, i64* %77
%79 = load i64*, i64** %6
%80 = load i64, i64* %79
%81 = and i64 %80, 31
%82 = getelementptr inbounds [20 x i64], [20 x i64]* %10, i64 0, i64 %81
store i64 %78, i64* %82
br label %83
83: ; preds = %75, %70
br label %84
84: ; preds = %83
%85 = load i64*, i64** %6
%86 = getelementptr inbounds i64, i64* %85, i64 2
store i64* %86, i64** %6
br label %66
87: ; preds = %66
%88 = load i32, i32* @DT_MIPS_LOCAL_GOTNO
%89 = sub nsw i32 %88, 1879048192
%90 = sext i32 %89 to i64
%91 = getelementptr inbounds [20 x i64], [20 x i64]* %10, i64 0, i64 %90
%92 = load i64, i64* %91
store i64 %92, i64* %11
%93 = load i64*, i64** %8
store i64* %93, i64** %6
br label %94
94: ; preds = %103, %87
%95 = load i64, i64* %11
%96 = icmp ne i64 %95, 0
br i1 %96, label %97, label %108
97: ; preds = %94
%98 = load i8*, i8** %9
%99 = ptrtoint i8* %98 to i64
%100 = load i64*, i64** %6
%101 = load i64, i64* %100
%102 = add i64 %101, %99
store i64 %102, i64* %100
br label %103
103: ; preds = %97
%104 = load i64*, i64** %6
%105 = getelementptr inbounds i64, i64* %104, i32 1
store i64* %105, i64** %6
%106 = load i64, i64* %11
%107 = add i64 %106, -1
store i64 %107, i64* %11
br label %94
108: ; preds = %94
ret void
}

LLVM IR (-O2):
@AT_BASE = global i64 0
@AT_PHDR = global i64 0
@AT_PAGESZ = global i64 0
@DT_MIPS_LOCAL_GOTNO = global i32 0
define void @__reloc_self(i32 %0, i64* nocapture %1, i64* nocapture %2, i64* nocapture %3) {
%5 = alloca [20 x i64]
%6 = bitcast [20 x i64]* %5 to i8*
%7 = add nsw i32 %0, 1
%8 = sext i32 %7 to i64
%9 = getelementptr inbounds i64, i64* %1, i64 %8
br label %10
10: ; preds = %10, %4
%11 = phi i64* [ %9, %4 ], [ %14, %10 ]
%12 = load i64, i64* %11
%13 = icmp eq i64 %12, 0
%14 = getelementptr inbounds i64, i64* %11, i64 1
br i1 %13, label %15, label %10
15: ; preds = %10
%16 = load i64, i64* %14
%17 = icmp eq i64 %16, 0
br i1 %17, label %30, label %18
18: ; preds = %15, %26
%19 = phi i64 [ %28, %26 ], [ %16, %15 ]
%20 = phi i64* [ %27, %26 ], [ %14, %15 ]
%21 = icmp ult i64 %19, 20
br i1 %21, label %22, label %26
22: ; preds = %18
%23 = getelementptr inbounds i64, i64* %20, i64 1
%24 = load i64, i64* %23
%25 = getelementptr inbounds [20 x i64], [20 x i64]* %5, i64 0, i64 %19
store i64 %24, i64* %25
br label %26
26: ; preds = %18, %22
%27 = getelementptr inbounds i64, i64* %20, i64 2
%28 = load i64, i64* %27
%29 = icmp eq i64 %28, 0
br i1 %29, label %30, label %18
30: ; preds = %26, %15
%31 = load i64, i64* @AT_BASE
%32 = getelementptr inbounds [20 x i64], [20 x i64]* %5, i64 0, i64 %31
%33 = load i64, i64* %32
%34 = icmp eq i64 %33, 0
br i1 %34, label %35, label %44
35: ; preds = %30
%36 = load i64, i64* @AT_PHDR
%37 = getelementptr inbounds [20 x i64], [20 x i64]* %5, i64 0, i64 %36
%38 = load i64, i64* %37
%39 = load i64, i64* @AT_PAGESZ
%40 = getelementptr inbounds [20 x i64], [20 x i64]* %5, i64 0, i64 %39
%41 = load i64, i64* %40
%42 = sub i64 0, %41
%43 = and i64 %38, %42
br label %44
44: ; preds = %35, %30
%45 = phi i64 [ %33, %30 ], [ %43, %35 ]
%46 = load i64, i64* %2
%47 = icmp eq i64 %46, 0
br i1 %47, label %62, label %48
48: ; preds = %44, %58
%49 = phi i64 [ %60, %58 ], [ %46, %44 ]
%50 = phi i64* [ %59, %58 ], [ %2, %44 ]
%51 = add i64 %49, -1879048192
%52 = icmp ult i64 %51, 20
br i1 %52, label %53, label %58
53: ; preds = %48
%54 = getelementptr inbounds i64, i64* %50, i64 1
%55 = load i64, i64* %54
%56 = and i64 %49, 31
%57 = getelementptr inbounds [20 x i64], [20 x i64]* %5, i64 0, i64 %56
store i64 %55, i64* %57
br label %58
58: ; preds = %48, %53
%59 = getelementptr inbounds i64, i64* %50, i64 2
%60 = load i64, i64* %59
%61 = icmp eq i64 %60, 0
br i1 %61, label %62, label %48
62: ; preds = %58, %44
%63 = load i32, i32* @DT_MIPS_LOCAL_GOTNO
%64 = add nsw i32 %63, -1879048192
%65 = sext i32 %64 to i64
%66 = getelementptr inbounds [20 x i64], [20 x i64]* %5, i64 0, i64 %65
%67 = load i64, i64* %66
%68 = icmp eq i64 %67, 0
br i1 %68, label %140, label %69
69: ; preds = %62
%70 = icmp ult i64 %67, 4
br i1 %70, label %129, label %71
71: ; preds = %69
%72 = and i64 %67, -4
%73 = and i64 %67, 3
%74 = getelementptr i64, i64* %3, i64 %72
%75 = insertelement <2 x i64> poison, i64 %45, i64 0
%76 = shufflevector <2 x i64> %75, <2 x i64> poison, <2 x i32> zeroinitializer
%77 = insertelement <2 x i64> poison, i64 %45, i64 0
%78 = shufflevector <2 x i64> %77, <2 x i64> poison, <2 x i32> zeroinitializer
%79 = add i64 %72, -4
%80 = lshr exact i64 %79, 2
%81 = add nuw nsw i64 %80, 1
%82 = and i64 %81, 1
%83 = icmp eq i64 %79, 0
br i1 %83, label %113, label %84
84: ; preds = %71
%85 = and i64 %81, 9223372036854775806
br label %86
86: ; preds = %86, %84
%87 = phi i64 [ 0, %84 ], [ %110, %86 ]
%88 = phi i64 [ 0, %84 ], [ %111, %86 ]
%89 = getelementptr i64, i64* %3, i64 %87
%90 = bitcast i64* %89 to <2 x i64>*
%91 = load <2 x i64>, <2 x i64>* %90
%92 = getelementptr i64, i64* %89, i64 2
%93 = bitcast i64* %92 to <2 x i64>*
%94 = load <2 x i64>, <2 x i64>* %93
%95 = add <2 x i64> %91, %76
%96 = add <2 x i64> %94, %78
%97 = bitcast i64* %89 to <2 x i64>*
store <2 x i64> %95, <2 x i64>* %97
%98 = bitcast i64* %92 to <2 x i64>*
store <2 x i64> %96, <2 x i64>* %98
%99 = or i64 %87, 4
%100 = getelementptr i64, i64* %3, i64 %99
%101 = bitcast i64* %100 to <2 x i64>*
%102 = load <2 x i64>, <2 x i64>* %101
%103 = getelementptr i64, i64* %100, i64 2
%104 = bitcast i64* %103 to <2 x i64>*
%105 = load <2 x i64>, <2 x i64>* %104
%106 = add <2 x i64> %102, %76
%107 = add <2 x i64> %105, %78
%108 = bitcast i64* %100 to <2 x i64>*
store <2 x i64> %106, <2 x i64>* %108
%109 = bitcast i64* %103 to <2 x i64>*
store <2 x i64> %107, <2 x i64>* %109
%110 = add nuw i64 %87, 8
%111 = add i64 %88, 2
%112 = icmp eq i64 %111, %85
br i1 %112, label %113, label %86
113: ; preds = %86, %71
%114 = phi i64 [ 0, %71 ], [ %110, %86 ]
%115 = icmp eq i64 %82, 0
br i1 %115, label %127, label %116
116: ; preds = %113
%117 = getelementptr i64, i64* %3, i64 %114
%118 = bitcast i64* %117 to <2 x i64>*
%119 = load <2 x i64>, <2 x i64>* %118
%120 = getelementptr i64, i64* %117, i64 2
%121 = bitcast i64* %120 to <2 x i64>*
%122 = load <2 x i64>, <2 x i64>* %121
%123 = add <2 x i64> %119, %76
%124 = add <2 x i64> %122, %78
%125 = bitcast i64* %117 to <2 x i64>*
store <2 x i64> %123, <2 x i64>* %125
%126 = bitcast i64* %120 to <2 x i64>*
store <2 x i64> %124, <2 x i64>* %126
br label %127
127: ; preds = %113, %116
%128 = icmp eq i64 %67, %72
br i1 %128, label %140, label %129
129: ; preds = %69, %127
%130 = phi i64 [ %67, %69 ], [ %73, %127 ]
%131 = phi i64* [ %3, %69 ], [ %74, %127 ]
br label %132
132: ; preds = %129, %132
%133 = phi i64 [ %138, %132 ], [ %130, %129 ]
%134 = phi i64* [ %137, %132 ], [ %131, %129 ]
%135 = load i64, i64* %134
%136 = add i64 %135, %45
store i64 %136, i64* %134
%137 = getelementptr inbounds i64, i64* %134, i64 1
%138 = add i64 %133, -1
%139 = icmp eq i64 %138, 0
br i1 %139, label %140, label %132
140: ; preds = %132, %127, %62
ret void
}