#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 char wchar_t;

/* Variables and functions */
scalar_t__ isspace(char const);
scalar_t__ memchr(char const *, int /*<<< orphan*/, int);
int /*<<< orphan*/ tolower(int);
long long wcstoll(const wchar_t *str, wchar_t **endptr, int base) {
  int c, neg = 0;
  const wchar_t *alphabet = L"0123456789abcdefghijklmnopqrstuvwxyz";
  long long val = 0;
  if (base != 0 && (base < 2 || base > 36))
    return 0;
  while (*str && isspace(*str))
    str++;
  if (*str == '-') {
    neg = 1;
    str++;
  } else if (*str == '+') {
    str++;
  }
  if (base == 0 || base == 16) {
    if (str[0] == '0' && str[1] == 'x') {
      base = 16;
      str += 2;
    }
  }
  if (base == 0) {
    if (str[0] == '0')
      base = 8;
  }
  if (base == 0)
    base = 10;
  while ((c = *str)) {
    const wchar_t *idx = (const wchar_t *)memchr(alphabet, tolower(c), base);
    if (idx == 0)
      break;
    val = val * base + (idx - alphabet);
    str++;
  }
  if (endptr)
    *endptr = (wchar_t *)str;
  if (neg)
    return -val;
  else
    return val;
}


