#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 */
typedef int uint8_t;
typedef int int32_t;

/* Variables and functions */
void yuv2rgb(uint8_t y, uint8_t u, uint8_t v, uint8_t *r, uint8_t *g,
             uint8_t *b) {
  int32_t y_tmp = (int32_t)y - 16;
  int32_t u_tmp = (int32_t)u - 128;
  int32_t v_tmp = (int32_t)v - 128;
  int32_t r_tmp = 0;
  int32_t g_tmp = 0;
  int32_t b_tmp = 0;
  uint8_t r_val = 0;
  uint8_t g_val = 0;
  uint8_t b_val = 0;
  y_tmp *= 298;
  r_tmp = y_tmp + 0 + v_tmp * 409 + 128;
  g_tmp = y_tmp + u_tmp * (-100) + v_tmp * (-208) + 128;
  b_tmp = y_tmp + u_tmp * 516 + 0 + 128;
  r_tmp >>= 8;
  g_tmp >>= 8;
  b_tmp >>= 8;
  r_val = ((r_tmp < (1 << 8)) ? ((r_tmp >= 0) ? r_tmp : 0) : 0xFF);
  g_val = ((g_tmp < (1 << 8)) ? ((g_tmp >= 0) ? g_tmp : 0) : 0xFF);
  b_val = ((b_tmp < (1 << 8)) ? ((b_tmp >= 0) ? b_tmp : 0) : 0xFF);
  *r = (uint8_t)r_val;
  *g = (uint8_t)g_val;
  *b = (uint8_t)b_val;
  return;
}


