#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 */

/* Variables and functions */
int /*<<< orphan*/ write(int, char *, size_t);
size_t ft_wputchar(int c) {
  char wc[4];
  size_t flag;
  flag = 0;
  wc[3] = (c >= 0x000000FF && ++flag) ? (128 + c % 64) : c;
  if (flag == 1) {
    c = c >> 6;
    wc[2] = (c >= 0x00000040 && ++flag) ? ((128 + c % 64)) : (192 + c % 32);
  }
  if (flag == 2) {
    c = c >> 6;
    wc[1] = (c >= 0x00000010 && ++flag) ? ((128 + c % 64)) : (224 + c);
  }
  if (flag == 3) {
    c = c >> 6;
    wc[0] = (240 + c);
  }
  write(1, &wc[3 - flag], flag + 1);
  return (flag + 1);
}


x86 assembly (clang, -O0):
<ft_wputchar>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x4(%rbp)
movq   $0x0,-0x10(%rbp)
cmpl   $0xff,-0x4(%rbp)
jl     1160 <ft_wputchar+0x50>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
cmp    $0x0,%rax
je     1160 <ft_wputchar+0x50>
mov    -0x4(%rbp),%eax
mov    $0x40,%ecx
cltd
idiv   %ecx
mov    %edx,%eax
add    $0x80,%eax
mov    %eax,-0x14(%rbp)
jmp    1166 <ft_wputchar+0x56>
mov    -0x4(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %al,-0x5(%rbp)
cmpq   $0x1,-0x10(%rbp)
jne    11d5 <ft_wputchar+0xc5>
mov    -0x4(%rbp),%eax
sar    $0x6,%eax
mov    %eax,-0x4(%rbp)
cmpl   $0x40,-0x4(%rbp)
jl     11ba <ft_wputchar+0xaa>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
cmp    $0x0,%rax
je     11ba <ft_wputchar+0xaa>
mov    -0x4(%rbp),%eax
mov    $0x40,%ecx
cltd
idiv   %ecx
mov    %edx,%eax
add    $0x80,%eax
mov    %eax,-0x18(%rbp)
jmp    11cf <ft_wputchar+0xbf>
mov    -0x4(%rbp),%eax
mov    $0x20,%ecx
cltd
idiv   %ecx
mov    %edx,%eax
add    $0xc0,%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%eax
mov    %al,-0x6(%rbp)
cmpq   $0x2,-0x10(%rbp)
jne    1234 <ft_wputchar+0x124>
mov    -0x4(%rbp),%eax
sar    $0x6,%eax
mov    %eax,-0x4(%rbp)
cmpl   $0x10,-0x4(%rbp)
jl     1223 <ft_wputchar+0x113>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x10(%rbp)
cmp    $0x0,%rax
je     1223 <ft_wputchar+0x113>
mov    -0x4(%rbp),%eax
mov    $0x40,%ecx
cltd
idiv   %ecx
mov    %edx,%eax
add    $0x80,%eax
mov    %eax,-0x1c(%rbp)
jmp    122e <ft_wputchar+0x11e>
mov    -0x4(%rbp),%eax
add    $0xe0,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
mov    %al,-0x7(%rbp)
cmpq   $0x3,-0x10(%rbp)
jne    1253 <ft_wputchar+0x143>
mov    -0x4(%rbp),%eax
sar    $0x6,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
add    $0xf0,%eax
mov    %al,-0x8(%rbp)
mov    $0x3,%eax
sub    -0x10(%rbp),%rax
lea    -0x8(%rbp),%rsi
add    %rax,%rsi
mov    -0x10(%rbp),%rdx
add    $0x1,%rdx
mov    $0x1,%edi
call   1030 <write@plt>
mov    -0x10(%rbp),%rax
add    $0x1,%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<ft_wputchar>:
push   %rbx
sub    $0x10,%rsp
cmp    $0xff,%edi
jl     1164 <ft_wputchar+0x54>
mov    %edi,%eax
and    $0x3f,%al
or     $0x80,%al
mov    %al,0xf(%rsp)
mov    %edi,%eax
shr    $0x6,%eax
cmp    $0xfff,%edi
jbe    116d <ft_wputchar+0x5d>
and    $0x3f,%al
or     $0x80,%al
mov    %al,0xe(%rsp)
mov    %edi,%eax
shr    $0xc,%eax
cmp    $0xffff,%edi
jbe    117c <ft_wputchar+0x6c>
and    $0x3f,%al
or     $0x80,%al
mov    %al,0xd(%rsp)
shr    $0x12,%edi
add    $0xf0,%dil
mov    %dil,0xc(%rsp)
mov    $0x3,%ebx
jmp    1187 <ft_wputchar+0x77>
mov    %dil,0xf(%rsp)
xor    %ebx,%ebx
jmp    1187 <ft_wputchar+0x77>
and    $0x1f,%al
or     $0xc0,%al
mov    %al,0xe(%rsp)
mov    $0x1,%ebx
jmp    1187 <ft_wputchar+0x77>
add    $0xe0,%al
mov    %al,0xd(%rsp)
mov    $0x2,%ebx
mov    %rbx,%rax
xor    $0x3,%rax
lea    (%rsp,%rax,1),%rsi
add    $0xc,%rsi
add    $0x1,%rbx
mov    $0x1,%edi
mov    %rbx,%rdx
call   1030 <write@plt>
mov    %rbx,%rax
add    $0x10,%rsp
pop    %rbx
ret

LLVM IR (-O0):
define i64 @ft_wputchar(i32 %0) {
%2 = alloca i32
%3 = alloca [4 x i8]
%4 = alloca i64
store i32 %0, i32* %2
store i64 0, i64* %4
%5 = load i32, i32* %2
%6 = icmp sge i32 %5, 255
br i1 %6, label %7, label %15
7: ; preds = %1
%8 = load i64, i64* %4
%9 = add i64 %8, 1
store i64 %9, i64* %4
%10 = icmp ne i64 %9, 0
br i1 %10, label %11, label %15
11: ; preds = %7
%12 = load i32, i32* %2
%13 = srem i32 %12, 64
%14 = add nsw i32 128, %13
br label %17
15: ; preds = %7, %1
%16 = load i32, i32* %2
br label %17
17: ; preds = %15, %11
%18 = phi i32 [ %14, %11 ], [ %16, %15 ]
%19 = trunc i32 %18 to i8
%20 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 3
store i8 %19, i8* %20
%21 = load i64, i64* %4
%22 = icmp eq i64 %21, 1
br i1 %22, label %23, label %44
23: ; preds = %17
%24 = load i32, i32* %2
%25 = ashr i32 %24, 6
store i32 %25, i32* %2
%26 = load i32, i32* %2
%27 = icmp sge i32 %26, 64
br i1 %27, label %28, label %36
28: ; preds = %23
%29 = load i64, i64* %4
%30 = add i64 %29, 1
store i64 %30, i64* %4
%31 = icmp ne i64 %30, 0
br i1 %31, label %32, label %36
32: ; preds = %28
%33 = load i32, i32* %2
%34 = srem i32 %33, 64
%35 = add nsw i32 128, %34
br label %40
36: ; preds = %28, %23
%37 = load i32, i32* %2
%38 = srem i32 %37, 32
%39 = add nsw i32 192, %38
br label %40
40: ; preds = %36, %32
%41 = phi i32 [ %35, %32 ], [ %39, %36 ]
%42 = trunc i32 %41 to i8
%43 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 2
store i8 %42, i8* %43
br label %44
44: ; preds = %40, %17
%45 = load i64, i64* %4
%46 = icmp eq i64 %45, 2
br i1 %46, label %47, label %67
47: ; preds = %44
%48 = load i32, i32* %2
%49 = ashr i32 %48, 6
store i32 %49, i32* %2
%50 = load i32, i32* %2
%51 = icmp sge i32 %50, 16
br i1 %51, label %52, label %60
52: ; preds = %47
%53 = load i64, i64* %4
%54 = add i64 %53, 1
store i64 %54, i64* %4
%55 = icmp ne i64 %54, 0
br i1 %55, label %56, label %60
56: ; preds = %52
%57 = load i32, i32* %2
%58 = srem i32 %57, 64
%59 = add nsw i32 128, %58
br label %63
60: ; preds = %52, %47
%61 = load i32, i32* %2
%62 = add nsw i32 224, %61
br label %63
63: ; preds = %60, %56
%64 = phi i32 [ %59, %56 ], [ %62, %60 ]
%65 = trunc i32 %64 to i8
%66 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 1
store i8 %65, i8* %66
br label %67
67: ; preds = %63, %44
%68 = load i64, i64* %4
%69 = icmp eq i64 %68, 3
br i1 %69, label %70, label %77
70: ; preds = %67
%71 = load i32, i32* %2
%72 = ashr i32 %71, 6
store i32 %72, i32* %2
%73 = load i32, i32* %2
%74 = add nsw i32 240, %73
%75 = trunc i32 %74 to i8
%76 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 0
store i8 %75, i8* %76
br label %77
77: ; preds = %70, %67
%78 = load i64, i64* %4
%79 = sub i64 3, %78
%80 = getelementptr inbounds [4 x i8], [4 x i8]* %3, i64 0, i64 %79
%81 = load i64, i64* %4
%82 = add i64 %81, 1
%83 = call i32 @write(i32 1, i8* %80, i64 %82)
%84 = load i64, i64* %4
%85 = add i64 %84, 1
ret i64 %85
}

LLVM IR (-O2):
define i64 @ft_wputchar(i32 %0) {
%2 = alloca [4 x i8]
%3 = getelementptr inbounds [4 x i8], [4 x i8]* %2, i64 0, i64 0
%4 = icmp sgt i32 %0, 254
%5 = trunc i32 %0 to i8
br i1 %4, label %6, label %13
6: ; preds = %1
%7 = and i8 %5, 63
%8 = or i8 %7, -128
%9 = getelementptr inbounds [4 x i8], [4 x i8]* %2, i64 0, i64 3
store i8 %8, i8* %9
%10 = lshr i32 %0, 6
%11 = icmp ugt i32 %0, 4095
%12 = trunc i32 %10 to i8
br i1 %11, label %19, label %15
13: ; preds = %1
%14 = getelementptr inbounds [4 x i8], [4 x i8]* %2, i64 0, i64 3
store i8 %5, i8* %14
br label %36
15: ; preds = %6
%16 = and i8 %12, 31
%17 = or i8 %16, -64
%18 = getelementptr inbounds [4 x i8], [4 x i8]* %2, i64 0, i64 2
store i8 %17, i8* %18
br label %36
19: ; preds = %6
%20 = and i8 %12, 63
%21 = or i8 %20, -128
%22 = getelementptr inbounds [4 x i8], [4 x i8]* %2, i64 0, i64 2
store i8 %21, i8* %22
%23 = lshr i32 %0, 12
%24 = icmp ugt i32 %0, 65535
%25 = trunc i32 %23 to i8
br i1 %24, label %29, label %26
26: ; preds = %19
%27 = add i8 %25, -32
%28 = getelementptr inbounds [4 x i8], [4 x i8]* %2, i64 0, i64 1
store i8 %27, i8* %28
br label %36
29: ; preds = %19
%30 = and i8 %25, 63
%31 = or i8 %30, -128
%32 = getelementptr inbounds [4 x i8], [4 x i8]* %2, i64 0, i64 1
store i8 %31, i8* %32
%33 = lshr i32 %0, 18
%34 = trunc i32 %33 to i8
%35 = add i8 %34, -16
store i8 %35, i8* %3
br label %36
36: ; preds = %13, %15, %26, %29
%37 = phi i64 [ 3, %29 ], [ 2, %26 ], [ 0, %13 ], [ 1, %15 ]
%38 = xor i64 %37, 3
%39 = getelementptr inbounds [4 x i8], [4 x i8]* %2, i64 0, i64 %38
%40 = add nuw nsw i64 %37, 1
%41 = call i32 @write(i32 1, i8* %39, i64 %40)
ret i64 %40
}