x86 assembly (clang, -O0):
<wcstoll>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movl   $0x0,-0x24(%rbp)
lea    0xeaf(%rip),%rax
mov    %rax,-0x30(%rbp)
movq   $0x0,-0x38(%rbp)
cmpl   $0x0,-0x1c(%rbp)
je     1188 <wcstoll+0x58>
cmpl   $0x2,-0x1c(%rbp)
jl     117b <wcstoll+0x4b>
cmpl   $0x24,-0x1c(%rbp)
jle    1188 <wcstoll+0x58>
movq   $0x0,-0x8(%rbp)
jmp    1356 <wcstoll+0x226>
jmp    118d <wcstoll+0x5d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x41(%rbp)
je     11b8 <wcstoll+0x88>
mov    -0x10(%rbp),%rax
movsbl (%rax),%edi
call   1030 <isspace@plt>
cmp    $0x0,%rax
setne  %al
mov    %al,-0x41(%rbp)
mov    -0x41(%rbp),%al
test   $0x1,%al
jne    11c8 <wcstoll+0x98>
jmp    11d9 <wcstoll+0xa9>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    118d <wcstoll+0x5d>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2d,%eax
jne    1201 <wcstoll+0xd1>
movl   $0x1,-0x24(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1222 <wcstoll+0xf2>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x2b,%eax
jne    121d <wcstoll+0xed>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    1222 <wcstoll+0xf2>
cmpl   $0x0,-0x1c(%rbp)
je     1236 <wcstoll+0x106>
cmpl   $0x10,-0x1c(%rbp)
jne    126f <wcstoll+0x13f>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    126a <wcstoll+0x13a>
mov    -0x10(%rbp),%rax
movsbl 0x1(%rax),%eax
cmp    $0x78,%eax
jne    126a <wcstoll+0x13a>
movl   $0x10,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
add    $0x2,%rax
mov    %rax,-0x10(%rbp)
jmp    126f <wcstoll+0x13f>
cmpl   $0x0,-0x1c(%rbp)
jne    1295 <wcstoll+0x165>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x30,%eax
jne    1290 <wcstoll+0x160>
movl   $0x8,-0x1c(%rbp)
jmp    1295 <wcstoll+0x165>
cmpl   $0x0,-0x1c(%rbp)
jne    12a6 <wcstoll+0x176>
movl   $0xa,-0x1c(%rbp)
jmp    12ab <wcstoll+0x17b>
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x20(%rbp)
cmp    $0x0,%eax
je     131f <wcstoll+0x1ef>
mov    -0x30(%rbp),%rax
mov    %rax,-0x50(%rbp)
mov    -0x20(%rbp),%edi
call   1050 <tolower@plt>
mov    -0x50(%rbp),%rdi
mov    %eax,%esi
mov    -0x1c(%rbp),%edx
call   1040 <memchr@plt>
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x40(%rbp)
jne    12f0 <wcstoll+0x1c0>
jmp    131f <wcstoll+0x1ef>
mov    -0x38(%rbp),%rax
movslq -0x1c(%rbp),%rcx
imul   %rcx,%rax
mov    -0x40(%rbp),%rcx
mov    -0x30(%rbp),%rdx
sub    %rdx,%rcx
add    %rcx,%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
jmp    12ab <wcstoll+0x17b>
cmpq   $0x0,-0x18(%rbp)
je     1335 <wcstoll+0x205>
mov    -0x10(%rbp),%rcx
mov    -0x18(%rbp),%rax
mov    %rcx,(%rax)
cmpl   $0x0,-0x24(%rbp)
je     134e <wcstoll+0x21e>
xor    %eax,%eax
sub    -0x38(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1356 <wcstoll+0x226>
mov    -0x38(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<wcstoll>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
push   %rax
mov    %edx,%r15d
mov    %rsi,%r14
mov    %rdi,%r13
test   %edx,%edx
je     1158 <wcstoll+0x28>
lea    -0x25(%r15),%eax
cmp    $0xffffffdd,%eax
jae    1158 <wcstoll+0x28>
xor    %eax,%eax
jmp    123e <wcstoll+0x10e>
mov    0x0(%r13),%al
mov    $0x1,%bl
test   %al,%al
je     11a0 <wcstoll+0x70>
add    $0x1,%r13
cs nopw 0x0(%rax,%rax,1)
movsbl %al,%edi
call   1030 <isspace@plt>
test   %rax,%rax
je     118c <wcstoll+0x5c>
movzbl 0x0(%r13),%eax
add    $0x1,%r13
test   %al,%al
jne    1170 <wcstoll+0x40>
jmp    119c <wcstoll+0x6c>
mov    -0x1(%r13),%al
cmp    $0x2b,%al
je     11a0 <wcstoll+0x70>
cmp    $0x2d,%al
jne    119c <wcstoll+0x6c>
xor    %ebx,%ebx
jmp    11a0 <wcstoll+0x70>
add    $0xffffffffffffffff,%r13
test   $0xffffffef,%r15d
mov    %ebx,0x4(%rsp)
jne    11e0 <wcstoll+0xb0>
cmpb   $0x30,0x0(%r13)
jne    11c7 <wcstoll+0x97>
cmpb   $0x78,0x1(%r13)
jne    11d1 <wcstoll+0xa1>
add    $0x2,%r13
mov    $0x10,%r15d
jmp    11e0 <wcstoll+0xb0>
test   %r15d,%r15d
mov    $0xa,%eax
jmp    11d9 <wcstoll+0xa9>
test   %r15d,%r15d
mov    $0x8,%eax
cmovne %r15d,%eax
mov    %eax,%r15d
movslq %r15d,%r15
xor    %ecx,%ecx
lea    0xe14(%rip),%r12
nopl   0x0(%rax)
mov    %rcx,%rbp
mov    %r13,%rbx
movsbl 0x0(%r13),%edi
test   %edi,%edi
je     1227 <wcstoll+0xf7>
call   1050 <tolower@plt>
mov    %r12,%rdi
mov    %eax,%esi
mov    %r15d,%edx
call   1040 <memchr@plt>
mov    %rbp,%rcx
imul   %r15,%rcx
sub    %r12,%rcx
add    %rax,%rcx
lea    0x1(%rbx),%r13
test   %rax,%rax
jne    11f0 <wcstoll+0xc0>
test   %r14,%r14
je     122f <wcstoll+0xff>
mov    %rbx,(%r14)
mov    %rbp,%rax
neg    %rax
cmpb   $0x0,0x4(%rsp)
cmovne %rbp,%rax
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
@.str = [37 x i32] [i32 48, i32 49, i32 50, i32 51, i32 52, i32 53, i32 54, i32 55, i32 56, i32 57, i32 97, i32 98, i32 99, i32 100, i32 101, i32 102, i32 103, i32 104, i32 105, i32 106, i32 107, i32 108, i32 109, i32 110, i32 111, i32 112, i32 113, i32 114, i32 115, i32 116, i32 117, i32 118, i32 119, i32 120, i32 121, i32 122, i32 0]
define i64 @wcstoll(i8* %0, i8** writeonly %1, i32 %2) {
%4 = icmp ne i32 %2, 0
%5 = add i32 %2, -37
%6 = icmp ult i32 %5, -35
%7 = and i1 %4, %6
br i1 %7, label %69, label %8
8: ; preds = %3
%9 = load i8, i8* %0
%10 = icmp eq i8 %9, 0
br i1 %10, label %26, label %11
11: ; preds = %8, %16
%12 = phi i8 [ %18, %16 ], [ %9, %8 ]
%13 = phi i8* [ %17, %16 ], [ %0, %8 ]
%14 = tail call i64 @isspace(i8 signext %12)
%15 = icmp eq i64 %14, 0
br i1 %15, label %20, label %16
16: ; preds = %11
%17 = getelementptr inbounds i8, i8* %13, i64 1
%18 = load i8, i8* %17
%19 = icmp eq i8 %18, 0
br i1 %19, label %26, label %11
20: ; preds = %11
%21 = load i8, i8* %13
switch i8 %21, label %26 [
i8 45, label %22
i8 43, label %24
]
22: ; preds = %20
%23 = getelementptr inbounds i8, i8* %13, i64 1
br label %26
24: ; preds = %20
%25 = getelementptr inbounds i8, i8* %13, i64 1
br label %26
26: ; preds = %16, %8, %20, %24, %22
%27 = phi i1 [ true, %24 ], [ false, %22 ], [ true, %20 ], [ true, %8 ], [ true, %16 ]
%28 = phi i8* [ %25, %24 ], [ %23, %22 ], [ %13, %20 ], [ %0, %8 ], [ %17, %16 ]
%29 = and i32 %2, -17
%30 = icmp eq i32 %29, 0
br i1 %30, label %31, label %45
31: ; preds = %26
%32 = load i8, i8* %28
%33 = icmp eq i8 %32, 48
br i1 %33, label %34, label %42
34: ; preds = %31
%35 = getelementptr inbounds i8, i8* %28, i64 1
%36 = load i8, i8* %35
%37 = icmp eq i8 %36, 120
%38 = getelementptr inbounds i8, i8* %28, i64 2
br i1 %37, label %45, label %39
39: ; preds = %34
%40 = icmp eq i32 %2, 0
%41 = select i1 %40, i32 8, i32 %2
br label %45
42: ; preds = %31
%43 = icmp eq i32 %2, 0
%44 = select i1 %43, i32 10, i32 %2
br label %45
45: ; preds = %42, %39, %34, %26
%46 = phi i8* [ %38, %34 ], [ %28, %26 ], [ %28, %42 ], [ %28, %39 ]
%47 = phi i32 [ 16, %34 ], [ %2, %26 ], [ %44, %42 ], [ %41, %39 ]
%48 = sext i32 %47 to i64
br label %49
49: ; preds = %54, %45
%50 = phi i8* [ %46, %45 ], [ %62, %54 ]
%51 = phi i64 [ 0, %45 ], [ %61, %54 ]
%52 = load i8, i8* %50
%53 = icmp eq i8 %52, 0
br i1 %53, label %63, label %54
54: ; preds = %49
%55 = sext i8 %52 to i32
%56 = tail call i32 @tolower(i32 %55)
%57 = tail call i64 @memchr(i8* bitcast ([37 x i32]* @.str to i8*), i32 %56, i32 %47)
%58 = icmp eq i64 %57, 0
%59 = mul nsw i64 %51, %48
%60 = sub i64 %59, ptrtoint ([37 x i32]* @.str to i64)
%61 = add i64 %60, %57
%62 = getelementptr inbounds i8, i8* %50, i64 1
br i1 %58, label %63, label %49
63: ; preds = %54, %49
%64 = icmp eq i8** %1, null
br i1 %64, label %66, label %65
65: ; preds = %63
store i8* %50, i8** %1
br label %66
66: ; preds = %65, %63
%67 = sub nsw i64 0, %51
%68 = select i1 %27, i64 %51, i64 %67
br label %69
69: ; preds = %66, %3
%70 = phi i64 [ 0, %3 ], [ %68, %66 ]
ret i64 %70
}