_Complex char va_complex_char(__builtin_va_list l) {
  return __builtin_va_arg(l, _Complex char);
}


x86 assembly (clang, -O0):
<va_complex_char>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    (%rax),%eax
mov    %eax,-0x14(%rbp)
cmp    $0x28,%eax
ja     113a <va_complex_char+0x3a>
mov    -0x20(%rbp),%rcx
mov    -0x14(%rbp),%edx
movslq %edx,%rax
add    0x10(%rcx),%rax
add    $0x8,%edx
mov    %edx,(%rcx)
mov    %rax,-0x28(%rbp)
jmp    1151 <va_complex_char+0x51>
mov    -0x20(%rbp),%rcx
mov    0x8(%rcx),%rdx
mov    %rdx,%rax
add    $0x8,%rdx
mov    %rdx,0x8(%rcx)
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%cl
mov    0x1(%rax),%al
mov    %cl,-0x8(%rbp)
mov    %al,-0x7(%rbp)
mov    -0x8(%rbp),%ax
pop    %rbp
ret

x86 assembly (clang, -O2):
<va_complex_char>:
mov    (%rdi),%ecx
cmp    $0x28,%rcx
ja     1118 <va_complex_char+0x18>
mov    %rcx,%rax
add    0x10(%rdi),%rax
add    $0x8,%ecx
mov    %ecx,(%rdi)
movzwl (%rax),%eax
ret
mov    0x8(%rdi),%rax
lea    0x8(%rax),%rcx
mov    %rcx,0x8(%rdi)
movzwl (%rax),%eax
ret

LLVM IR (-O0):
%struct.__va_list_tag = type { i32, i32, i8*, i8* }
define i16 @va_complex_char(%struct.__va_list_tag* %0) {
%2 = alloca { i8, i8 }
%3 = alloca %struct.__va_list_tag*
store %struct.__va_list_tag* %0, %struct.__va_list_tag** %3
%4 = load %struct.__va_list_tag*, %struct.__va_list_tag** %3
%5 = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %4, i32 0, i32 0
%6 = load i32, i32* %5
%7 = icmp ule i32 %6, 40
br i1 %7, label %8, label %14
8: ; preds = %1
%9 = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %4, i32 0, i32 3
%10 = load i8*, i8** %9
%11 = getelementptr i8, i8* %10, i32 %6
%12 = bitcast i8* %11 to { i8, i8 }*
%13 = add i32 %6, 8
store i32 %13, i32* %5
br label %19
14: ; preds = %1
%15 = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %4, i32 0, i32 2
%16 = load i8*, i8** %15
%17 = bitcast i8* %16 to { i8, i8 }*
%18 = getelementptr i8, i8* %16, i32 8
store i8* %18, i8** %15
br label %19
19: ; preds = %14, %8
%20 = phi { i8, i8 }* [ %12, %8 ], [ %17, %14 ]
%21 = getelementptr inbounds { i8, i8 }, { i8, i8 }* %20, i32 0, i32 0
%22 = load i8, i8* %21
%23 = getelementptr inbounds { i8, i8 }, { i8, i8 }* %20, i32 0, i32 1
%24 = load i8, i8* %23
%25 = getelementptr inbounds { i8, i8 }, { i8, i8 }* %2, i32 0, i32 0
%26 = getelementptr inbounds { i8, i8 }, { i8, i8 }* %2, i32 0, i32 1
store i8 %22, i8* %25
store i8 %24, i8* %26
%27 = bitcast { i8, i8 }* %2 to i16*
%28 = load i16, i16* %27
ret i16 %28
}

LLVM IR (-O2):
%struct.__va_list_tag = type { i32, i32, i8*, i8* }
define i16 @va_complex_char(%struct.__va_list_tag* nocapture %0) {
%2 = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %0, i64 0, i32 0
%3 = load i32, i32* %2
%4 = icmp ult i32 %3, 41
br i1 %4, label %5, label %11
5: ; preds = %1
%6 = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %0, i64 0, i32 3
%7 = load i8*, i8** %6
%8 = zext i32 %3 to i64
%9 = getelementptr i8, i8* %7, i64 %8
%10 = add nuw nsw i32 %3, 8
store i32 %10, i32* %2
br label %15
11: ; preds = %1
%12 = getelementptr inbounds %struct.__va_list_tag, %struct.__va_list_tag* %0, i64 0, i32 2
%13 = load i8*, i8** %12
%14 = getelementptr i8, i8* %13, i64 8
store i8* %14, i8** %12
br label %15
15: ; preds = %11, %5
%16 = phi i8* [ %9, %5 ], [ %13, %11 ]
%17 = load i8, i8* %16
%18 = getelementptr inbounds i8, i8* %16, i64 1
%19 = load i8, i8* %18
%20 = zext i8 %19 to i16
%21 = shl nuw i16 %20, 8
%22 = zext i8 %17 to i16
%23 = or i16 %21, %22
ret i16 %23
}