#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 */
typedef int uint8_t;
typedef scalar_t__ socklen_t;

/* Variables and functions */
int /*<<< orphan*/ ENOSPC;
scalar_t__ INET_ADDRSTRLEN;
int /*<<< orphan*/ errno;
const char *inet_ntop4(const void *src, char *dst, socklen_t size) {
  const uint8_t *ip = src;
  char *p;
  size_t i;
  unsigned int n;
  if (size < INET_ADDRSTRLEN) {
    errno = ENOSPC;
    return NULL;
  }
  for (p = dst, i = 0; i < 4; ++i) {
    if (i > 0)
      *p++ = '.';
    n = ip[i];
    if (n >= 100) {
      *p++ = n / 100 + '0';
      n %= 100;
    }
    if (n >= 10 || ip[i] >= 100) {
      *p++ = n / 10 + '0';
      n %= 10;
    }
    *p++ = n + '0';
  }
  *p = 0;
  return dst;
}


x86 assembly (clang, -O0):
<inet_ntop4>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
mov    0x2eb5(%rip),%rcx
cmp    (%rcx),%rax
jge    114b <inet_ntop4+0x4b>
mov    0x2e9d(%rip),%rax
mov    (%rax),%ecx
mov    0x2ea4(%rip),%rax
mov    %ecx,(%rax)
movq   $0x0,-0x8(%rbp)
jmp    1252 <inet_ntop4+0x152>
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
movq   $0x0,-0x38(%rbp)
cmpq   $0x4,-0x38(%rbp)
jae    1243 <inet_ntop4+0x143>
cmpq   $0x0,-0x38(%rbp)
jbe    1183 <inet_ntop4+0x83>
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x30(%rbp)
movb   $0x2e,(%rax)
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0x64,-0x3c(%rbp)
jb     11cc <inet_ntop4+0xcc>
mov    -0x3c(%rbp),%eax
mov    $0x64,%ecx
xor    %edx,%edx
div    %ecx
add    $0x30,%eax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
mov    -0x3c(%rbp),%eax
mov    $0x64,%ecx
xor    %edx,%edx
div    %ecx
mov    %edx,-0x3c(%rbp)
cmpl   $0xa,-0x3c(%rbp)
jae    11e8 <inet_ntop4+0xe8>
mov    -0x28(%rbp),%rax
mov    -0x38(%rbp),%rcx
cmpl   $0x64,(%rax,%rcx,4)
jl     1219 <inet_ntop4+0x119>
mov    -0x3c(%rbp),%eax
mov    $0xa,%ecx
xor    %edx,%edx
div    %ecx
add    $0x30,%eax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
mov    -0x3c(%rbp),%eax
mov    $0xa,%ecx
xor    %edx,%edx
div    %ecx
mov    %edx,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
add    $0x30,%eax
mov    %al,%cl
mov    -0x30(%rbp),%rax
mov    %rax,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    %cl,(%rax)
mov    -0x38(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
jmp    115b <inet_ntop4+0x5b>
mov    -0x30(%rbp),%rax
movb   $0x0,(%rax)
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<inet_ntop4>:
mov    0x2ed1(%rip),%rcx
cmp    %rdx,(%rcx)
jle    1121 <inet_ntop4+0x21>
mov    0x2ebd(%rip),%rax
mov    (%rax),%eax
mov    0x2ec4(%rip),%rcx
mov    %eax,(%rcx)
xor    %eax,%eax
ret
mov    %rsi,%rax
mov    (%rdi),%edx
cmp    $0x64,%edx
jb     114f <inet_ntop4+0x4f>
mov    %edx,%ecx
imul   $0x51eb851f,%rcx,%rsi
shr    $0x25,%rsi
lea    0x30(%rsi),%r8d
lea    0x1(%rax),%rcx
mov    %r8b,(%rax)
imul   $0x64,%esi,%esi
sub    %esi,%edx
cmp    $0x9,%edx
jbe    1157 <inet_ntop4+0x57>
jmp    115c <inet_ntop4+0x5c>
mov    %rax,%rcx
cmp    $0x9,%edx
ja     115c <inet_ntop4+0x5c>
cmpl   $0x64,(%rdi)
jl     117f <inet_ntop4+0x7f>
movzbl %dl,%r8d
imul   $0xcd,%r8d,%esi
shr    $0xb,%esi
lea    0x30(%rsi),%edx
mov    %dl,(%rcx)
add    $0x1,%rcx
add    %esi,%esi
lea    (%rsi,%rsi,4),%edx
sub    %dl,%r8b
movzbl %r8b,%edx
add    $0x30,%dl
mov    %dl,(%rcx)
movb   $0x2e,0x1(%rcx)
mov    0x4(%rdi),%edx
cmp    $0x64,%edx
jb     11b6 <inet_ntop4+0xb6>
mov    %edx,%esi
imul   $0x51eb851f,%rsi,%r8
shr    $0x25,%r8
lea    0x30(%r8),%esi
mov    %sil,0x2(%rcx)
add    $0x3,%rcx
imul   $0x64,%r8d,%esi
sub    %esi,%edx
cmp    $0x9,%edx
jbe    11bf <inet_ntop4+0xbf>
jmp    11c5 <inet_ntop4+0xc5>
add    $0x2,%rcx
cmp    $0x9,%edx
ja     11c5 <inet_ntop4+0xc5>
cmpl   $0x64,0x4(%rdi)
jl     11e8 <inet_ntop4+0xe8>
movzbl %dl,%r8d
imul   $0xcd,%r8d,%esi
shr    $0xb,%esi
lea    0x30(%rsi),%edx
mov    %dl,(%rcx)
add    $0x1,%rcx
add    %esi,%esi
lea    (%rsi,%rsi,4),%edx
sub    %dl,%r8b
movzbl %r8b,%edx
add    $0x30,%dl
mov    %dl,(%rcx)
movb   $0x2e,0x1(%rcx)
mov    0x8(%rdi),%edx
cmp    $0x64,%edx
jb     121f <inet_ntop4+0x11f>
mov    %edx,%esi
imul   $0x51eb851f,%rsi,%r8
shr    $0x25,%r8
lea    0x30(%r8),%esi
mov    %sil,0x2(%rcx)
add    $0x3,%rcx
imul   $0x64,%r8d,%esi
sub    %esi,%edx
cmp    $0x9,%edx
jbe    1228 <inet_ntop4+0x128>
jmp    122e <inet_ntop4+0x12e>
add    $0x2,%rcx
cmp    $0x9,%edx
ja     122e <inet_ntop4+0x12e>
cmpl   $0x64,0x8(%rdi)
jl     1251 <inet_ntop4+0x151>
movzbl %dl,%r8d
imul   $0xcd,%r8d,%esi
shr    $0xb,%esi
lea    0x30(%rsi),%edx
mov    %dl,(%rcx)
add    $0x1,%rcx
add    %esi,%esi
lea    (%rsi,%rsi,4),%edx
sub    %dl,%r8b
movzbl %r8b,%edx
add    $0x30,%dl
mov    %dl,(%rcx)
movb   $0x2e,0x1(%rcx)
mov    0xc(%rdi),%edx
cmp    $0x64,%edx
jb     1288 <inet_ntop4+0x188>
mov    %edx,%esi
imul   $0x51eb851f,%rsi,%r8
shr    $0x25,%r8
lea    0x30(%r8),%esi
mov    %sil,0x2(%rcx)
add    $0x3,%rcx
imul   $0x64,%r8d,%esi
sub    %esi,%edx
cmp    $0x9,%edx
jbe    1291 <inet_ntop4+0x191>
jmp    1297 <inet_ntop4+0x197>
add    $0x2,%rcx
cmp    $0x9,%edx
ja     1297 <inet_ntop4+0x197>
cmpl   $0x64,0xc(%rdi)
jl     12b8 <inet_ntop4+0x1b8>
movzbl %dl,%edx
imul   $0xcd,%edx,%esi
shr    $0xb,%esi
lea    0x30(%rsi),%edi
mov    %dil,(%rcx)
add    $0x1,%rcx
add    %esi,%esi
lea    (%rsi,%rsi,4),%esi
sub    %sil,%dl
movzbl %dl,%edx
add    $0x30,%dl
mov    %dl,(%rcx)
movb   $0x0,0x1(%rcx)
ret

LLVM IR (-O0):
@INET_ADDRSTRLEN = global i64 0
@ENOSPC = global i32 0
@errno = global i32 0
define i8* @inet_ntop4(i8* %0, i8* %1, i64 %2) {
%4 = alloca i8*
%5 = alloca i8*
%6 = alloca i8*
%7 = alloca i64
%8 = alloca i32*
%9 = alloca i8*
%10 = alloca i64
%11 = alloca i32
store i8* %0, i8** %5
store i8* %1, i8** %6
store i64 %2, i64* %7
%12 = load i8*, i8** %5
%13 = bitcast i8* %12 to i32*
store i32* %13, i32** %8
%14 = load i64, i64* %7
%15 = load i64, i64* @INET_ADDRSTRLEN
%16 = icmp slt i64 %14, %15
br i1 %16, label %17, label %19
17: ; preds = %3
%18 = load i32, i32* @ENOSPC
store i32 %18, i32* @errno
store i8* null, i8** %4
br label %76
19: ; preds = %3
%20 = load i8*, i8** %6
store i8* %20, i8** %9
store i64 0, i64* %10
br label %21
21: ; preds = %70, %19
%22 = load i64, i64* %10
%23 = icmp ult i64 %22, 4
br i1 %23, label %24, label %73
24: ; preds = %21
%25 = load i64, i64* %10
%26 = icmp ugt i64 %25, 0
br i1 %26, label %27, label %30
27: ; preds = %24
%28 = load i8*, i8** %9
%29 = getelementptr inbounds i8, i8* %28, i32 1
store i8* %29, i8** %9
store i8 46, i8* %28
br label %30
30: ; preds = %27, %24
%31 = load i32*, i32** %8
%32 = load i64, i64* %10
%33 = getelementptr inbounds i32, i32* %31, i64 %32
%34 = load i32, i32* %33
store i32 %34, i32* %11
%35 = load i32, i32* %11
%36 = icmp uge i32 %35, 100
br i1 %36, label %37, label %46
37: ; preds = %30
%38 = load i32, i32* %11
%39 = udiv i32 %38, 100
%40 = add i32 %39, 48
%41 = trunc i32 %40 to i8
%42 = load i8*, i8** %9
%43 = getelementptr inbounds i8, i8* %42, i32 1
store i8* %43, i8** %9
store i8 %41, i8* %42
%44 = load i32, i32* %11
%45 = urem i32 %44, 100
store i32 %45, i32* %11
br label %46
46: ; preds = %37, %30
%47 = load i32, i32* %11
%48 = icmp uge i32 %47, 10
br i1 %48, label %55, label %49
49: ; preds = %46
%50 = load i32*, i32** %8
%51 = load i64, i64* %10
%52 = getelementptr inbounds i32, i32* %50, i64 %51
%53 = load i32, i32* %52
%54 = icmp sge i32 %53, 100
br i1 %54, label %55, label %64
55: ; preds = %49, %46
%56 = load i32, i32* %11
%57 = udiv i32 %56, 10
%58 = add i32 %57, 48
%59 = trunc i32 %58 to i8
%60 = load i8*, i8** %9
%61 = getelementptr inbounds i8, i8* %60, i32 1
store i8* %61, i8** %9
store i8 %59, i8* %60
%62 = load i32, i32* %11
%63 = urem i32 %62, 10
store i32 %63, i32* %11
br label %64
64: ; preds = %55, %49
%65 = load i32, i32* %11
%66 = add i32 %65, 48
%67 = trunc i32 %66 to i8
%68 = load i8*, i8** %9
%69 = getelementptr inbounds i8, i8* %68, i32 1
store i8* %69, i8** %9
store i8 %67, i8* %68
br label %70
70: ; preds = %64
%71 = load i64, i64* %10
%72 = add i64 %71, 1
store i64 %72, i64* %10
br label %21
73: ; preds = %21
%74 = load i8*, i8** %9
store i8 0, i8* %74
%75 = load i8*, i8** %6
store i8* %75, i8** %4
br label %76
76: ; preds = %73, %17
%77 = load i8*, i8** %4
ret i8* %77
}

LLVM IR (-O2):
@INET_ADDRSTRLEN = global i64 0
@ENOSPC = global i32 0
@errno = global i32 0
define i8* @inet_ntop4(i8* nocapture %0, i8* writeonly %1, i64 %2) {
%4 = bitcast i8* %0 to i32*
%5 = load i64, i64* @INET_ADDRSTRLEN
%6 = icmp sgt i64 %5, %2
br i1 %6, label %7, label %9
7: ; preds = %3
%8 = load i32, i32* @ENOSPC
store i32 %8, i32* @errno
br label %131
9: ; preds = %3
%10 = load i32, i32* %4
%11 = icmp ugt i32 %10, 99
br i1 %11, label %12, label %18
12: ; preds = %9
%13 = udiv i32 %10, 100
%14 = trunc i32 %13 to i8
%15 = add i8 %14, 48
%16 = getelementptr inbounds i8, i8* %1, i64 1
store i8 %15, i8* %1
%17 = urem i32 %10, 100
br label %18
18: ; preds = %12, %9
%19 = phi i8* [ %16, %12 ], [ %1, %9 ]
%20 = phi i32 [ %17, %12 ], [ %10, %9 ]
%21 = icmp ugt i32 %20, 9
br i1 %21, label %25, label %22
22: ; preds = %18
%23 = load i32, i32* %4
%24 = icmp sgt i32 %23, 99
br i1 %24, label %25, label %32
25: ; preds = %22, %18
%26 = trunc i32 %20 to i8
%27 = udiv i8 %26, 10
%28 = add nuw nsw i8 %27, 48
%29 = getelementptr inbounds i8, i8* %19, i64 1
store i8 %28, i8* %19
%30 = urem i8 %26, 10
%31 = zext i8 %30 to i32
br label %32
32: ; preds = %25, %22
%33 = phi i8* [ %29, %25 ], [ %19, %22 ]
%34 = phi i32 [ %31, %25 ], [ %20, %22 ]
%35 = trunc i32 %34 to i8
%36 = add nuw nsw i8 %35, 48
store i8 %36, i8* %33
%37 = getelementptr inbounds i8, i8* %33, i64 1
%38 = getelementptr inbounds i8, i8* %33, i64 2
store i8 46, i8* %37
%39 = getelementptr inbounds i8, i8* %0, i64 4
%40 = bitcast i8* %39 to i32*
%41 = load i32, i32* %40
%42 = icmp ugt i32 %41, 99
br i1 %42, label %43, label %49
43: ; preds = %32
%44 = udiv i32 %41, 100
%45 = trunc i32 %44 to i8
%46 = add i8 %45, 48
%47 = getelementptr inbounds i8, i8* %33, i64 3
store i8 %46, i8* %38
%48 = urem i32 %41, 100
br label %49
49: ; preds = %43, %32
%50 = phi i8* [ %47, %43 ], [ %38, %32 ]
%51 = phi i32 [ %48, %43 ], [ %41, %32 ]
%52 = icmp ugt i32 %51, 9
br i1 %52, label %56, label %53
53: ; preds = %49
%54 = load i32, i32* %40
%55 = icmp sgt i32 %54, 99
br i1 %55, label %56, label %63
56: ; preds = %53, %49
%57 = trunc i32 %51 to i8
%58 = udiv i8 %57, 10
%59 = add nuw nsw i8 %58, 48
%60 = getelementptr inbounds i8, i8* %50, i64 1
store i8 %59, i8* %50
%61 = urem i8 %57, 10
%62 = zext i8 %61 to i32
br label %63
63: ; preds = %56, %53
%64 = phi i8* [ %60, %56 ], [ %50, %53 ]
%65 = phi i32 [ %62, %56 ], [ %51, %53 ]
%66 = trunc i32 %65 to i8
%67 = add nuw nsw i8 %66, 48
store i8 %67, i8* %64
%68 = getelementptr inbounds i8, i8* %64, i64 1
%69 = getelementptr inbounds i8, i8* %64, i64 2
store i8 46, i8* %68
%70 = getelementptr inbounds i8, i8* %0, i64 8
%71 = bitcast i8* %70 to i32*
%72 = load i32, i32* %71
%73 = icmp ugt i32 %72, 99
br i1 %73, label %74, label %80
74: ; preds = %63
%75 = udiv i32 %72, 100
%76 = trunc i32 %75 to i8
%77 = add i8 %76, 48
%78 = getelementptr inbounds i8, i8* %64, i64 3
store i8 %77, i8* %69
%79 = urem i32 %72, 100
br label %80
80: ; preds = %74, %63
%81 = phi i8* [ %78, %74 ], [ %69, %63 ]
%82 = phi i32 [ %79, %74 ], [ %72, %63 ]
%83 = icmp ugt i32 %82, 9
br i1 %83, label %87, label %84
84: ; preds = %80
%85 = load i32, i32* %71
%86 = icmp sgt i32 %85, 99
br i1 %86, label %87, label %94
87: ; preds = %84, %80
%88 = trunc i32 %82 to i8
%89 = udiv i8 %88, 10
%90 = add nuw nsw i8 %89, 48
%91 = getelementptr inbounds i8, i8* %81, i64 1
store i8 %90, i8* %81
%92 = urem i8 %88, 10
%93 = zext i8 %92 to i32
br label %94
94: ; preds = %87, %84
%95 = phi i8* [ %91, %87 ], [ %81, %84 ]
%96 = phi i32 [ %93, %87 ], [ %82, %84 ]
%97 = trunc i32 %96 to i8
%98 = add nuw nsw i8 %97, 48
store i8 %98, i8* %95
%99 = getelementptr inbounds i8, i8* %95, i64 1
%100 = getelementptr inbounds i8, i8* %95, i64 2
store i8 46, i8* %99
%101 = getelementptr inbounds i8, i8* %0, i64 12
%102 = bitcast i8* %101 to i32*
%103 = load i32, i32* %102
%104 = icmp ugt i32 %103, 99
br i1 %104, label %105, label %111
105: ; preds = %94
%106 = udiv i32 %103, 100
%107 = trunc i32 %106 to i8
%108 = add i8 %107, 48
%109 = getelementptr inbounds i8, i8* %95, i64 3
store i8 %108, i8* %100
%110 = urem i32 %103, 100
br label %111
111: ; preds = %105, %94
%112 = phi i8* [ %109, %105 ], [ %100, %94 ]
%113 = phi i32 [ %110, %105 ], [ %103, %94 ]
%114 = icmp ugt i32 %113, 9
br i1 %114, label %118, label %115
115: ; preds = %111
%116 = load i32, i32* %102
%117 = icmp sgt i32 %116, 99
br i1 %117, label %118, label %125
118: ; preds = %115, %111
%119 = trunc i32 %113 to i8
%120 = udiv i8 %119, 10
%121 = add nuw nsw i8 %120, 48
%122 = getelementptr inbounds i8, i8* %112, i64 1
store i8 %121, i8* %112
%123 = urem i8 %119, 10
%124 = zext i8 %123 to i32
br label %125
125: ; preds = %118, %115
%126 = phi i8* [ %122, %118 ], [ %112, %115 ]
%127 = phi i32 [ %124, %118 ], [ %113, %115 ]
%128 = trunc i32 %127 to i8
%129 = add nuw nsw i8 %128, 48
%130 = getelementptr inbounds i8, i8* %126, i64 1
store i8 %129, i8* %126
store i8 0, i8* %130
br label %131
131: ; preds = %125, %7
%132 = phi i8* [ null, %7 ], [ %1, %125 ]
ret i8* %132
}