#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 */
long EINVAL;
unsigned long strtoul(char const *, char **, int /*<<< orphan*/);
long rlb_strtol(const char *s) {
  unsigned long l, u = 1;
  char *end, p, q;
  l = strtoul(s, &end, 0);
  if (!*end)
    return l;
  p = *end++;
  switch (p) {
  case 'G':
  case 'g':
  case 'M':
  case 'm':
  case 'K':
  case 'k':
    q = *end++;
    switch (q) {
    case 'i':
      switch (p) {
      case 'G':
      case 'g':
        u *= 1024;
      case 'M':
      case 'm':
        u *= 1024;
      case 'K':
      case 'k':
        u *= 1024;
      }
      break;
    case 0:
      switch (p) {
      case 'G':
      case 'g':
        u *= 1000;
      case 'M':
      case 'm':
        u *= 1000;
      case 'K':
      case 'k':
        u *= 1000;
      }
      break;
    default:
      goto fail;
    }
    break;
  case 0:
    break;
  default:
    goto fail;
  }
  return l * u;
fail:
  return -EINVAL;
}


x86 assembly (clang, -O0):
<rlb_strtol>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x10(%rbp)
movq   $0x1,-0x20(%rbp)
mov    -0x10(%rbp),%rdi
lea    -0x28(%rbp),%rsi
xor    %edx,%edx
call   1030 <strtoul@plt>
mov    %rax,-0x18(%rbp)
mov    -0x28(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1151 <rlb_strtol+0x41>
mov    -0x18(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1374 <rlb_strtol+0x264>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%al
mov    %al,-0x29(%rbp)
movsbl -0x29(%rbp),%eax
mov    %eax,-0x30(%rbp)
test   %eax,%eax
je     1348 <rlb_strtol+0x238>
jmp    1179 <rlb_strtol+0x69>
mov    -0x30(%rbp),%eax
sub    $0x47,%eax
je     11df <rlb_strtol+0xcf>
jmp    118a <rlb_strtol+0x7a>
mov    -0x30(%rbp),%eax
sub    $0x4b,%eax
je     11df <rlb_strtol+0xcf>
jmp    119b <rlb_strtol+0x8b>
mov    -0x30(%rbp),%eax
sub    $0x4d,%eax
je     11df <rlb_strtol+0xcf>
jmp    11ac <rlb_strtol+0x9c>
mov    -0x30(%rbp),%eax
sub    $0x67,%eax
je     11df <rlb_strtol+0xcf>
jmp    11bd <rlb_strtol+0xad>
mov    -0x30(%rbp),%eax
sub    $0x6b,%eax
je     11df <rlb_strtol+0xcf>
jmp    11ce <rlb_strtol+0xbe>
mov    -0x30(%rbp),%eax
sub    $0x6d,%eax
jne    134d <rlb_strtol+0x23d>
jmp    11df <rlb_strtol+0xcf>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x28(%rbp)
mov    (%rax),%al
mov    %al,-0x2a(%rbp)
movsbl -0x2a(%rbp),%eax
mov    %eax,-0x34(%rbp)
test   %eax,%eax
je     12ab <rlb_strtol+0x19b>
jmp    1207 <rlb_strtol+0xf7>
mov    -0x34(%rbp),%eax
sub    $0x69,%eax
jne    133e <rlb_strtol+0x22e>
jmp    1218 <rlb_strtol+0x108>
movsbl -0x29(%rbp),%eax
mov    %eax,-0x38(%rbp)
sub    $0x47,%eax
je     1282 <rlb_strtol+0x172>
jmp    122d <rlb_strtol+0x11d>
mov    -0x38(%rbp),%eax
sub    $0x4b,%eax
je     129a <rlb_strtol+0x18a>
jmp    123e <rlb_strtol+0x12e>
mov    -0x38(%rbp),%eax
sub    $0x4d,%eax
je     128e <rlb_strtol+0x17e>
jmp    124f <rlb_strtol+0x13f>
mov    -0x38(%rbp),%eax
sub    $0x67,%eax
je     1282 <rlb_strtol+0x172>
jmp    1260 <rlb_strtol+0x150>
mov    -0x38(%rbp),%eax
sub    $0x6b,%eax
je     129a <rlb_strtol+0x18a>
jmp    1271 <rlb_strtol+0x161>
mov    -0x38(%rbp),%eax
sub    $0x6d,%eax
je     128e <rlb_strtol+0x17e>
jmp    12a6 <rlb_strtol+0x196>
mov    -0x20(%rbp),%rax
shl    $0xa,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
shl    $0xa,%rax
mov    %rax,-0x20(%rbp)
mov    -0x20(%rbp),%rax
shl    $0xa,%rax
mov    %rax,-0x20(%rbp)
jmp    1343 <rlb_strtol+0x233>
movsbl -0x29(%rbp),%eax
mov    %eax,-0x3c(%rbp)
sub    $0x47,%eax
je     1315 <rlb_strtol+0x205>
jmp    12c0 <rlb_strtol+0x1b0>
mov    -0x3c(%rbp),%eax
sub    $0x4b,%eax
je     132d <rlb_strtol+0x21d>
jmp    12d1 <rlb_strtol+0x1c1>
mov    -0x3c(%rbp),%eax
sub    $0x4d,%eax
je     1321 <rlb_strtol+0x211>
jmp    12e2 <rlb_strtol+0x1d2>
mov    -0x3c(%rbp),%eax
sub    $0x67,%eax
je     1315 <rlb_strtol+0x205>
jmp    12f3 <rlb_strtol+0x1e3>
mov    -0x3c(%rbp),%eax
sub    $0x6b,%eax
je     132d <rlb_strtol+0x21d>
jmp    1304 <rlb_strtol+0x1f4>
mov    -0x3c(%rbp),%eax
sub    $0x6d,%eax
je     1321 <rlb_strtol+0x211>
jmp    1339 <rlb_strtol+0x229>
imul   $0x3e8,-0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
imul   $0x3e8,-0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
imul   $0x3e8,-0x20(%rbp),%rax
mov    %rax,-0x20(%rbp)
jmp    1343 <rlb_strtol+0x233>
jmp    1364 <rlb_strtol+0x254>
jmp    1352 <rlb_strtol+0x242>
jmp    1352 <rlb_strtol+0x242>
jmp    1364 <rlb_strtol+0x254>
mov    -0x18(%rbp),%rax
imul   -0x20(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    1374 <rlb_strtol+0x264>
xor    %eax,%eax
mov    0x2c73(%rip),%rcx
sub    (%rcx),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<rlb_strtol>:
push   %rax
mov    %rsp,%rsi
xor    %edx,%edx
call   1030 <strtoul@plt>
mov    (%rsp),%rsi
movsbl (%rsi),%edi
test   %edi,%edi
je     1186 <rlb_strtol+0x76>
mov    $0x1,%r8d
lea    -0x47(%rdi),%edx
cmp    $0x26,%edx
ja     118b <rlb_strtol+0x7b>
movabs $0x5100000051,%rcx
bt     %rdx,%rcx
jae    118b <rlb_strtol+0x7b>
movsbl 0x1(%rsi),%esi
test   %esi,%esi
je     119e <rlb_strtol+0x8e>
cmp    $0x69,%esi
jne    118f <rlb_strtol+0x7f>
cmp    $0x26,%edx
ja     11ee <rlb_strtol+0xde>
movabs $0x100000001,%rcx
bt     %rdx,%rcx
jb     11df <rlb_strtol+0xcf>
mov    $0x400,%esi
movabs $0x1000000010,%rcx
bt     %rdx,%rcx
jb     11eb <rlb_strtol+0xdb>
mov    $0x100000,%esi
jmp    11cd <rlb_strtol+0xbd>
mov    %rax,%r8
jmp    11f2 <rlb_strtol+0xe2>
test   %edi,%edi
je     11ee <rlb_strtol+0xde>
mov    0x2e4a(%rip),%rax
xor    %r8d,%r8d
sub    (%rax),%r8
jmp    11f2 <rlb_strtol+0xe2>
cmp    $0x26,%edx
ja     11ee <rlb_strtol+0xde>
movabs $0x100000001,%rcx
bt     %rdx,%rcx
jb     11e6 <rlb_strtol+0xd6>
mov    $0x3e8,%esi
movabs $0x1000000010,%rcx
bt     %rdx,%rcx
jb     11eb <rlb_strtol+0xdb>
mov    $0xf4240,%esi
movabs $0x4000000040,%rcx
bt     %rdx,%rcx
jb     11eb <rlb_strtol+0xdb>
jmp    11ee <rlb_strtol+0xde>
mov    $0x40000000,%esi
jmp    11eb <rlb_strtol+0xdb>
mov    $0x3b9aca00,%esi
mov    %rsi,%r8
imul   %rax,%r8
mov    %r8,%rax
pop    %rcx
ret

LLVM IR (-O0):
@EINVAL = global i64 0
define i64 @rlb_strtol(i8* %0) {
%2 = alloca i64
%3 = alloca i8*
%4 = alloca i64
%5 = alloca i64
%6 = alloca i8*
%7 = alloca i8
%8 = alloca i8
store i8* %0, i8** %3
store i64 1, i64* %5
%9 = load i8*, i8** %3
%10 = call i64 @strtoul(i8* %9, i8** %6, i32 0)
store i64 %10, i64* %4
%11 = load i8*, i8** %6
%12 = load i8, i8* %11
%13 = icmp ne i8 %12, 0
br i1 %13, label %16, label %14
14: ; preds = %1
%15 = load i64, i64* %4
store i64 %15, i64* %2
br label %65
16: ; preds = %1
%17 = load i8*, i8** %6
%18 = getelementptr inbounds i8, i8* %17, i32 1
store i8* %18, i8** %6
%19 = load i8, i8* %17
store i8 %19, i8* %7
%20 = load i8, i8* %7
%21 = sext i8 %20 to i32
switch i32 %21, label %57 [
i32 71, label %22
i32 103, label %22
i32 77, label %22
i32 109, label %22
i32 75, label %22
i32 107, label %22
i32 0, label %56
]
22: ; preds = %16, %16, %16, %16, %16, %16
%23 = load i8*, i8** %6
%24 = getelementptr inbounds i8, i8* %23, i32 1
store i8* %24, i8** %6
%25 = load i8, i8* %23
store i8 %25, i8* %8
%26 = load i8, i8* %8
%27 = sext i8 %26 to i32
switch i32 %27, label %54 [
i32 105, label %28
i32 0, label %41
]
28: ; preds = %22
%29 = load i8, i8* %7
%30 = sext i8 %29 to i32
switch i32 %30, label %40 [
i32 71, label %31
i32 103, label %31
i32 77, label %34
i32 109, label %34
i32 75, label %37
i32 107, label %37
]
31: ; preds = %28, %28
%32 = load i64, i64* %5
%33 = mul i64 %32, 1024
store i64 %33, i64* %5
br label %34
34: ; preds = %28, %28, %31
%35 = load i64, i64* %5
%36 = mul i64 %35, 1024
store i64 %36, i64* %5
br label %37
37: ; preds = %28, %28, %34
%38 = load i64, i64* %5
%39 = mul i64 %38, 1024
store i64 %39, i64* %5
br label %40
40: ; preds = %37, %28
br label %55
41: ; preds = %22
%42 = load i8, i8* %7
%43 = sext i8 %42 to i32
switch i32 %43, label %53 [
i32 71, label %44
i32 103, label %44
i32 77, label %47
i32 109, label %47
i32 75, label %50
i32 107, label %50
]
44: ; preds = %41, %41
%45 = load i64, i64* %5
%46 = mul i64 %45, 1000
store i64 %46, i64* %5
br label %47
47: ; preds = %41, %41, %44
%48 = load i64, i64* %5
%49 = mul i64 %48, 1000
store i64 %49, i64* %5
br label %50
50: ; preds = %41, %41, %47
%51 = load i64, i64* %5
%52 = mul i64 %51, 1000
store i64 %52, i64* %5
br label %53
53: ; preds = %50, %41
br label %55
54: ; preds = %22
br label %62
55: ; preds = %53, %40
br label %58
56: ; preds = %16
br label %58
57: ; preds = %16
br label %62
58: ; preds = %56, %55
%59 = load i64, i64* %4
%60 = load i64, i64* %5
%61 = mul i64 %59, %60
store i64 %61, i64* %2
br label %65
62: ; preds = %57, %54
%63 = load i64, i64* @EINVAL
%64 = sub nsw i64 0, %63
store i64 %64, i64* %2
br label %65
65: ; preds = %62, %58, %14
%66 = load i64, i64* %2
ret i64 %66
}

LLVM IR (-O2):
@EINVAL = global i64 0
define i64 @rlb_strtol(i8* %0) {
%2 = alloca i8*
%3 = bitcast i8** %2 to i8*
%4 = call i64 @strtoul(i8* %0, i8** %2, i32 0)
%5 = load i8*, i8** %2
%6 = load i8, i8* %5
%7 = icmp eq i8 %6, 0
br i1 %7, label %32, label %8
8: ; preds = %1
%9 = sext i8 %6 to i32
switch i32 %9, label %29 [
i32 71, label %10
i32 103, label %10
i32 77, label %10
i32 109, label %10
i32 75, label %10
i32 107, label %10
i32 0, label %26
]
10: ; preds = %8, %8, %8, %8, %8, %8
%11 = getelementptr inbounds i8, i8* %5, i64 1
%12 = load i8, i8* %11
%13 = sext i8 %12 to i32
switch i32 %13, label %29 [
i32 105, label %14
i32 0, label %20
]
14: ; preds = %10
switch i32 %9, label %26 [
i32 71, label %15
i32 103, label %15
i32 77, label %16
i32 109, label %16
i32 75, label %18
i32 107, label %18
]
15: ; preds = %14, %14
br label %16
16: ; preds = %14, %14, %15
%17 = phi i64 [ 1048576, %14 ], [ 1048576, %14 ], [ 1073741824, %15 ]
br label %18
18: ; preds = %14, %14, %16
%19 = phi i64 [ 1024, %14 ], [ 1024, %14 ], [ %17, %16 ]
br label %26
20: ; preds = %10
switch i32 %9, label %26 [
i32 71, label %21
i32 103, label %21
i32 77, label %22
i32 109, label %22
i32 75, label %24
i32 107, label %24
]
21: ; preds = %20, %20
br label %22
22: ; preds = %20, %20, %21
%23 = phi i64 [ 1000000, %20 ], [ 1000000, %20 ], [ 1000000000, %21 ]
br label %24
24: ; preds = %20, %20, %22
%25 = phi i64 [ 1000, %20 ], [ 1000, %20 ], [ %23, %22 ]
br label %26
26: ; preds = %18, %14, %24, %20, %8
%27 = phi i64 [ 1, %8 ], [ 1, %20 ], [ %25, %24 ], [ 1, %14 ], [ %19, %18 ]
%28 = mul i64 %27, %4
br label %32
29: ; preds = %8, %10
%30 = load i64, i64* @EINVAL
%31 = sub nsw i64 0, %30
br label %32
32: ; preds = %1, %29, %26
%33 = phi i64 [ %31, %29 ], [ %28, %26 ], [ %4, %1 ]
ret i64 %33
}