#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*/ printf(char *, char *);
scalar_t__ strcmp(char *, char *);
int strlen(char *);
int palindrome(int number) {
  char result[200];
  int i, l;
  for (i = 0; number != 0; i++) {
    if (number % 16 > 9) {
      result[i] = number % 16 + 'A' - 10;
    } else
      result[i] = number % 16 + '0';
    number /= 16;
  }
  result[i] = '\0';
  char reverse[200];
  for (l = strlen(result) - 1, i = 0; l != -1; l--, i++) {
    reverse[i] = result[l];
  }
  reverse[i] = '\0';
  if (strcmp(result, reverse) == 0) {
    printf("%s", reverse);
    return 0;
  } else
    return 1;
}


x86 assembly (clang, -O0):
<palindrome>:
push   %rbp
mov    %rsp,%rbp
sub    $0x1a0,%rsp
mov    %edi,-0x8(%rbp)
movl   $0x0,-0xd4(%rbp)
cmpl   $0x0,-0x8(%rbp)
je     11ce <palindrome+0x9e>
mov    -0x8(%rbp),%eax
mov    $0x10,%ecx
cltd
idiv   %ecx
cmp    $0x9,%edx
jle    118e <palindrome+0x5e>
mov    -0x8(%rbp),%eax
mov    $0x10,%ecx
cltd
idiv   %ecx
mov    %edx,%eax
add    $0x41,%eax
sub    $0xa,%eax
mov    %al,%cl
movslq -0xd4(%rbp),%rax
mov    %cl,-0xd0(%rbp,%rax,1)
jmp    11ac <palindrome+0x7c>
mov    -0x8(%rbp),%eax
mov    $0x10,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
mov    %dl,%cl
movslq -0xd4(%rbp),%rax
mov    %cl,-0xd0(%rbp,%rax,1)
mov    -0x8(%rbp),%eax
mov    $0x10,%ecx
cltd
idiv   %ecx
mov    %eax,-0x8(%rbp)
mov    -0xd4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xd4(%rbp)
jmp    1148 <palindrome+0x18>
movslq -0xd4(%rbp),%rax
movb   $0x0,-0xd0(%rbp,%rax,1)
lea    -0xd0(%rbp),%rdi
call   1030 <strlen@plt>
sub    $0x1,%eax
mov    %eax,-0xd8(%rbp)
movl   $0x0,-0xd4(%rbp)
cmpl   $0xffffffff,-0xd8(%rbp)
je     1248 <palindrome+0x118>
movslq -0xd8(%rbp),%rax
mov    -0xd0(%rbp,%rax,1),%cl
movslq -0xd4(%rbp),%rax
mov    %cl,-0x1a0(%rbp,%rax,1)
mov    -0xd8(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0xd8(%rbp)
mov    -0xd4(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xd4(%rbp)
jmp    11fc <palindrome+0xcc>
movslq -0xd4(%rbp),%rax
movb   $0x0,-0x1a0(%rbp,%rax,1)
lea    -0xd0(%rbp),%rdi
lea    -0x1a0(%rbp),%rsi
call   1050 <strcmp@plt>
cmp    $0x0,%rax
jne    1293 <palindrome+0x163>
lea    -0x1a0(%rbp),%rsi
lea    0xd7e(%rip),%rdi
call   1040 <printf@plt>
movl   $0x0,-0x4(%rbp)
jmp    129a <palindrome+0x16a>
movl   $0x1,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0x1a0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<palindrome>:
push   %rbx
sub    $0x1a0,%rsp
xor    %eax,%eax
test   %edi,%edi
je     1187 <palindrome+0x57>
mov    $0x37,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    0xf(%rdi),%edx
test   %edi,%edi
mov    %edi,%ebx
cmovs  %edx,%ebx
mov    %ebx,%esi
and    $0xfffffff0,%esi
sub    %esi,%edi
cmp    $0xa,%edi
mov    $0x30,%esi
cmovge %ecx,%esi
add    %dil,%sil
mov    %sil,0xd0(%rsp,%rax,1)
sar    $0x4,%ebx
add    $0x1,%rax
mov    %ebx,%edi
cmp    $0x1e,%edx
ja     1150 <palindrome+0x20>
mov    %eax,%eax
movb   $0x0,0xd0(%rsp,%rax,1)
lea    0xd0(%rsp),%rbx
mov    %rbx,%rdi
call   1030 <strlen@plt>
test   %eax,%eax
je     11b7 <palindrome+0x87>
movslq %eax,%rdx
mov    %eax,%ecx
cmp    $0x8,%eax
jae    11be <palindrome+0x8e>
xor    %eax,%eax
mov    %rdx,%rsi
jmp    12c2 <palindrome+0x192>
xor    %ecx,%ecx
jmp    12e3 <palindrome+0x1b3>
cmp    $0x20,%eax
jae    11ca <palindrome+0x9a>
xor    %eax,%eax
jmp    126f <palindrome+0x13f>
mov    %ecx,%eax
and    $0xffffffe0,%eax
lea    (%rdx,%rbx,1),%rsi
add    $0xfffffffffffffff0,%rsi
xor    %edi,%edi
pxor   %xmm0,%xmm0
nopl   (%rax)
movdqu -0x10(%rsi),%xmm1
movdqu (%rsi),%xmm2
movdqa %xmm2,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm2
pshufd $0x4e,%xmm2,%xmm2
pshuflw $0x1b,%xmm2,%xmm2
pshufhw $0x1b,%xmm2,%xmm2
packuswb %xmm3,%xmm2
movdqa %xmm1,%xmm3
punpcklbw %xmm0,%xmm3
pshufd $0x4e,%xmm3,%xmm3
pshuflw $0x1b,%xmm3,%xmm3
pshufhw $0x1b,%xmm3,%xmm3
punpckhbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm3,%xmm1
movdqa %xmm2,(%rsp,%rdi,1)
movdqa %xmm1,0x10(%rsp,%rdi,1)
add    $0x20,%rdi
add    $0xffffffffffffffe0,%rsi
cmp    %rdi,%rax
jne    11e0 <palindrome+0xb0>
cmp    %rcx,%rax
je     12e3 <palindrome+0x1b3>
test   $0x18,%cl
je     131e <palindrome+0x1ee>
mov    %rax,%rdi
mov    %ecx,%eax
and    $0xfffffff8,%eax
mov    %rdx,%rsi
sub    %rax,%rsi
sub    %rdi,%rdx
add    %rsp,%rdx
add    $0xc8,%rdx
pxor   %xmm0,%xmm0
xchg   %ax,%ax
movq   (%rdx),%xmm1
punpcklbw %xmm0,%xmm1
pshufd $0x4e,%xmm1,%xmm1
pshuflw $0x1b,%xmm1,%xmm1
pshufhw $0x1b,%xmm1,%xmm1
packuswb %xmm1,%xmm1
movq   %xmm1,(%rsp,%rdi,1)
add    $0x8,%rdi
add    $0xfffffffffffffff8,%rdx
cmp    %rdi,%rax
jne    1290 <palindrome+0x160>
cmp    %rcx,%rax
je     12e3 <palindrome+0x1b3>
lea    (%rsi,%rbx,1),%rdx
add    $0xffffffffffffffff,%rdx
nopw   0x0(%rax,%rax,1)
movzbl (%rdx),%ebx
mov    %bl,(%rsp,%rax,1)
add    $0x1,%rax
add    $0xffffffffffffffff,%rdx
cmp    %rax,%rcx
jne    12d0 <palindrome+0x1a0>
movb   $0x0,(%rsp,%rcx,1)
lea    0xd0(%rsp),%rdi
mov    %rsp,%rsi
call   1050 <strcmp@plt>
mov    %rax,%rcx
mov    $0x1,%eax
test   %rcx,%rcx
jne    1315 <palindrome+0x1e5>
lea    0xcf5(%rip),%rdi
mov    %rsp,%rsi
call   1040 <printf@plt>
xor    %eax,%eax
add    $0x1a0,%rsp
pop    %rbx
ret
sub    %rax,%rdx
jmp    11af <palindrome+0x7f>

LLVM IR (-O0):
@.str = [3 x i8] c"%s\00"
define i32 @palindrome(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca [200 x i8]
%5 = alloca i32
%6 = alloca i32
%7 = alloca [200 x i8]
store i32 %0, i32* %3
store i32 0, i32* %5
br label %8
8: ; preds = %35, %1
%9 = load i32, i32* %3
%10 = icmp ne i32 %9, 0
br i1 %10, label %11, label %38
11: ; preds = %8
%12 = load i32, i32* %3
%13 = srem i32 %12, 16
%14 = icmp sgt i32 %13, 9
br i1 %14, label %15, label %24
15: ; preds = %11
%16 = load i32, i32* %3
%17 = srem i32 %16, 16
%18 = add nsw i32 %17, 65
%19 = sub nsw i32 %18, 10
%20 = trunc i32 %19 to i8
%21 = load i32, i32* %5
%22 = sext i32 %21 to i64
%23 = getelementptr inbounds [200 x i8], [200 x i8]* %4, i64 0, i64 %22
store i8 %20, i8* %23
br label %32
24: ; preds = %11
%25 = load i32, i32* %3
%26 = srem i32 %25, 16
%27 = add nsw i32 %26, 48
%28 = trunc i32 %27 to i8
%29 = load i32, i32* %5
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds [200 x i8], [200 x i8]* %4, i64 0, i64 %30
store i8 %28, i8* %31
br label %32
32: ; preds = %24, %15
%33 = load i32, i32* %3
%34 = sdiv i32 %33, 16
store i32 %34, i32* %3
br label %35
35: ; preds = %32
%36 = load i32, i32* %5
%37 = add nsw i32 %36, 1
store i32 %37, i32* %5
br label %8
38: ; preds = %8
%39 = load i32, i32* %5
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds [200 x i8], [200 x i8]* %4, i64 0, i64 %40
store i8 0, i8* %41
%42 = getelementptr inbounds [200 x i8], [200 x i8]* %4, i64 0, i64 0
%43 = call i32 @strlen(i8* %42)
%44 = sub nsw i32 %43, 1
store i32 %44, i32* %6
store i32 0, i32* %5
br label %45
45: ; preds = %56, %38
%46 = load i32, i32* %6
%47 = icmp ne i32 %46, -1
br i1 %47, label %48, label %61
48: ; preds = %45
%49 = load i32, i32* %6
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds [200 x i8], [200 x i8]* %4, i64 0, i64 %50
%52 = load i8, i8* %51
%53 = load i32, i32* %5
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds [200 x i8], [200 x i8]* %7, i64 0, i64 %54
store i8 %52, i8* %55
br label %56
56: ; preds = %48
%57 = load i32, i32* %6
%58 = add nsw i32 %57, -1
store i32 %58, i32* %6
%59 = load i32, i32* %5
%60 = add nsw i32 %59, 1
store i32 %60, i32* %5
br label %45
61: ; preds = %45
%62 = load i32, i32* %5
%63 = sext i32 %62 to i64
%64 = getelementptr inbounds [200 x i8], [200 x i8]* %7, i64 0, i64 %63
store i8 0, i8* %64
%65 = getelementptr inbounds [200 x i8], [200 x i8]* %4, i64 0, i64 0
%66 = getelementptr inbounds [200 x i8], [200 x i8]* %7, i64 0, i64 0
%67 = call i64 @strcmp(i8* %65, i8* %66)
%68 = icmp eq i64 %67, 0
br i1 %68, label %69, label %72
69: ; preds = %61
%70 = getelementptr inbounds [200 x i8], [200 x i8]* %7, i64 0, i64 0
%71 = call i32 @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i8* %70)
store i32 0, i32* %2
br label %73
72: ; preds = %61
store i32 1, i32* %2
br label %73
73: ; preds = %72, %69
%74 = load i32, i32* %2
ret i32 %74
}

LLVM IR (-O2):
@.str = [3 x i8] c"%s\00"
define i32 @palindrome(i32 %0) {
%2 = alloca [200 x i8]
%3 = alloca [200 x i8]
%4 = getelementptr inbounds [200 x i8], [200 x i8]* %2, i64 0, i64 0
%5 = icmp eq i32 %0, 0
br i1 %5, label %21, label %6
6: ; preds = %1, %6
%7 = phi i64 [ %16, %6 ], [ 0, %1 ]
%8 = phi i32 [ %15, %6 ], [ %0, %1 ]
%9 = srem i32 %8, 16
%10 = icmp sgt i32 %9, 9
%11 = trunc i32 %9 to i8
%12 = select i1 %10, i8 55, i8 48
%13 = add nsw i8 %12, %11
%14 = getelementptr inbounds [200 x i8], [200 x i8]* %2, i64 0, i64 %7
store i8 %13, i8* %14
%15 = sdiv i32 %8, 16
%16 = add nuw i64 %7, 1
%17 = add i32 %8, 15
%18 = icmp ult i32 %17, 31
br i1 %18, label %19, label %6
19: ; preds = %6
%20 = and i64 %16, 4294967295
br label %21
21: ; preds = %19, %1
%22 = phi i64 [ 0, %1 ], [ %20, %19 ]
%23 = getelementptr inbounds [200 x i8], [200 x i8]* %2, i64 0, i64 %22
store i8 0, i8* %23
%24 = getelementptr inbounds [200 x i8], [200 x i8]* %3, i64 0, i64 0
%25 = call i32 @strlen(i8* %4)
%26 = icmp eq i32 %25, 0
br i1 %26, label %93, label %27
27: ; preds = %21
%28 = sext i32 %25 to i64
%29 = zext i32 %25 to i64
%30 = icmp ult i32 %25, 8
br i1 %30, label %79, label %31
31: ; preds = %27
%32 = icmp ult i32 %25, 32
br i1 %32, label %60, label %33
33: ; preds = %31
%34 = and i64 %29, 4294967264
br label %35
35: ; preds = %35, %33
%36 = phi i64 [ 0, %33 ], [ %52, %35 ]
%37 = xor i64 %36, -1
%38 = add i64 %37, %28
%39 = getelementptr inbounds [200 x i8], [200 x i8]* %2, i64 0, i64 %38
%40 = getelementptr inbounds i8, i8* %39, i64 -15
%41 = bitcast i8* %40 to <16 x i8>*
%42 = load <16 x i8>, <16 x i8>* %41
%43 = shufflevector <16 x i8> %42, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%44 = getelementptr inbounds i8, i8* %39, i64 -31
%45 = bitcast i8* %44 to <16 x i8>*
%46 = load <16 x i8>, <16 x i8>* %45
%47 = shufflevector <16 x i8> %46, <16 x i8> poison, <16 x i32> <i32 15, i32 14, i32 13, i32 12, i32 11, i32 10, i32 9, i32 8, i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%48 = getelementptr inbounds [200 x i8], [200 x i8]* %3, i64 0, i64 %36
%49 = bitcast i8* %48 to <16 x i8>*
store <16 x i8> %43, <16 x i8>* %49
%50 = getelementptr inbounds i8, i8* %48, i64 16
%51 = bitcast i8* %50 to <16 x i8>*
store <16 x i8> %47, <16 x i8>* %51
%52 = add nuw i64 %36, 32
%53 = icmp eq i64 %52, %34
br i1 %53, label %54, label %35
54: ; preds = %35
%55 = icmp eq i64 %34, %29
br i1 %55, label %91, label %56
56: ; preds = %54
%57 = sub nsw i64 %28, %34
%58 = and i64 %29, 24
%59 = icmp eq i64 %58, 0
br i1 %59, label %79, label %60
60: ; preds = %31, %56
%61 = phi i64 [ %34, %56 ], [ 0, %31 ]
%62 = and i64 %29, 4294967288
%63 = sub nsw i64 %28, %62
br label %64
64: ; preds = %64, %60
%65 = phi i64 [ %61, %60 ], [ %75, %64 ]
%66 = xor i64 %65, -1
%67 = add i64 %66, %28
%68 = getelementptr inbounds [200 x i8], [200 x i8]* %2, i64 0, i64 %67
%69 = getelementptr inbounds i8, i8* %68, i64 -7
%70 = bitcast i8* %69 to <8 x i8>*
%71 = load <8 x i8>, <8 x i8>* %70
%72 = shufflevector <8 x i8> %71, <8 x i8> poison, <8 x i32> <i32 7, i32 6, i32 5, i32 4, i32 3, i32 2, i32 1, i32 0>
%73 = getelementptr inbounds [200 x i8], [200 x i8]* %3, i64 0, i64 %65
%74 = bitcast i8* %73 to <8 x i8>*
store <8 x i8> %72, <8 x i8>* %74
%75 = add nuw i64 %65, 8
%76 = icmp eq i64 %75, %62
br i1 %76, label %77, label %64
77: ; preds = %64
%78 = icmp eq i64 %62, %29
br i1 %78, label %91, label %79
79: ; preds = %27, %56, %77
%80 = phi i64 [ 0, %27 ], [ %34, %56 ], [ %62, %77 ]
%81 = phi i64 [ %28, %27 ], [ %57, %56 ], [ %63, %77 ]
br label %82
82: ; preds = %79, %82
%83 = phi i64 [ %89, %82 ], [ %80, %79 ]
%84 = phi i64 [ %85, %82 ], [ %81, %79 ]
%85 = add nsw i64 %84, -1
%86 = getelementptr inbounds [200 x i8], [200 x i8]* %2, i64 0, i64 %85
%87 = load i8, i8* %86
%88 = getelementptr inbounds [200 x i8], [200 x i8]* %3, i64 0, i64 %83
store i8 %87, i8* %88
%89 = add nuw nsw i64 %83, 1
%90 = icmp eq i64 %89, %29
br i1 %90, label %91, label %82
91: ; preds = %82, %77, %54
%92 = zext i32 %25 to i64
br label %93
93: ; preds = %21, %91
%94 = phi i64 [ %92, %91 ], [ 0, %21 ]
%95 = getelementptr inbounds [200 x i8], [200 x i8]* %3, i64 0, i64 %94
store i8 0, i8* %95
%96 = call i64 @strcmp(i8* %4, i8* %24)
%97 = icmp eq i64 %96, 0
br i1 %97, label %98, label %100
98: ; preds = %93
%99 = call i32 @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i8* %24)
br label %100
100: ; preds = %93, %98
%101 = phi i32 [ 0, %98 ], [ 1, %93 ]
ret i32 %101
}