#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 */
struct dc {
  int dummy;
};

/* Variables and functions */
int dc_pop(struct dc *);
int /*<<< orphan*/ dc_push(struct dc *, int);
int /*<<< orphan*/ errx(int, char *, char *);
void dcf_binop(struct dc *dc, char *cmd) {
  int v0 = dc_pop(dc);
  int v1 = dc_pop(dc);
  int v2 = 0;
  switch (*cmd) {
  case '+':
    v2 = v0 + v1;
    break;
  case '-':
    v2 = v0 - v1;
    break;
  case '*':
    v2 = v0 * v1;
    break;
  case '/':
    v2 = v0 / v1;
    break;
  case '%':
    v2 = v0 % v1;
    break;
  case '^':
    v2 = v0 ^ v1;
    break;
  case '&':
    v2 = v0 & v1;
    break;
  case '|':
    v2 = v0 | v1;
    break;
  default:
    errx(2, "dcf_binop(%s)", cmd);
    break;
  }
  dc_push(dc, v2);
}


x86 assembly (clang, -O0):
<dcf_binop>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rdi
call   1050 <dc_pop@plt>
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%rdi
call   1050 <dc_pop@plt>
mov    %eax,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movsbl (%rax),%eax
mov    %eax,-0x20(%rbp)
sub    $0x25,%eax
je     1228 <dcf_binop+0xf8>
jmp    1177 <dcf_binop+0x47>
mov    -0x20(%rbp),%eax
sub    $0x26,%eax
je     1245 <dcf_binop+0x115>
jmp    1188 <dcf_binop+0x58>
mov    -0x20(%rbp),%eax
sub    $0x2a,%eax
je     120a <dcf_binop+0xda>
jmp    1199 <dcf_binop+0x69>
mov    -0x20(%rbp),%eax
sub    $0x2b,%eax
je     11ee <dcf_binop+0xbe>
jmp    11aa <dcf_binop+0x7a>
mov    -0x20(%rbp),%eax
sub    $0x2d,%eax
je     11fc <dcf_binop+0xcc>
jmp    11bb <dcf_binop+0x8b>
mov    -0x20(%rbp),%eax
sub    $0x2f,%eax
je     1219 <dcf_binop+0xe9>
jmp    11cc <dcf_binop+0x9c>
mov    -0x20(%rbp),%eax
sub    $0x5e,%eax
je     1237 <dcf_binop+0x107>
jmp    11dd <dcf_binop+0xad>
mov    -0x20(%rbp),%eax
sub    $0x7c,%eax
je     1253 <dcf_binop+0x123>
jmp    1261 <dcf_binop+0x131>
mov    -0x14(%rbp),%eax
add    -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1276 <dcf_binop+0x146>
mov    -0x14(%rbp),%eax
sub    -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1276 <dcf_binop+0x146>
mov    -0x14(%rbp),%eax
imul   -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1276 <dcf_binop+0x146>
mov    -0x14(%rbp),%eax
cltd
idivl  -0x18(%rbp)
mov    %eax,-0x1c(%rbp)
jmp    1276 <dcf_binop+0x146>
mov    -0x14(%rbp),%eax
cltd
idivl  -0x18(%rbp)
mov    %edx,-0x1c(%rbp)
jmp    1276 <dcf_binop+0x146>
mov    -0x14(%rbp),%eax
xor    -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1276 <dcf_binop+0x146>
mov    -0x14(%rbp),%eax
and    -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1276 <dcf_binop+0x146>
mov    -0x14(%rbp),%eax
or     -0x18(%rbp),%eax
mov    %eax,-0x1c(%rbp)
jmp    1276 <dcf_binop+0x146>
mov    -0x10(%rbp),%rdx
mov    $0x2,%edi
lea    0xd8f(%rip),%rsi
call   1040 <errx@plt>
mov    -0x8(%rbp),%rdi
mov    -0x1c(%rbp),%esi
call   1030 <dc_push@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<dcf_binop>:
push   %rbp
push   %r14
push   %rbx
mov    %rsi,%rbp
mov    %rdi,%rbx
call   1050 <dc_pop@plt>
mov    %eax,%r14d
mov    %rbx,%rdi
call   1050 <dc_pop@plt>
mov    %eax,%esi
movsbl 0x0(%rbp),%ecx
lea    -0x25(%rcx),%eax
cmp    $0x39,%eax
ja     1172 <dcf_binop+0x42>
lea    0xea1(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    %r14d,%eax
cltd
idiv   %esi
mov    %edx,%esi
jmp    11b9 <dcf_binop+0x89>
cmp    $0x7c,%ecx
jne    117c <dcf_binop+0x4c>
or     %r14d,%esi
jmp    11b9 <dcf_binop+0x89>
lea    0xf65(%rip),%rsi
mov    $0x2,%edi
mov    %rbp,%rdx
call   1040 <errx@plt>
xor    %esi,%esi
jmp    11b9 <dcf_binop+0x89>
and    %r14d,%esi
jmp    11b9 <dcf_binop+0x89>
imul   %r14d,%esi
jmp    11b9 <dcf_binop+0x89>
add    %r14d,%esi
jmp    11b9 <dcf_binop+0x89>
sub    %esi,%r14d
mov    %r14d,%esi
jmp    11b9 <dcf_binop+0x89>
mov    %r14d,%eax
cltd
idiv   %esi
mov    %eax,%esi
jmp    11b9 <dcf_binop+0x89>
xor    %r14d,%esi
mov    %rbx,%rdi
pop    %rbx
pop    %r14
pop    %rbp
jmp    1030 <dc_push@plt>

LLVM IR (-O0):
%struct.dc = type { i32 }
@.str = [14 x i8] c"dcf_binop(%s)\00"
define void @dcf_binop(%struct.dc* %0, i8* %1) {
%3 = alloca %struct.dc*
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
store %struct.dc* %0, %struct.dc** %3
store i8* %1, i8** %4
%8 = load %struct.dc*, %struct.dc** %3
%9 = call i32 @dc_pop(%struct.dc* %8)
store i32 %9, i32* %5
%10 = load %struct.dc*, %struct.dc** %3
%11 = call i32 @dc_pop(%struct.dc* %10)
store i32 %11, i32* %6
store i32 0, i32* %7
%12 = load i8*, i8** %4
%13 = load i8, i8* %12
%14 = sext i8 %13 to i32
switch i32 %14, label %47 [
i32 43, label %15
i32 45, label %19
i32 42, label %23
i32 47, label %27
i32 37, label %31
i32 94, label %35
i32 38, label %39
i32 124, label %43
]
15: ; preds = %2
%16 = load i32, i32* %5
%17 = load i32, i32* %6
%18 = add nsw i32 %16, %17
store i32 %18, i32* %7
br label %50
19: ; preds = %2
%20 = load i32, i32* %5
%21 = load i32, i32* %6
%22 = sub nsw i32 %20, %21
store i32 %22, i32* %7
br label %50
23: ; preds = %2
%24 = load i32, i32* %5
%25 = load i32, i32* %6
%26 = mul nsw i32 %24, %25
store i32 %26, i32* %7
br label %50
27: ; preds = %2
%28 = load i32, i32* %5
%29 = load i32, i32* %6
%30 = sdiv i32 %28, %29
store i32 %30, i32* %7
br label %50
31: ; preds = %2
%32 = load i32, i32* %5
%33 = load i32, i32* %6
%34 = srem i32 %32, %33
store i32 %34, i32* %7
br label %50
35: ; preds = %2
%36 = load i32, i32* %5
%37 = load i32, i32* %6
%38 = xor i32 %36, %37
store i32 %38, i32* %7
br label %50
39: ; preds = %2
%40 = load i32, i32* %5
%41 = load i32, i32* %6
%42 = and i32 %40, %41
store i32 %42, i32* %7
br label %50
43: ; preds = %2
%44 = load i32, i32* %5
%45 = load i32, i32* %6
%46 = or i32 %44, %45
store i32 %46, i32* %7
br label %50
47: ; preds = %2
%48 = load i8*, i8** %4
%49 = call i32 @errx(i32 2, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i64 0, i64 0), i8* %48)
br label %50
50: ; preds = %47, %43, %39, %35, %31, %27, %23, %19, %15
%51 = load %struct.dc*, %struct.dc** %3
%52 = load i32, i32* %7
%53 = call i32 @dc_push(%struct.dc* %51, i32 %52)
ret void
}

