char *decr(a, b, c, d, e)
char a, b, c, d, e;
{
  static char buf[6];
  buf[0] = a - '+';
  buf[1] = b - '-';
  buf[2] = c - '#';
  buf[3] = d - '&';
  buf[4] = e - '%';
  buf[5] = 0;
  return buf;
}


x86 assembly (clang, -O0):
<decr>:
push   %rbp
mov    %rsp,%rbp
mov    %r8b,%al
mov    %dil,-0x1(%rbp)
mov    %sil,-0x2(%rbp)
mov    %dl,-0x3(%rbp)
mov    %cl,-0x4(%rbp)
mov    %al,-0x5(%rbp)
movsbl -0x1(%rbp),%eax
sub    $0x2b,%eax
mov    %al,0x2efc(%rip)
movsbl -0x2(%rbp),%eax
sub    $0x2d,%eax
mov    %al,0x2ef0(%rip)
movsbl -0x3(%rbp),%eax
sub    $0x23,%eax
mov    %al,0x2ee4(%rip)
movsbl -0x4(%rbp),%eax
sub    $0x26,%eax
mov    %al,0x2ed8(%rip)
movsbl -0x5(%rbp),%eax
sub    $0x25,%eax
mov    %al,0x2ecc(%rip)
movb   $0x0,0x2ec6(%rip)
lea    0x2eba(%rip),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<decr>:
add    $0xd5,%dil
mov    %dil,0x2f16(%rip)
lea    0x2f0f(%rip),%rax
add    $0xd3,%sil
mov    %sil,0x2f05(%rip)
add    $0xdd,%dl
mov    %dl,0x2efd(%rip)
add    $0xda,%cl
mov    %cl,0x2ef5(%rip)
add    $0xdb,%r8b
mov    %r8b,0x2eeb(%rip)
movb   $0x0,0x2ee5(%rip)
ret

LLVM IR (-O0):
@decr.buf = internal global [6 x i8] zeroinitializer
define i8* @decr(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = alloca i8
%7 = alloca i8
%8 = alloca i8
%9 = alloca i8
%10 = alloca i8
%11 = trunc i32 %0 to i8
%12 = trunc i32 %1 to i8
%13 = trunc i32 %2 to i8
%14 = trunc i32 %3 to i8
%15 = trunc i32 %4 to i8
store i8 %11, i8* %6
store i8 %12, i8* %7
store i8 %13, i8* %8
store i8 %14, i8* %9
store i8 %15, i8* %10
%16 = load i8, i8* %6
%17 = sext i8 %16 to i32
%18 = sub nsw i32 %17, 43
%19 = trunc i32 %18 to i8
store i8 %19, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 0)
%20 = load i8, i8* %7
%21 = sext i8 %20 to i32
%22 = sub nsw i32 %21, 45
%23 = trunc i32 %22 to i8
store i8 %23, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 1)
%24 = load i8, i8* %8
%25 = sext i8 %24 to i32
%26 = sub nsw i32 %25, 35
%27 = trunc i32 %26 to i8
store i8 %27, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 2)
%28 = load i8, i8* %9
%29 = sext i8 %28 to i32
%30 = sub nsw i32 %29, 38
%31 = trunc i32 %30 to i8
store i8 %31, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 3)
%32 = load i8, i8* %10
%33 = sext i8 %32 to i32
%34 = sub nsw i32 %33, 37
%35 = trunc i32 %34 to i8
store i8 %35, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 4)
store i8 0, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 5)
ret i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 0)
}

LLVM IR (-O2):
@decr.buf = internal global [6 x i8] zeroinitializer
define i8* @decr(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = trunc i32 %0 to i8
%7 = add i8 %6, -43
store i8 %7, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 0)
%8 = trunc i32 %1 to i8
%9 = add i8 %8, -45
store i8 %9, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 1)
%10 = trunc i32 %2 to i8
%11 = add i8 %10, -35
store i8 %11, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 2)
%12 = trunc i32 %3 to i8
%13 = add i8 %12, -38
store i8 %13, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 3)
%14 = trunc i32 %4 to i8
%15 = add i8 %14, -37
store i8 %15, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 4)
store i8 0, i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 5)
ret i8* getelementptr inbounds ([6 x i8], [6 x i8]* @decr.buf, i64 0, i64 0)
}