#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*/ sprintf(char *, char *, int);
int strlen(char *);
int pali(int k) {
  int a, i, j, n;
  char mas[100], c1, c2;
  sprintf(mas, "%X", k);
  a = 1;
  n = strlen(mas);
  i = n / 2;
  for (j = 0; j < i; j++) {
    c1 = mas[j];
    c2 = mas[n - j - 1];
    if (c1 != c2) {
      a = 0;
    }
  }
  return a;
}


x86 assembly (clang, -O0):
<pali>:
push   %rbp
mov    %rsp,%rbp
sub    $0x90,%rsp
mov    %edi,-0x4(%rbp)
lea    -0x80(%rbp),%rdi
mov    -0x4(%rbp),%edx
lea    0xec4(%rip),%rsi
call   1040 <sprintf@plt>
movl   $0x1,-0x8(%rbp)
lea    -0x80(%rbp),%rdi
call   1030 <strlen@plt>
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0xc(%rbp)
movl   $0x0,-0x10(%rbp)
mov    -0x10(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11c8 <pali+0xa8>
movslq -0x10(%rbp),%rax
mov    -0x80(%rbp,%rax,1),%al
mov    %al,-0x81(%rbp)
mov    -0x14(%rbp),%eax
sub    -0x10(%rbp),%eax
sub    $0x1,%eax
cltq
mov    -0x80(%rbp,%rax,1),%al
mov    %al,-0x82(%rbp)
movsbl -0x81(%rbp),%eax
movsbl -0x82(%rbp),%ecx
cmp    %ecx,%eax
je     11b5 <pali+0x95>
movl   $0x0,-0x8(%rbp)
jmp    11ba <pali+0x9a>
mov    -0x10(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x10(%rbp)
jmp    1169 <pali+0x49>
mov    -0x8(%rbp),%eax
add    $0x90,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<pali>:
push   %rbx
sub    $0x70,%rsp
mov    %edi,%edx
lea    0xee2(%rip),%rsi
mov    %rsp,%rbx
mov    %rbx,%rdi
call   1040 <sprintf@plt>
mov    %rbx,%rdi
call   1030 <strlen@plt>
mov    $0x1,%ecx
cmp    $0x2,%eax
jl     12a9 <pali+0x189>
mov    %eax,%r10d
shr    %r10d
mov    $0x1,%ecx
cmp    $0x10,%eax
jae    1166 <pali+0x46>
xor    %esi,%esi
jmp    1246 <pali+0x126>
lea    -0x1(%r10),%r8
lea    -0x1(%rax),%edi
mov    %edi,%ebx
sub    %r8d,%ebx
xor    %esi,%esi
cmp    %edi,%ebx
jg     1246 <pali+0x126>
shr    $0x20,%r8
jne    1246 <pali+0x126>
mov    %r10d,%esi
and    $0xfffffff8,%esi
movdqa 0xe6c(%rip),%xmm0
xor    %ecx,%ecx
movdqa %xmm0,%xmm1
nopw   0x0(%rax,%rax,1)
movq   (%rsp,%rcx,1),%xmm2
punpcklbw %xmm2,%xmm2
punpcklwd %xmm2,%xmm2
movd   0x4(%rsp,%rcx,1),%xmm3
punpcklbw %xmm3,%xmm3
punpcklwd %xmm3,%xmm3
movslq %edi,%rdi
movd   -0x3(%rsp,%rdi,1),%xmm4
punpcklbw %xmm4,%xmm4
movd   -0x7(%rsp,%rdi,1),%xmm5
punpcklbw %xmm5,%xmm5
pshufd $0xc4,%xmm4,%xmm4
pshuflw $0xac,%xmm4,%xmm4
pshufhw $0x24,%xmm4,%xmm4
pcmpeqb %xmm2,%xmm4
psrad  $0x18,%xmm4
pand   %xmm4,%xmm0
pshufd $0xc4,%xmm5,%xmm2
pshuflw $0xac,%xmm2,%xmm2
pshufhw $0x24,%xmm2,%xmm2
pcmpeqb %xmm3,%xmm2
psrad  $0x18,%xmm2
pand   %xmm2,%xmm1
add    $0x8,%rcx
add    $0xfffffff8,%edi
cmp    %rcx,%rsi
jne    11a0 <pali+0x80>
movdqa 0xde2(%rip),%xmm2
movdqa %xmm0,%xmm3
pcmpeqd %xmm2,%xmm3
pand   %xmm3,%xmm1
pandn  %xmm0,%xmm3
por    %xmm1,%xmm3
pcmpeqd %xmm2,%xmm3
movmskps %xmm3,%edi
xor    %ecx,%ecx
cmp    $0xf,%edi
sete   %cl
cmp    %r10,%rsi
je     12a9 <pali+0x189>
mov    %rsi,%rdi
not    %rdi
test   $0x1,%r10b
je     126e <pali+0x14e>
mov    (%rsp,%rsi,1),%r8b
mov    %esi,%ebx
not    %ebx
add    %eax,%ebx
movslq %ebx,%rbx
xor    %r9d,%r9d
cmp    (%rsp,%rbx,1),%r8b
cmovne %r9d,%ecx
or     $0x1,%rsi
add    %r10,%rdi
je     12a9 <pali+0x189>
mov    %esi,%edi
not    %edi
add    %eax,%edi
xor    %r8d,%r8d
nopl   0x0(%rax)
movslq %edi,%rdi
movzbl (%rsp,%rsi,1),%ebx
movzbl 0x1(%rsp,%rsi,1),%edx
xor    (%rsp,%rdi,1),%bl
lea    -0x1(%rdi),%eax
cltq
xor    (%rsp,%rax,1),%dl
or     %bl,%dl
cmovne %r8d,%ecx
add    $0x2,%rsi
add    $0xfffffffe,%edi
cmp    %rsi,%r10
jne    1280 <pali+0x160>
mov    %ecx,%eax
add    $0x70,%rsp
pop    %rbx
ret

LLVM IR (-O0):
@.str = [3 x i8] c"%X\00"
define i32 @pali(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca [100 x i8]
%8 = alloca i8
%9 = alloca i8
store i32 %0, i32* %2
%10 = getelementptr inbounds [100 x i8], [100 x i8]* %7, i64 0, i64 0
%11 = load i32, i32* %2
%12 = call i32 @sprintf(i8* %10, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str, i64 0, i64 0), i32 %11)
store i32 1, i32* %3
%13 = getelementptr inbounds [100 x i8], [100 x i8]* %7, i64 0, i64 0
%14 = call i32 @strlen(i8* %13)
store i32 %14, i32* %6
%15 = load i32, i32* %6
%16 = sdiv i32 %15, 2
store i32 %16, i32* %4
store i32 0, i32* %5
br label %17
17: ; preds = %40, %1
%18 = load i32, i32* %5
%19 = load i32, i32* %4
%20 = icmp slt i32 %18, %19
br i1 %20, label %21, label %43
21: ; preds = %17
%22 = load i32, i32* %5
%23 = sext i32 %22 to i64
%24 = getelementptr inbounds [100 x i8], [100 x i8]* %7, i64 0, i64 %23
%25 = load i8, i8* %24
store i8 %25, i8* %8
%26 = load i32, i32* %6
%27 = load i32, i32* %5
%28 = sub nsw i32 %26, %27
%29 = sub nsw i32 %28, 1
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds [100 x i8], [100 x i8]* %7, i64 0, i64 %30
%32 = load i8, i8* %31
store i8 %32, i8* %9
%33 = load i8, i8* %8
%34 = sext i8 %33 to i32
%35 = load i8, i8* %9
%36 = sext i8 %35 to i32
%37 = icmp ne i32 %34, %36
br i1 %37, label %38, label %39
38: ; preds = %21
store i32 0, i32* %3
br label %39
39: ; preds = %38, %21
br label %40
40: ; preds = %39
%41 = load i32, i32* %5
%42 = add nsw i32 %41, 1
store i32 %42, i32* %5
br label %17
43: ; preds = %17
%44 = load i32, i32* %3
ret i32 %44
}

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