x86 assembly (clang, -O0):
<yuv2rgb>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
mov    -0x4(%rbp),%eax
sub    $0x10,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x8(%rbp),%eax
sub    $0x80,%eax
mov    %eax,-0x30(%rbp)
mov    -0xc(%rbp),%eax
sub    $0x80,%eax
mov    %eax,-0x34(%rbp)
movl   $0x0,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
movl   $0x0,-0x48(%rbp)
movl   $0x0,-0x4c(%rbp)
imul   $0x12a,-0x2c(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x0,%eax
imul   $0x199,-0x34(%rbp),%ecx
add    %ecx,%eax
add    $0x80,%eax
mov    %eax,-0x38(%rbp)
mov    -0x2c(%rbp),%eax
imul   $0xffffff9c,-0x30(%rbp),%ecx
add    %ecx,%eax
imul   $0xffffff30,-0x34(%rbp),%ecx
add    %ecx,%eax
add    $0x80,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x2c(%rbp),%eax
imul   $0x204,-0x30(%rbp),%ecx
add    %ecx,%eax
add    $0x0,%eax
add    $0x80,%eax
mov    %eax,-0x40(%rbp)
mov    -0x38(%rbp),%eax
sar    $0x8,%eax
mov    %eax,-0x38(%rbp)
mov    -0x3c(%rbp),%eax
sar    $0x8,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x40(%rbp),%eax
sar    $0x8,%eax
mov    %eax,-0x40(%rbp)
cmpl   $0x100,-0x38(%rbp)
jge    1206 <yuv2rgb+0x106>
cmpl   $0x0,-0x38(%rbp)
jl     11f1 <yuv2rgb+0xf1>
mov    -0x38(%rbp),%eax
mov    %eax,-0x50(%rbp)
jmp    11fb <yuv2rgb+0xfb>
xor    %eax,%eax
mov    %eax,-0x50(%rbp)
jmp    11fb <yuv2rgb+0xfb>
mov    -0x50(%rbp),%eax
mov    %eax,-0x54(%rbp)
jmp    1213 <yuv2rgb+0x113>
mov    $0xff,%eax
mov    %eax,-0x54(%rbp)
jmp    1213 <yuv2rgb+0x113>
mov    -0x54(%rbp),%eax
mov    %eax,-0x44(%rbp)
cmpl   $0x100,-0x3c(%rbp)
jge    1250 <yuv2rgb+0x150>
cmpl   $0x0,-0x3c(%rbp)
jl     123b <yuv2rgb+0x13b>
mov    -0x3c(%rbp),%eax
mov    %eax,-0x58(%rbp)
jmp    1245 <yuv2rgb+0x145>
xor    %eax,%eax
mov    %eax,-0x58(%rbp)
jmp    1245 <yuv2rgb+0x145>
mov    -0x58(%rbp),%eax
mov    %eax,-0x5c(%rbp)
jmp    125d <yuv2rgb+0x15d>
mov    $0xff,%eax
mov    %eax,-0x5c(%rbp)
jmp    125d <yuv2rgb+0x15d>
mov    -0x5c(%rbp),%eax
mov    %eax,-0x48(%rbp)
cmpl   $0x100,-0x40(%rbp)
jge    129a <yuv2rgb+0x19a>
cmpl   $0x0,-0x40(%rbp)
jl     1285 <yuv2rgb+0x185>
mov    -0x40(%rbp),%eax
mov    %eax,-0x60(%rbp)
jmp    128f <yuv2rgb+0x18f>
xor    %eax,%eax
mov    %eax,-0x60(%rbp)
jmp    128f <yuv2rgb+0x18f>
mov    -0x60(%rbp),%eax
mov    %eax,-0x64(%rbp)
jmp    12a7 <yuv2rgb+0x1a7>
mov    $0xff,%eax
mov    %eax,-0x64(%rbp)
jmp    12a7 <yuv2rgb+0x1a7>
mov    -0x64(%rbp),%eax
mov    %eax,-0x4c(%rbp)
mov    -0x44(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x48(%rbp),%ecx
mov    -0x20(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x4c(%rbp),%ecx
mov    -0x28(%rbp),%rax
mov    %ecx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<yuv2rgb>:
push   %r14
push   %rbx
lea    -0x80(%rsi),%r10d
add    $0xffffff80,%edx
imul   $0x12a,%edi,%r14d
imul   $0x199,%edx,%eax
lea    (%rax,%r14,1),%r11d
add    $0xffffed60,%r11d
add    %r14d,%eax
add    $0xffffede0,%eax
imul   $0xffffff9c,%r10d,%ebx
add    %r14d,%ebx
add    $0xffffed60,%ebx
imul   $0xffffff30,%edx,%edi
lea    (%rdi,%rbx,1),%edx
add    $0x80,%edx
add    %edi,%ebx
shl    $0x9,%r10d
lea    (%r10,%rsi,4),%esi
add    $0xfffffe00,%esi
lea    (%r14,%rsi,1),%edi
add    $0xffffede0,%edi
sar    $0x8,%eax
sar    $0x8,%edx
sar    $0x8,%edi
xor    %r10d,%r10d
cmp    $0xffffff80,%r11d
cmovl  %r10d,%eax
cmp    $0xff80,%r11d
mov    $0xff,%r11d
cmovge %r11d,%eax
cmp    $0xffffff80,%ebx
cmovl  %r10d,%edx
cmp    $0xff80,%ebx
cmovge %r11d,%edx
add    %r14d,%esi
add    $0xffffed60,%esi
cmp    $0xffffff80,%esi
cmovl  %r10d,%edi
cmp    $0xff80,%esi
cmovge %r11d,%edi
mov    %eax,(%rcx)
mov    %edx,(%r8)
mov    %edi,(%r9)
pop    %rbx
pop    %r14
ret

LLVM IR (-O0):
define void @yuv2rgb(i32 %0, i32 %1, i32 %2, i32* %3, i32* %4, i32* %5) {
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32*
%11 = alloca i32*
%12 = alloca i32*
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
store i32 %0, i32* %7
store i32 %1, i32* %8
store i32 %2, i32* %9
store i32* %3, i32** %10
store i32* %4, i32** %11
store i32* %5, i32** %12
%22 = load i32, i32* %7
%23 = sub nsw i32 %22, 16
store i32 %23, i32* %13
%24 = load i32, i32* %8
%25 = sub nsw i32 %24, 128
store i32 %25, i32* %14
%26 = load i32, i32* %9
%27 = sub nsw i32 %26, 128
store i32 %27, i32* %15
store i32 0, i32* %16
store i32 0, i32* %17
store i32 0, i32* %18
store i32 0, i32* %19
store i32 0, i32* %20
store i32 0, i32* %21
%28 = load i32, i32* %13
%29 = mul nsw i32 %28, 298
store i32 %29, i32* %13
%30 = load i32, i32* %13
%31 = add nsw i32 %30, 0
%32 = load i32, i32* %15
%33 = mul nsw i32 %32, 409
%34 = add nsw i32 %31, %33
%35 = add nsw i32 %34, 128
store i32 %35, i32* %16
%36 = load i32, i32* %13
%37 = load i32, i32* %14
%38 = mul nsw i32 %37, -100
%39 = add nsw i32 %36, %38
%40 = load i32, i32* %15
%41 = mul nsw i32 %40, -208
%42 = add nsw i32 %39, %41
%43 = add nsw i32 %42, 128
store i32 %43, i32* %17
%44 = load i32, i32* %13
%45 = load i32, i32* %14
%46 = mul nsw i32 %45, 516
%47 = add nsw i32 %44, %46
%48 = add nsw i32 %47, 0
%49 = add nsw i32 %48, 128
store i32 %49, i32* %18
%50 = load i32, i32* %16
%51 = ashr i32 %50, 8
store i32 %51, i32* %16
%52 = load i32, i32* %17
%53 = ashr i32 %52, 8
store i32 %53, i32* %17
%54 = load i32, i32* %18
%55 = ashr i32 %54, 8
store i32 %55, i32* %18
%56 = load i32, i32* %16
%57 = icmp slt i32 %56, 256
br i1 %57, label %58, label %66
58: ; preds = %6
%59 = load i32, i32* %16
%60 = icmp sge i32 %59, 0
br i1 %60, label %61, label %63
61: ; preds = %58
%62 = load i32, i32* %16
br label %64
63: ; preds = %58
br label %64
64: ; preds = %63, %61
%65 = phi i32 [ %62, %61 ], [ 0, %63 ]
br label %67
66: ; preds = %6
br label %67
67: ; preds = %66, %64
%68 = phi i32 [ %65, %64 ], [ 255, %66 ]
store i32 %68, i32* %19
%69 = load i32, i32* %17
%70 = icmp slt i32 %69, 256
br i1 %70, label %71, label %79
71: ; preds = %67
%72 = load i32, i32* %17
%73 = icmp sge i32 %72, 0
br i1 %73, label %74, label %76
74: ; preds = %71
%75 = load i32, i32* %17
br label %77
76: ; preds = %71
br label %77
77: ; preds = %76, %74
%78 = phi i32 [ %75, %74 ], [ 0, %76 ]
br label %80
79: ; preds = %67
br label %80
80: ; preds = %79, %77
%81 = phi i32 [ %78, %77 ], [ 255, %79 ]
store i32 %81, i32* %20
%82 = load i32, i32* %18
%83 = icmp slt i32 %82, 256
br i1 %83, label %84, label %92
84: ; preds = %80
%85 = load i32, i32* %18
%86 = icmp sge i32 %85, 0
br i1 %86, label %87, label %89
87: ; preds = %84
%88 = load i32, i32* %18
br label %90
89: ; preds = %84
br label %90
90: ; preds = %89, %87
%91 = phi i32 [ %88, %87 ], [ 0, %89 ]
br label %93
92: ; preds = %80
br label %93
93: ; preds = %92, %90
%94 = phi i32 [ %91, %90 ], [ 255, %92 ]
store i32 %94, i32* %21
%95 = load i32, i32* %19
%96 = load i32*, i32** %10
store i32 %95, i32* %96
%97 = load i32, i32* %20
%98 = load i32*, i32** %11
store i32 %97, i32* %98
%99 = load i32, i32* %21
%100 = load i32*, i32** %12
store i32 %99, i32* %100
ret void
}

LLVM IR (-O2):
define void @yuv2rgb(i32 %0, i32 %1, i32 %2, i32* nocapture writeonly %3, i32* nocapture writeonly %4, i32* nocapture writeonly %5) {
%7 = add nsw i32 %1, -128
%8 = add nsw i32 %2, -128
%9 = mul i32 %0, 298
%10 = add i32 %9, -4768
%11 = mul nsw i32 %8, 409
%12 = add nsw i32 %11, %10
%13 = add nsw i32 %12, 128
%14 = mul nsw i32 %7, -100
%15 = add nsw i32 %14, %10
%16 = mul nsw i32 %8, -208
%17 = add nsw i32 %15, %16
%18 = add nsw i32 %17, 128
%19 = mul nsw i32 %7, 516
%20 = add nsw i32 %19, %10
%21 = add nsw i32 %20, 128
%22 = ashr i32 %13, 8
%23 = ashr i32 %18, 8
%24 = ashr i32 %21, 8
%25 = icmp slt i32 %12, 65408
%26 = icmp sgt i32 %12, -129
%27 = select i1 %26, i32 %22, i32 0
%28 = select i1 %25, i32 %27, i32 255
%29 = icmp slt i32 %17, 65408
%30 = icmp sgt i32 %17, -129
%31 = select i1 %30, i32 %23, i32 0
%32 = select i1 %29, i32 %31, i32 255
%33 = icmp slt i32 %20, 65408
%34 = icmp sgt i32 %20, -129
%35 = select i1 %34, i32 %24, i32 0
%36 = select i1 %33, i32 %35, i32 255
store i32 %28, i32* %3
store i32 %32, i32* %4
store i32 %36, i32* %5
ret void
}