LLVM IR (-O2):
%struct.dc = type { i32 }
@.str = [14 x i8] c"dcf_binop(%s)\00"
define void @dcf_binop(%struct.dc* %0, i8* %1) {
%3 = tail call i32 @dc_pop(%struct.dc* %0)
%4 = tail call i32 @dc_pop(%struct.dc* %0)
%5 = load i8, i8* %1
%6 = sext i8 %5 to i32
switch i32 %6, label %23 [
i32 43, label %7
i32 45, label %9
i32 42, label %11
i32 47, label %13
i32 37, label %15
i32 94, label %17
i32 38, label %19
i32 124, label %21
]
7: ; preds = %2
%8 = add nsw i32 %4, %3
br label %25
9: ; preds = %2
%10 = sub nsw i32 %3, %4
br label %25
11: ; preds = %2
%12 = mul nsw i32 %4, %3
br label %25
13: ; preds = %2
%14 = sdiv i32 %3, %4
br label %25
15: ; preds = %2
%16 = srem i32 %3, %4
br label %25
17: ; preds = %2
%18 = xor i32 %4, %3
br label %25
19: ; preds = %2
%20 = and i32 %4, %3
br label %25
21: ; preds = %2
%22 = or i32 %4, %3
br label %25
23: ; preds = %2
%24 = tail call i32 @errx(i32 2, i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str, i64 0, i64 0), i8* %1)
br label %25
25: ; preds = %23, %21, %19, %17, %15, %13, %11, %9, %7
%26 = phi i32 [ 0, %23 ], [ %22, %21 ], [ %20, %19 ], [ %18, %17 ], [ %16, %15 ], [ %14, %13 ], [ %12, %11 ], [ %10, %9 ], [ %8, %7 ]
%27 = tail call i32 @dc_push(%struct.dc* %0, i32 %26)
ret void
}