#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 */
typedef struct TYPE_2__ TYPE_1__;

/* Type definitions */
struct TYPE_2__ {
  int /*<<< orphan*/ _mp_d;
  int /*<<< orphan*/ _mp_size;
  int /*<<< orphan*/ _mp_alloc;
};
typedef TYPE_1__ MP_INT;

/* Variables and functions */
int /*<<< orphan*/ printf(char *, ...);
int main(void) {
  printf("/* This file is created automatically.  Do not edit by hand.*/\n\n");
  printf("#define SIZEOF_"
         "MP_INT"
         " %lu\n",
         (unsigned long)sizeof(MP_INT));
  ;
  ;
  printf("#define OFFSET_"
         "MP_INT"
         "_"
         "_mp_alloc"
         " %d\n",
         (int)(((size_t) & (((MP_INT *)0)->_mp_alloc))));
  ;
  ;
  ;
  printf("#define REP_"
         "MP_INT"
         "_"
         "_mp_alloc"
         " b");
  printf("%lu\n",
         (unsigned long)sizeof(__typeof__(((((MP_INT *)0)->_mp_alloc)))) * 8);
  ;
  ;
  printf("#define "
         "MP_INT"
         "_"
         "_mp_alloc"
         "(__ptr__)  REP_"
         "MP_INT"
         "_"
         "_mp_alloc"
         "[__ptr__+OFFSET_"
         "MP_INT"
         "_"
         "_mp_alloc"
         "]\n");
  ;
  printf("#define OFFSET_"
         "MP_INT"
         "_"
         "_mp_size"
         " %d\n",
         (int)(((size_t) & (((MP_INT *)0)->_mp_size))));
  ;
  ;
  ;
  printf("#define REP_"
         "MP_INT"
         "_"
         "_mp_size"
         " b");
  printf("%lu\n",
         (unsigned long)sizeof(__typeof__(((((MP_INT *)0)->_mp_size)))) * 8);
  ;
  ;
  printf("#define "
         "MP_INT"
         "_"
         "_mp_size"
         "(__ptr__)  REP_"
         "MP_INT"
         "_"
         "_mp_size"
         "[__ptr__+OFFSET_"
         "MP_INT"
         "_"
         "_mp_size"
         "]\n");
  ;
  printf("#define OFFSET_"
         "MP_INT"
         "_"
         "_mp_d"
         " %d\n",
         (int)(((size_t) & (((MP_INT *)0)->_mp_d))));
  ;
  ;
  ;
  printf("#define REP_"
         "MP_INT"
         "_"
         "_mp_d"
         " b");
  printf("%lu\n",
         (unsigned long)sizeof(__typeof__(((((MP_INT *)0)->_mp_d)))) * 8);
  ;
  ;
  printf("#define "
         "MP_INT"
         "_"
         "_mp_d"
         "(__ptr__)  REP_"
         "MP_INT"
         "_"
         "_mp_d"
         "[__ptr__+OFFSET_"
         "MP_INT"
         "_"
         "_mp_d"
         "]\n");
  ;
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x10,%rsp
movl   $0x0,-0x4(%rbp)
lea    0xeda(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf0d(%rip),%rdi
mov    $0xc,%esi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf15(%rip),%rdi
xor    %eax,%eax
add    $0x8,%rax
mov    %eax,%esi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf23(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xeec(%rip),%rdi
mov    $0x20,%esi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf21(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf6d(%rip),%rdi
xor    %eax,%eax
add    $0x4,%rax
mov    %eax,%esi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf7a(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xea7(%rip),%rdi
mov    $0x20,%esi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xf77(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xfc0(%rip),%rdi
xor    %esi,%esi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xfd0(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xe68(%rip),%rdi
mov    $0x20,%esi
mov    $0x0,%al
call   1030 <printf@plt>
lea    0xfca(%rip),%rdi
mov    $0x0,%al
call   1030 <printf@plt>
xor    %eax,%eax
add    $0x10,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbx
lea    0xfb2(%rip),%rdi
call   1030 <puts@plt>
lea    0xecc(%rip),%rdi
mov    $0xc,%esi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xed4(%rip),%rdi
mov    $0x8,%esi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xee5(%rip),%rdi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xeae(%rip),%rbx
mov    $0x20,%esi
mov    %rbx,%rdi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xf9c(%rip),%rdi
call   1030 <puts@plt>
lea    0xed4(%rip),%rdi
mov    $0x4,%esi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xee4(%rip),%rdi
xor    %eax,%eax
call   1040 <printf@plt>
mov    $0x20,%esi
mov    %rbx,%rdi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xfb9(%rip),%rdi
call   1030 <puts@plt>
lea    0xed9(%rip),%rdi
xor    %esi,%esi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xee9(%rip),%rdi
xor    %eax,%eax
call   1040 <printf@plt>
mov    $0x20,%esi
mov    %rbx,%rdi
xor    %eax,%eax
call   1040 <printf@plt>
lea    0xfd6(%rip),%rdi
call   1030 <puts@plt>
xor    %eax,%eax
pop    %rbx
ret

LLVM IR (-O0):
%struct.TYPE_2__ = type { i32, i32, i32 }
@.str = [65 x i8] c"/* This file is created automatically. Do not edit by hand.*/\0A\0A\00"
@.str.1 = [27 x i8] c"#define SIZEOF_MP_INT %lu\0A\00"
@.str.2 = [36 x i8] c"#define OFFSET_MP_INT__mp_alloc %d\0A\00"
@.str.3 = [31 x i8] c"#define REP_MP_INT__mp_alloc b\00"
@.str.4 = [5 x i8] c"%lu\0A\00"
@.str.5 = [90 x i8] c"#define MP_INT__mp_alloc(__ptr__) REP_MP_INT__mp_alloc[__ptr__+OFFSET_MP_INT__mp_alloc]\0A\00"
@.str.6 = [35 x i8] c"#define OFFSET_MP_INT__mp_size %d\0A\00"
@.str.7 = [30 x i8] c"#define REP_MP_INT__mp_size b\00"
@.str.8 = [87 x i8] c"#define MP_INT__mp_size(__ptr__) REP_MP_INT__mp_size[__ptr__+OFFSET_MP_INT__mp_size]\0A\00"
@.str.9 = [32 x i8] c"#define OFFSET_MP_INT__mp_d %d\0A\00"
@.str.10 = [27 x i8] c"#define REP_MP_INT__mp_d b\00"
@.str.11 = [78 x i8] c"#define MP_INT__mp_d(__ptr__) REP_MP_INT__mp_d[__ptr__+OFFSET_MP_INT__mp_d]\0A\00"
define i32 @main() {
%1 = alloca i32
store i32 0, i32* %1
%2 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([65 x i8], [65 x i8]* @.str, i64 0, i64 0))
%3 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.1, i64 0, i64 0), i64 12)
%4 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([36 x i8], [36 x i8]* @.str.2, i64 0, i64 0), i32 ptrtoint (i32* getelementptr inbounds (%struct.TYPE_2__, %struct.TYPE_2__* null, i32 0, i32 2) to i32))
%5 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([31 x i8], [31 x i8]* @.str.3, i64 0, i64 0))
%6 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i64 0, i64 0), i64 32)
%7 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([90 x i8], [90 x i8]* @.str.5, i64 0, i64 0))
%8 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([35 x i8], [35 x i8]* @.str.6, i64 0, i64 0), i32 ptrtoint (i32* getelementptr inbounds (%struct.TYPE_2__, %struct.TYPE_2__* null, i32 0, i32 1) to i32))
%9 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([30 x i8], [30 x i8]* @.str.7, i64 0, i64 0))
%10 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i64 0, i64 0), i64 32)
%11 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([87 x i8], [87 x i8]* @.str.8, i64 0, i64 0))
%12 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([32 x i8], [32 x i8]* @.str.9, i64 0, i64 0), i32 0)
%13 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([27 x i8], [27 x i8]* @.str.10, i64 0, i64 0))
%14 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i64 0, i64 0), i64 32)
%15 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([78 x i8], [78 x i8]* @.str.11, i64 0, i64 0))
ret i32 0
}

