#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 */
short txtLenN(short);
int /*<<< orphan*/ txtPrintS(short, short, char *, short);
void txtPrintN(short x, short y, short n) {
  char str[6];
  short nStart = 0;
  short nCur, len;
  len = txtLenN(n);
  nCur = len - 1;
  if (n < 0) {
    *str = '-';
    nStart++;
    n = -n;
  }
  while (nCur >= nStart) {
    *(str + nCur--) = '0' + (n % 10);
    n /= 10;
  }
  txtPrintS(x, y, str, len);
}


x86 assembly (clang, -O0):
<txtPrintN>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %dx,%ax
mov    %si,%cx
mov    %di,%dx
mov    %dx,-0x2(%rbp)
mov    %cx,-0x4(%rbp)
mov    %ax,-0x6(%rbp)
movw   $0x0,-0xe(%rbp)
movswl -0x6(%rbp),%edi
call   1030 <txtLenN@plt>
mov    %ax,-0x12(%rbp)
movswl -0x12(%rbp),%eax
sub    $0x1,%eax
mov    %ax,-0x10(%rbp)
movswl -0x6(%rbp),%eax
cmp    $0x0,%eax
jge    1184 <txtPrintN+0x64>
movb   $0x2d,-0xc(%rbp)
mov    -0xe(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0xe(%rbp)
movswl -0x6(%rbp),%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %ax,-0x6(%rbp)
jmp    1189 <txtPrintN+0x69>
movswl -0x10(%rbp),%eax
movswl -0xe(%rbp),%ecx
cmp    %ecx,%eax
jl     11d5 <txtPrintN+0xb5>
movswl -0x6(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
add    $0x30,%edx
mov    %dl,%cl
mov    -0x10(%rbp),%ax
mov    %ax,%dx
add    $0xffff,%dx
mov    %dx,-0x10(%rbp)
cwtl
cltq
mov    %cl,-0xc(%rbp,%rax,1)
movswl -0x6(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %ax,-0x6(%rbp)
jmp    1189 <txtPrintN+0x69>
mov    -0x2(%rbp),%cx
mov    -0x4(%rbp),%ax
lea    -0xc(%rbp),%rdx
movswl %cx,%edi
movswl %ax,%esi
movswl -0x12(%rbp),%ecx
call   1040 <txtPrintS@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<txtPrintN>:
push   %rbp
push   %r15
push   %r14
push   %rbx
push   %rax
mov    %edx,%ebx
mov    %esi,%r14d
mov    %edi,%r15d
mov    %edx,%edi
call   1030 <txtLenN@plt>
xor    %ecx,%ecx
test   %bx,%bx
jns    1149 <txtPrintN+0x29>
movb   $0x2d,0x2(%rsp)
neg    %ebx
mov    $0x1,%ecx
lea    -0x1(%rax),%edx
movswl %dx,%edx
cmp    %edx,%ecx
jg     1196 <txtPrintN+0x76>
lea    -0x2(%rax),%edx
cs nopw 0x0(%rax,%rax,1)
lea    0x1(%rdx),%esi
movswl %bx,%edi
imul   $0x6667,%edi,%edi
mov    %edi,%ebp
shr    $0x1f,%ebp
sar    $0x12,%edi
add    %ebp,%edi
lea    (%rdi,%rdi,1),%ebp
lea    0x0(%rbp,%rbp,4),%ebp
sub    %ebp,%ebx
add    $0x30,%bl
movswq %si,%rsi
mov    %bl,0x2(%rsp,%rsi,1)
movswl %dx,%esi
add    $0xffffffff,%edx
mov    %edi,%ebx
cmp    %esi,%ecx
jle    1160 <txtPrintN+0x40>
movswl %r15w,%edi
movswl %r14w,%esi
movswl %ax,%ecx
lea    0x2(%rsp),%rdx
call   1040 <txtPrintS@plt>
add    $0x8,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @txtPrintN(i16 signext %0, i16 signext %1, i16 signext %2) {
%4 = alloca i16
%5 = alloca i16
%6 = alloca i16
%7 = alloca [6 x i8]
%8 = alloca i16
%9 = alloca i16
%10 = alloca i16
store i16 %0, i16* %4
store i16 %1, i16* %5
store i16 %2, i16* %6
store i16 0, i16* %8
%11 = load i16, i16* %6
%12 = call signext i16 @txtLenN(i16 signext %11)
store i16 %12, i16* %10
%13 = load i16, i16* %10
%14 = sext i16 %13 to i32
%15 = sub nsw i32 %14, 1
%16 = trunc i32 %15 to i16
store i16 %16, i16* %9
%17 = load i16, i16* %6
%18 = sext i16 %17 to i32
%19 = icmp slt i32 %18, 0
br i1 %19, label %20, label %28
20: ; preds = %3
%21 = getelementptr inbounds [6 x i8], [6 x i8]* %7, i64 0, i64 0
store i8 45, i8* %21
%22 = load i16, i16* %8
%23 = add i16 %22, 1
store i16 %23, i16* %8
%24 = load i16, i16* %6
%25 = sext i16 %24 to i32
%26 = sub nsw i32 0, %25
%27 = trunc i32 %26 to i16
store i16 %27, i16* %6
br label %28
28: ; preds = %20, %3
br label %29
29: ; preds = %35, %28
%30 = load i16, i16* %9
%31 = sext i16 %30 to i32
%32 = load i16, i16* %8
%33 = sext i16 %32 to i32
%34 = icmp sge i32 %31, %33
br i1 %34, label %35, label %51
35: ; preds = %29
%36 = load i16, i16* %6
%37 = sext i16 %36 to i32
%38 = srem i32 %37, 10
%39 = add nsw i32 48, %38
%40 = trunc i32 %39 to i8
%41 = getelementptr inbounds [6 x i8], [6 x i8]* %7, i64 0, i64 0
%42 = load i16, i16* %9
%43 = add i16 %42, -1
store i16 %43, i16* %9
%44 = sext i16 %42 to i32
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %41, i64 %45
store i8 %40, i8* %46
%47 = load i16, i16* %6
%48 = sext i16 %47 to i32
%49 = sdiv i32 %48, 10
%50 = trunc i32 %49 to i16
store i16 %50, i16* %6
br label %29
51: ; preds = %29
%52 = load i16, i16* %4
%53 = load i16, i16* %5
%54 = getelementptr inbounds [6 x i8], [6 x i8]* %7, i64 0, i64 0
%55 = load i16, i16* %10
%56 = call i32 @txtPrintS(i16 signext %52, i16 signext %53, i8* %54, i16 signext %55)
ret void
}

LLVM IR (-O2):
define void @txtPrintN(i16 signext %0, i16 signext %1, i16 signext %2) {
%4 = alloca [6 x i8]
%5 = getelementptr inbounds [6 x i8], [6 x i8]* %4, i64 0, i64 0
%6 = tail call signext i16 @txtLenN(i16 signext %2)
%7 = icmp slt i16 %2, 0
br i1 %7, label %8, label %10
8: ; preds = %3
store i8 45, i8* %5
%9 = sub i16 0, %2
br label %10
10: ; preds = %8, %3
%11 = phi i32 [ 1, %8 ], [ 0, %3 ]
%12 = phi i16 [ %9, %8 ], [ %2, %3 ]
%13 = add i16 %6, -1
%14 = sext i16 %13 to i32
%15 = icmp sgt i32 %11, %14
br i1 %15, label %28, label %16
16: ; preds = %10, %16
%17 = phi i16 [ %25, %16 ], [ %13, %10 ]
%18 = phi i16 [ %24, %16 ], [ %12, %10 ]
%19 = srem i16 %18, 10
%20 = trunc i16 %19 to i8
%21 = add nsw i8 %20, 48
%22 = sext i16 %17 to i64
%23 = getelementptr inbounds [6 x i8], [6 x i8]* %4, i64 0, i64 %22
store i8 %21, i8* %23
%24 = sdiv i16 %18, 10
%25 = add i16 %17, -1
%26 = sext i16 %25 to i32
%27 = icmp sgt i32 %11, %26
br i1 %27, label %28, label %16
28: ; preds = %16, %10
%29 = call i32 @txtPrintS(i16 signext %0, i16 signext %1, i8* %5, i16 signext %6)
ret void
}