int Q_charascii(int c) {
  if ((c == ' ' || c == '\f' || c == '\n' || c == '\r' || c == '\t' ||
       c == '\v')) {
    return c;
  }
  c &= 127;
  if (((c) >= 32 && (c) < 127)) {
    return c;
  }
  switch (c) {
  case 16:
    return '[';
  case 17:
    return ']';
  }
  return '.';
}


x86 assembly (clang, -O0):
<Q_charascii>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
cmpl   $0x20,-0x8(%rbp)
je     1143 <Q_charascii+0x43>
cmpl   $0xc,-0x8(%rbp)
je     1143 <Q_charascii+0x43>
cmpl   $0xa,-0x8(%rbp)
je     1143 <Q_charascii+0x43>
cmpl   $0xd,-0x8(%rbp)
je     1143 <Q_charascii+0x43>
cmpl   $0x9,-0x8(%rbp)
je     1143 <Q_charascii+0x43>
cmpl   $0xb,-0x8(%rbp)
jne    114e <Q_charascii+0x4e>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    11ba <Q_charascii+0xba>
mov    -0x8(%rbp),%eax
and    $0x7f,%eax
mov    %eax,-0x8(%rbp)
cmpl   $0x20,-0x8(%rbp)
jl     1176 <Q_charascii+0x76>
cmpl   $0x7f,-0x8(%rbp)
jge    1176 <Q_charascii+0x76>
mov    -0x8(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    11ba <Q_charascii+0xba>
mov    -0x8(%rbp),%eax
mov    %eax,-0xc(%rbp)
sub    $0x10,%eax
je     119b <Q_charascii+0x9b>
jmp    118a <Q_charascii+0x8a>
mov    -0xc(%rbp),%eax
sub    $0x11,%eax
je     11a7 <Q_charascii+0xa7>
jmp    11b3 <Q_charascii+0xb3>
movl   $0x5b,-0x4(%rbp)
jmp    11ba <Q_charascii+0xba>
movl   $0x5d,-0x4(%rbp)
jmp    11ba <Q_charascii+0xba>
movl   $0x2e,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<Q_charascii>:
mov    %edi,%eax
lea    -0x9(%rax),%ecx
cmp    $0x5,%ecx
jae    110b <Q_charascii+0xb>
ret
cmp    $0x20,%eax
je     110a <Q_charascii+0xa>
and    $0x7f,%eax
cmp    $0x20,%eax
jb     111d <Q_charascii+0x1d>
cmp    $0x7f,%eax
jne    110a <Q_charascii+0xa>
cmp    $0x11,%eax
mov    $0x5d,%ecx
mov    $0x2e,%edx
cmove  %ecx,%edx
cmp    $0x10,%eax
mov    $0x5b,%eax
cmovne %edx,%eax
ret

LLVM IR (-O0):
define i32 @Q_charascii(i32 %0) {
%2 = alloca i32
%3 = alloca i32
store i32 %0, i32* %3
%4 = load i32, i32* %3
%5 = icmp eq i32 %4, 32
br i1 %5, label %21, label %6
6: ; preds = %1
%7 = load i32, i32* %3
%8 = icmp eq i32 %7, 12
br i1 %8, label %21, label %9
9: ; preds = %6
%10 = load i32, i32* %3
%11 = icmp eq i32 %10, 10
br i1 %11, label %21, label %12
12: ; preds = %9
%13 = load i32, i32* %3
%14 = icmp eq i32 %13, 13
br i1 %14, label %21, label %15
15: ; preds = %12
%16 = load i32, i32* %3
%17 = icmp eq i32 %16, 9
br i1 %17, label %21, label %18
18: ; preds = %15
%19 = load i32, i32* %3
%20 = icmp eq i32 %19, 11
br i1 %20, label %21, label %23
21: ; preds = %18, %15, %12, %9, %6, %1
%22 = load i32, i32* %3
store i32 %22, i32* %2
br label %38
23: ; preds = %18
%24 = load i32, i32* %3
%25 = and i32 %24, 127
store i32 %25, i32* %3
%26 = load i32, i32* %3
%27 = icmp sge i32 %26, 32
br i1 %27, label %28, label %33
28: ; preds = %23
%29 = load i32, i32* %3
%30 = icmp slt i32 %29, 127
br i1 %30, label %31, label %33
31: ; preds = %28
%32 = load i32, i32* %3
store i32 %32, i32* %2
br label %38
33: ; preds = %28, %23
%34 = load i32, i32* %3
switch i32 %34, label %37 [
i32 16, label %35
i32 17, label %36
]
35: ; preds = %33
store i32 91, i32* %2
br label %38
36: ; preds = %33
store i32 93, i32* %2
br label %38
37: ; preds = %33
store i32 46, i32* %2
br label %38
38: ; preds = %37, %36, %35, %31, %21
%39 = load i32, i32* %2
ret i32 %39
}

LLVM IR (-O2):
define i32 @Q_charascii(i32 %0) {
switch i32 %0, label %2 [
i32 32, label %12
i32 13, label %12
i32 12, label %12
i32 11, label %12
i32 10, label %12
i32 9, label %12
]
2: ; preds = %1
%3 = and i32 %0, 127
%4 = icmp ugt i32 %3, 31
%5 = icmp ne i32 %3, 127
%6 = and i1 %4, %5
br i1 %6, label %12, label %7
7: ; preds = %2
%8 = icmp eq i32 %3, 17
%9 = select i1 %8, i32 93, i32 46
%10 = icmp eq i32 %3, 16
%11 = select i1 %10, i32 91, i32 %9
br label %12
12: ; preds = %7, %2, %1, %1, %1, %1, %1, %1
%13 = phi i32 [ %0, %1 ], [ %0, %1 ], [ %0, %1 ], [ %0, %1 ], [ %0, %1 ], [ %0, %1 ], [ %3, %2 ], [ %11, %7 ]
ret i32 %13
}