LLVM IR (-O2):
@.str.1 = [27 x i8] c"#define SIZEOF_MP_INT %lu\0A\00"
@.str.2 = [36 x i8] c"#define OFFSET_MP_INT__mp_alloc %d\0A\00"
@.str.3 = [31 x i8] c"#define REP_MP_INT__mp_alloc b\00"
@.str.4 = [5 x i8] c"%lu\0A\00"
@.str.6 = [35 x i8] c"#define OFFSET_MP_INT__mp_size %d\0A\00"
@.str.7 = [30 x i8] c"#define REP_MP_INT__mp_size b\00"
@.str.9 = [32 x i8] c"#define OFFSET_MP_INT__mp_d %d\0A\00"
@.str.10 = [27 x i8] c"#define REP_MP_INT__mp_d b\00"
@str = [64 x i8] c"/* This file is created automatically. Do not edit by hand.*/\0A\00"
@str.12 = [89 x i8] c"#define MP_INT__mp_alloc(__ptr__) REP_MP_INT__mp_alloc[__ptr__+OFFSET_MP_INT__mp_alloc]\00"
@str.13 = [86 x i8] c"#define MP_INT__mp_size(__ptr__) REP_MP_INT__mp_size[__ptr__+OFFSET_MP_INT__mp_size]\00"
@str.14 = [77 x i8] c"#define MP_INT__mp_d(__ptr__) REP_MP_INT__mp_d[__ptr__+OFFSET_MP_INT__mp_d]\00"
define i32 @main() {
%1 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([64 x i8], [64 x i8]* @str, i64 0, i64 0))
%2 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([27 x i8], [27 x i8]* @.str.1, i64 0, i64 0), i64 12)
%3 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([36 x i8], [36 x i8]* @.str.2, i64 0, i64 0), i32 8)
%4 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([31 x i8], [31 x i8]* @.str.3, i64 0, i64 0))
%5 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i64 0, i64 0), i64 32)
%6 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([89 x i8], [89 x i8]* @str.12, i64 0, i64 0))
%7 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([35 x i8], [35 x i8]* @.str.6, i64 0, i64 0), i32 4)
%8 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([30 x i8], [30 x i8]* @.str.7, i64 0, i64 0))
%9 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i64 0, i64 0), i64 32)
%10 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([86 x i8], [86 x i8]* @str.13, i64 0, i64 0))
%11 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([32 x i8], [32 x i8]* @.str.9, i64 0, i64 0), i32 0)
%12 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([27 x i8], [27 x i8]* @.str.10, i64 0, i64 0))
%13 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.4, i64 0, i64 0), i64 32)
%14 = tail call i32 @puts(i8* dereferenceable(1) getelementptr inbounds ([77 x i8], [77 x i8]* @str.14, i64 0, i64 0))
ret i32 0
}