#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 */
double atof(char *);
double cac_easy(char *s) {
  char zuo_s[20];
  char you_s[20];
  char ch;
  char *tmp;
  int flag_fen = 0;
  for (int i = 0;;) {
    if (flag_fen == 0)
      tmp = zuo_s;
    else
      tmp = you_s;
    int j = i + 1;
    for (; s[j] != ')'; j++) {
      tmp[j - i - 1] = s[j];
    }
    tmp[j - i - 1] = 0;
    flag_fen = 1;
    if (tmp == you_s)
      break;
    ch = s[i = j + 1];
    i = i + 1;
  }
  switch (ch) {
  case '+':
    return atof(zuo_s) + atof(you_s);
    break;
  case '-':
    return atof(zuo_s) - atof(you_s);
    break;
  case '*':
    return atof(zuo_s) * atof(you_s);
    break;
  case '/':
    return atof(zuo_s) / atof(you_s);
    break;
  }
  return -1.0;
}


x86 assembly (clang, -O0):
<cac_easy>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
mov    %rdi,-0x10(%rbp)
movl   $0x0,-0x64(%rbp)
movl   $0x0,-0x68(%rbp)
cmpl   $0x0,-0x64(%rbp)
jne    1144 <cac_easy+0x34>
lea    -0x30(%rbp),%rax
mov    %rax,-0x60(%rbp)
jmp    114c <cac_easy+0x3c>
lea    -0x50(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x68(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x29,%eax
je     1196 <cac_easy+0x86>
mov    -0x10(%rbp),%rax
movslq -0x6c(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x60(%rbp),%rax
mov    -0x6c(%rbp),%ecx
sub    -0x68(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x6c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x6c(%rbp)
jmp    1155 <cac_easy+0x45>
mov    -0x60(%rbp),%rax
mov    -0x6c(%rbp),%ecx
sub    -0x68(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
movl   $0x1,-0x64(%rbp)
mov    -0x60(%rbp),%rax
lea    -0x50(%rbp),%rcx
cmp    %rcx,%rax
jne    11c7 <cac_easy+0xb7>
jmp    11eb <cac_easy+0xdb>
mov    -0x10(%rbp),%rax
mov    -0x6c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,-0x68(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x51(%rbp)
mov    -0x68(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x68(%rbp)
jmp    112d <cac_easy+0x1d>
movsbl -0x51(%rbp),%eax
add    $0xffffffd6,%eax
mov    %eax,%ecx
mov    %rcx,-0x78(%rbp)
sub    $0x5,%eax
ja     12db <cac_easy+0x1cb>
mov    -0x78(%rbp),%rax
lea    0xdfc(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
lea    -0x30(%rbp),%rdi
call   1030 <atof@plt>
movsd  %xmm0,-0x80(%rbp)
lea    -0x50(%rbp),%rdi
call   1030 <atof@plt>
movaps %xmm0,%xmm1
movsd  -0x80(%rbp),%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12e8 <cac_easy+0x1d8>
lea    -0x30(%rbp),%rdi
call   1030 <atof@plt>
movsd  %xmm0,-0x88(%rbp)
ff
lea    -0x50(%rbp),%rdi
call   1030 <atof@plt>
movaps %xmm0,%xmm1
movsd  -0x88(%rbp),%xmm0
ff
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12e8 <cac_easy+0x1d8>
lea    -0x30(%rbp),%rdi
call   1030 <atof@plt>
movsd  %xmm0,-0x90(%rbp)
ff
lea    -0x50(%rbp),%rdi
call   1030 <atof@plt>
movaps %xmm0,%xmm1
movsd  -0x90(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12e8 <cac_easy+0x1d8>
lea    -0x30(%rbp),%rdi
call   1030 <atof@plt>
movsd  %xmm0,-0x98(%rbp)
ff
lea    -0x50(%rbp),%rdi
call   1030 <atof@plt>
movaps %xmm0,%xmm1
movsd  -0x98(%rbp),%xmm0
ff
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12e8 <cac_easy+0x1d8>
movsd  0xd1d(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<cac_easy>:
push   %rbx
sub    $0x50,%rsp
lea    0x30(%rsp),%rsi
lea    0x2(%rdi),%r8
xor    %r10d,%r10d
lea    0x10(%rsp),%r9
xor    %r11d,%r11d
nopl   0x0(%rax)
movslq %r11d,%rax
mov    0x1(%rax,%rdi,1),%cl
mov    %r11d,%edx
cmp    $0x29,%cl
je     1166 <cac_easy+0x56>
add    %r8,%rax
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movslq %edx,%rbx
mov    %cl,(%rsi,%rbx,1)
movzbl (%rax,%rdx,1),%ecx
add    $0x1,%rdx
cmp    $0x29,%cl
jne    1150 <cac_easy+0x40>
add    %r11d,%edx
mov    %edx,%eax
sub    %r11d,%eax
cltq
movb   $0x0,(%rsi,%rax,1)
cmp    %r9,%rsi
je     118a <cac_easy+0x7a>
movslq %edx,%rax
movsbl 0x2(%rax,%rdi,1),%r10d
add    $0x3,%edx
mov    %r9,%rsi
mov    %edx,%r11d
jmp    1130 <cac_easy+0x20>
movsd  0xe6e(%rip),%xmm0
add    $0xffffffd6,%r10d
cmp    $0x5,%r10d
ja     1242 <cac_easy+0x132>
lea    0xe61(%rip),%rax
movslq (%rax,%r10,4),%rcx
add    %rax,%rcx
jmp    *%rcx
lea    0x30(%rsp),%rdi
call   1030 <atof@plt>
movsd  %xmm0,0x8(%rsp)
lea    0x10(%rsp),%rdi
call   1030 <atof@plt>
mulsd  0x8(%rsp),%xmm0
jmp    1242 <cac_easy+0x132>
lea    0x30(%rsp),%rdi
call   1030 <atof@plt>
movsd  %xmm0,0x8(%rsp)
lea    0x10(%rsp),%rdi
call   1030 <atof@plt>
addsd  0x8(%rsp),%xmm0
jmp    1242 <cac_easy+0x132>
lea    0x30(%rsp),%rdi
call   1030 <atof@plt>
movsd  %xmm0,0x8(%rsp)
lea    0x10(%rsp),%rdi
call   1030 <atof@plt>
movsd  0x8(%rsp),%xmm1
subsd  %xmm0,%xmm1
jmp    123e <cac_easy+0x12e>
lea    0x30(%rsp),%rdi
call   1030 <atof@plt>
movsd  %xmm0,0x8(%rsp)
lea    0x10(%rsp),%rdi
call   1030 <atof@plt>
movsd  0x8(%rsp),%xmm1
divsd  %xmm0,%xmm1
movapd %xmm1,%xmm0
add    $0x50,%rsp
pop    %rbx
ret

LLVM IR (-O0):
define double @cac_easy(i8* %0) {
%2 = alloca double
%3 = alloca i8*
%4 = alloca [20 x i8]
%5 = alloca [20 x i8]
%6 = alloca i8
%7 = alloca i8*
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
store i8* %0, i8** %3
store i32 0, i32* %8
store i32 0, i32* %9
br label %11
11: ; preds = %57, %1
%12 = load i32, i32* %8
%13 = icmp eq i32 %12, 0
br i1 %13, label %14, label %16
14: ; preds = %11
%15 = getelementptr inbounds [20 x i8], [20 x i8]* %4, i64 0, i64 0
store i8* %15, i8** %7
br label %18
16: ; preds = %11
%17 = getelementptr inbounds [20 x i8], [20 x i8]* %5, i64 0, i64 0
store i8* %17, i8** %7
br label %18
18: ; preds = %16, %14
%19 = load i32, i32* %9
%20 = add nsw i32 %19, 1
store i32 %20, i32* %10
br label %21
21: ; preds = %42, %18
%22 = load i8*, i8** %3
%23 = load i32, i32* %10
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %22, i64 %24
%26 = load i8, i8* %25
%27 = sext i8 %26 to i32
%28 = icmp ne i32 %27, 41
br i1 %28, label %29, label %45
29: ; preds = %21
%30 = load i8*, i8** %3
%31 = load i32, i32* %10
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds i8, i8* %30, i64 %32
%34 = load i8, i8* %33
%35 = load i8*, i8** %7
%36 = load i32, i32* %10
%37 = load i32, i32* %9
%38 = sub nsw i32 %36, %37
%39 = sub nsw i32 %38, 1
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds i8, i8* %35, i64 %40
store i8 %34, i8* %41
br label %42
42: ; preds = %29
%43 = load i32, i32* %10
%44 = add nsw i32 %43, 1
store i32 %44, i32* %10
br label %21
45: ; preds = %21
%46 = load i8*, i8** %7
%47 = load i32, i32* %10
%48 = load i32, i32* %9
%49 = sub nsw i32 %47, %48
%50 = sub nsw i32 %49, 1
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds i8, i8* %46, i64 %51
store i8 0, i8* %52
store i32 1, i32* %8
%53 = load i8*, i8** %7
%54 = getelementptr inbounds [20 x i8], [20 x i8]* %5, i64 0, i64 0
%55 = icmp eq i8* %53, %54
br i1 %55, label %56, label %57
56: ; preds = %45
br label %66
57: ; preds = %45
%58 = load i8*, i8** %3
%59 = load i32, i32* %10
%60 = add nsw i32 %59, 1
store i32 %60, i32* %9
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds i8, i8* %58, i64 %61
%63 = load i8, i8* %62
store i8 %63, i8* %6
%64 = load i32, i32* %9
%65 = add nsw i32 %64, 1
store i32 %65, i32* %9
br label %11
66: ; preds = %56
%67 = load i8, i8* %6
%68 = sext i8 %67 to i32
switch i32 %68, label %93 [
i32 43, label %69
i32 45, label %75
i32 42, label %81
i32 47, label %87
]
69: ; preds = %66
%70 = getelementptr inbounds [20 x i8], [20 x i8]* %4, i64 0, i64 0
%71 = call double @atof(i8* %70)
%72 = getelementptr inbounds [20 x i8], [20 x i8]* %5, i64 0, i64 0
%73 = call double @atof(i8* %72)
%74 = fadd double %71, %73
store double %74, double* %2
br label %94
75: ; preds = %66
%76 = getelementptr inbounds [20 x i8], [20 x i8]* %4, i64 0, i64 0
%77 = call double @atof(i8* %76)
%78 = getelementptr inbounds [20 x i8], [20 x i8]* %5, i64 0, i64 0
%79 = call double @atof(i8* %78)
%80 = fsub double %77, %79
store double %80, double* %2
br label %94
81: ; preds = %66
%82 = getelementptr inbounds [20 x i8], [20 x i8]* %4, i64 0, i64 0
%83 = call double @atof(i8* %82)
%84 = getelementptr inbounds [20 x i8], [20 x i8]* %5, i64 0, i64 0
%85 = call double @atof(i8* %84)
%86 = fmul double %83, %85
store double %86, double* %2
br label %94
87: ; preds = %66
%88 = getelementptr inbounds [20 x i8], [20 x i8]* %4, i64 0, i64 0
%89 = call double @atof(i8* %88)
%90 = getelementptr inbounds [20 x i8], [20 x i8]* %5, i64 0, i64 0
%91 = call double @atof(i8* %90)
%92 = fdiv double %89, %91
store double %92, double* %2
br label %94
93: ; preds = %66
store double -1.000000e+00, double* %2
br label %94
94: ; preds = %93, %87, %81, %75, %69
%95 = load double, double* %2
ret double %95
}

LLVM IR (-O2):
define double @cac_easy(i8* nocapture %0) {
%2 = alloca [20 x i8]
%3 = alloca [20 x i8]
%4 = getelementptr inbounds [20 x i8], [20 x i8]* %2, i64 0, i64 0
%5 = getelementptr inbounds [20 x i8], [20 x i8]* %3, i64 0, i64 0
br label %6
6: ; preds = %39, %1
%7 = phi i32 [ 0, %1 ], [ %45, %39 ]
%8 = phi i8* [ %4, %1 ], [ %5, %39 ]
%9 = phi i32 [ 0, %1 ], [ %44, %39 ]
%10 = add nsw i32 %9, 1
%11 = sext i32 %10 to i64
%12 = getelementptr inbounds i8, i8* %0, i64 %11
%13 = load i8, i8* %12
%14 = icmp eq i8 %13, 41
br i1 %14, label %33, label %15
15: ; preds = %6
%16 = sext i32 %9 to i64
%17 = add nsw i64 %16, 1
br label %18
18: ; preds = %15, %18
%19 = phi i64 [ %16, %15 ], [ %30, %18 ]
%20 = phi i64 [ %17, %15 ], [ %26, %18 ]
%21 = phi i8 [ %13, %15 ], [ %28, %18 ]
%22 = trunc i64 %19 to i32
%23 = sub i32 %22, %9
%24 = sext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %8, i64 %24
store i8 %21, i8* %25
%26 = add i64 %20, 1
%27 = getelementptr inbounds i8, i8* %0, i64 %26
%28 = load i8, i8* %27
%29 = icmp eq i8 %28, 41
%30 = add nsw i64 %19, 1
br i1 %29, label %31, label %18
31: ; preds = %18
%32 = trunc i64 %20 to i32
br label %33
33: ; preds = %31, %6
%34 = phi i32 [ %9, %6 ], [ %32, %31 ]
%35 = sub i32 %34, %9
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i8, i8* %8, i64 %36
store i8 0, i8* %37
%38 = icmp eq i8* %8, %5
br i1 %38, label %46, label %39
39: ; preds = %33
%40 = add nsw i32 %34, 2
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds i8, i8* %0, i64 %41
%43 = load i8, i8* %42
%44 = add nsw i32 %34, 3
%45 = sext i8 %43 to i32
br label %6
46: ; preds = %33
switch i32 %7, label %63 [
i32 43, label %47
i32 45, label %51
i32 42, label %55
i32 47, label %59
]
47: ; preds = %46
%48 = call double @atof(i8* %4)
%49 = call double @atof(i8* %5)
%50 = fadd double %48, %49
br label %63
51: ; preds = %46
%52 = call double @atof(i8* %4)
%53 = call double @atof(i8* %5)
%54 = fsub double %52, %53
br label %63
55: ; preds = %46
%56 = call double @atof(i8* %4)
%57 = call double @atof(i8* %5)
%58 = fmul double %56, %57
br label %63
59: ; preds = %46
%60 = call double @atof(i8* %4)
%61 = call double @atof(i8* %5)
%62 = fdiv double %60, %61
br label %63
63: ; preds = %46, %59, %55, %51, %47
%64 = phi double [ %62, %59 ], [ %58, %55 ], [ %54, %51 ], [ %50, %47 ], [ -1.000000e+00, %46 ]
ret double %64
}