wcp(wd, charct, wordct, linect) register char *wd;
long charct;
long wordct;
long linect;
{
  while (*wd)
    switch (*wd++) {
    case 'l':
      ipr(linect);
      break;
    case 'w':
      ipr(wordct);
      break;
    case 'c':
      ipr(charct);
      break;
    }
}


x86 assembly (clang, -O0):
<wcp>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    -0x10(%rbp),%rax
cmpb   $0x0,(%rax)
je     11aa <wcp+0x9a>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x10(%rbp)
movsbl (%rax),%eax
mov    %eax,-0x2c(%rbp)
sub    $0x63,%eax
je     119a <wcp+0x8a>
jmp    1158 <wcp+0x48>
mov    -0x2c(%rbp),%eax
sub    $0x6c,%eax
je     117a <wcp+0x6a>
jmp    1169 <wcp+0x59>
mov    -0x2c(%rbp),%eax
sub    $0x77,%eax
je     118a <wcp+0x7a>
jmp    11a5 <wcp+0x95>
mov    -0x28(%rbp),%rdi
mov    $0x0,%al
call   1030 <ipr@plt>
jmp    11a5 <wcp+0x95>
mov    -0x20(%rbp),%rdi
mov    $0x0,%al
call   1030 <ipr@plt>
jmp    11a5 <wcp+0x95>
mov    -0x18(%rbp),%rdi
mov    $0x0,%al
call   1030 <ipr@plt>
jmp    1128 <wcp+0x18>
mov    -0x4(%rbp),%eax
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<wcp>:
push   %r15
push   %r14
push   %r12
push   %rbx
push   %rax
mov    (%rdi),%al
test   %al,%al
je     115f <wcp+0x4f>
mov    %rcx,%r12
mov    %rdx,%r14
mov    %rsi,%r15
mov    %rdi,%rbx
add    $0x1,%rbx
jmp    1145 <wcp+0x35>
mov    %r15,%rdi
xor    %eax,%eax
call   1030 <ipr@plt>
movzbl (%rbx),%eax
add    $0x1,%rbx
test   %al,%al
je     115f <wcp+0x4f>
movsbl %al,%eax
cmp    $0x63,%eax
je     1130 <wcp+0x20>
mov    %r12,%rdi
cmp    $0x6c,%eax
je     1133 <wcp+0x23>
mov    %r14,%rdi
cmp    $0x77,%eax
je     1133 <wcp+0x23>
jmp    113a <wcp+0x2a>
add    $0x8,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define i32 @wcp(i8* %0, i64 %1, i64 %2, i64 %3) {
%5 = alloca i32
%6 = alloca i8*
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
store i8* %0, i8** %6
store i64 %1, i64* %7
store i64 %2, i64* %8
store i64 %3, i64* %9
br label %10
10: ; preds = %28, %4
%11 = load i8*, i8** %6
%12 = load i8, i8* %11
%13 = icmp ne i8 %12, 0
br i1 %13, label %14, label %29
14: ; preds = %10
%15 = load i8*, i8** %6
%16 = getelementptr inbounds i8, i8* %15, i32 1
store i8* %16, i8** %6
%17 = load i8, i8* %15
%18 = sext i8 %17 to i32
switch i32 %18, label %28 [
i32 108, label %19
i32 119, label %22
i32 99, label %25
]
19: ; preds = %14
%20 = load i64, i64* %9
%21 = call i32 (i64, ...) bitcast (i32 (...)* @ipr to i32 (i64, ...)*)(i64 %20)
br label %28
22: ; preds = %14
%23 = load i64, i64* %8
%24 = call i32 (i64, ...) bitcast (i32 (...)* @ipr to i32 (i64, ...)*)(i64 %23)
br label %28
25: ; preds = %14
%26 = load i64, i64* %7
%27 = call i32 (i64, ...) bitcast (i32 (...)* @ipr to i32 (i64, ...)*)(i64 %26)
br label %28
28: ; preds = %14, %25, %22, %19
br label %10
29: ; preds = %10
%30 = load i32, i32* %5
ret i32 %30
}

LLVM IR (-O2):
define i32 @wcp(i8* nocapture %0, i64 %1, i64 %2, i64 %3) {
%5 = load i8, i8* %0
%6 = icmp eq i8 %5, 0
br i1 %6, label %20, label %7
7: ; preds = %4, %17
%8 = phi i8 [ %18, %17 ], [ %5, %4 ]
%9 = phi i8* [ %10, %17 ], [ %0, %4 ]
%10 = getelementptr inbounds i8, i8* %9, i64 1
%11 = sext i8 %8 to i32
switch i32 %11, label %17 [
i32 108, label %14
i32 119, label %12
i32 99, label %13
]
12: ; preds = %7
br label %14
13: ; preds = %7
br label %14
14: ; preds = %7, %12, %13
%15 = phi i64 [ %1, %13 ], [ %2, %12 ], [ %3, %7 ]
%16 = tail call i32 (i64, ...) bitcast (i32 (...)* @ipr to i32 (i64, ...)*)(i64 %15)
br label %17
17: ; preds = %14, %7
%18 = load i8, i8* %10
%19 = icmp eq i8 %18, 0
br i1 %19, label %20, label %7
20: ; preds = %17, %4
ret i32 undef
}