#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 */
scalar_t__ malloc(int);
unsigned char *float_to_uchar(float *canal, size_t pixeles) {
  int i;
  unsigned char *output =
      (unsigned char *)malloc(sizeof(unsigned char) * pixeles);
  for (i = 0; i < pixeles; i++) {
    output[i] = (int)(canal[i] * 255.0);
  }
  return output;
}


x86 assembly (clang, -O0):
<float_to_uchar>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x10(%rbp),%rax
shl    $0x0,%rax
mov    %eax,%edi
call   1030 <malloc@plt>
mov    %rax,-0x20(%rbp)
movl   $0x0,-0x14(%rbp)
movslq -0x14(%rbp),%rax
cmp    -0x10(%rbp),%rax
jae    1184 <float_to_uchar+0x74>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe9f(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %al,%dl
mov    -0x20(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    113a <float_to_uchar+0x2a>
mov    -0x20(%rbp),%rax
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<float_to_uchar>:
push   %r14
push   %rbx
push   %rax
mov    %rsi,%r14
mov    %rdi,%rbx
mov    %r14d,%edi
call   1030 <malloc@plt>
test   %r14,%r14
je     130c <float_to_uchar+0x1fc>
cmp    $0x4,%r14
jb     114d <float_to_uchar+0x3d>
lea    (%rbx,%r14,4),%rcx
cmp    %rcx,%rax
jae    11c8 <float_to_uchar+0xb8>
mov    %rax,%rcx
add    %r14,%rcx
cmp    %rbx,%rcx
jbe    11c8 <float_to_uchar+0xb8>
xor    %ecx,%ecx
mov    %rcx,%rdx
not    %rdx
test   $0x1,%r14b
je     1178 <float_to_uchar+0x68>
movss  (%rbx,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  0xed4(%rip),%xmm0
cvttsd2si %xmm0,%esi
mov    %sil,(%rax,%rcx,1)
or     $0x1,%rcx
add    %r14,%rdx
je     130c <float_to_uchar+0x1fc>
movsd  0xeb7(%rip),%xmm0
nopl   0x0(%rax)
movss  (%rbx,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm0,%xmm1
cvttsd2si %xmm1,%edx
mov    %dl,(%rax,%rcx,1)
movss  0x4(%rbx,%rcx,4),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm0,%xmm1
cvttsd2si %xmm1,%edx
mov    %dl,0x1(%rax,%rcx,1)
add    $0x2,%rcx
cmp    %rcx,%r14
jne    1190 <float_to_uchar+0x80>
jmp    130c <float_to_uchar+0x1fc>
mov    %r14,%rcx
and    $0xfffffffffffffffc,%rcx
lea    -0x4(%rcx),%rdx
mov    %rdx,%rsi
shr    $0x2,%rsi
add    $0x1,%rsi
test   %rdx,%rdx
je     1314 <float_to_uchar+0x204>
mov    %rsi,%rdi
and    $0xfffffffffffffffe,%rdi
xor    %edx,%edx
movapd 0xe08(%rip),%xmm0
movapd 0xe10(%rip),%xmm1
movapd 0xe18(%rip),%xmm2
movdqa 0xe20(%rip),%xmm3
cvtps2pd 0x8(%rbx,%rdx,4),%xmm4
cvtps2pd (%rbx,%rdx,4),%xmm5
mulpd  %xmm0,%xmm5
mulpd  %xmm0,%xmm4
cvttpd2dq %xmm4,%xmm4
cvttpd2dq %xmm5,%xmm5
andpd  %xmm1,%xmm5
packuswb %xmm5,%xmm5
packuswb %xmm5,%xmm5
andpd  %xmm2,%xmm4
pshuflw $0x84,%xmm4,%xmm4
packuswb %xmm4,%xmm4
movdqa %xmm3,%xmm6
pandn  %xmm4,%xmm6
por    %xmm5,%xmm6
movd   %xmm6,(%rax,%rdx,1)
cvtps2pd 0x18(%rbx,%rdx,4),%xmm4
cvtps2pd 0x10(%rbx,%rdx,4),%xmm5
mulpd  %xmm0,%xmm5
mulpd  %xmm0,%xmm4
cvttpd2dq %xmm4,%xmm4
cvttpd2dq %xmm5,%xmm5
andpd  %xmm1,%xmm5
packuswb %xmm5,%xmm5
packuswb %xmm5,%xmm5
andpd  %xmm2,%xmm4
pshuflw $0x84,%xmm4,%xmm4
packuswb %xmm4,%xmm4
movdqa %xmm3,%xmm6
pandn  %xmm4,%xmm6
por    %xmm5,%xmm6
movd   %xmm6,0x4(%rax,%rdx,1)
add    $0x8,%rdx
add    $0xfffffffffffffffe,%rdi
jne    1210 <float_to_uchar+0x100>
test   $0x1,%sil
je     1303 <float_to_uchar+0x1f3>
cvtps2pd 0x8(%rbx,%rdx,4),%xmm0
cvtps2pd (%rbx,%rdx,4),%xmm1
movapd 0xd43(%rip),%xmm2
mulpd  %xmm2,%xmm1
mulpd  %xmm2,%xmm0
cvttpd2dq %xmm0,%xmm0
cvttpd2dq %xmm1,%xmm1
andpd  0xd3b(%rip),%xmm1
packuswb %xmm1,%xmm1
packuswb %xmm1,%xmm1
pand   0xd3b(%rip),%xmm0
pshuflw $0x84,%xmm0,%xmm0
packuswb %xmm0,%xmm0
movdqa 0xd3a(%rip),%xmm2
pandn  %xmm0,%xmm2
por    %xmm1,%xmm2
movd   %xmm2,(%rax,%rdx,1)
cmp    %r14,%rcx
jne    114f <float_to_uchar+0x3f>
add    $0x8,%rsp
pop    %rbx
pop    %r14
ret
xor    %edx,%edx
test   $0x1,%sil
jne    12ac <float_to_uchar+0x19c>
jmp    1303 <float_to_uchar+0x1f3>

LLVM IR (-O0):
define i8* @float_to_uchar(float* %0, i64 %1) {
%3 = alloca float*
%4 = alloca i64
%5 = alloca i32
%6 = alloca i8*
store float* %0, float** %3
store i64 %1, i64* %4
%7 = load i64, i64* %4
%8 = mul i64 1, %7
%9 = trunc i64 %8 to i32
%10 = call i64 @malloc(i32 %9)
%11 = inttoptr i64 %10 to i8*
store i8* %11, i8** %6
store i32 0, i32* %5
br label %12
12: ; preds = %31, %2
%13 = load i32, i32* %5
%14 = sext i32 %13 to i64
%15 = load i64, i64* %4
%16 = icmp ult i64 %14, %15
br i1 %16, label %17, label %34
17: ; preds = %12
%18 = load float*, float** %3
%19 = load i32, i32* %5
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds float, float* %18, i64 %20
%22 = load float, float* %21
%23 = fpext float %22 to double
%24 = fmul double %23, 2.550000e+02
%25 = fptosi double %24 to i32
%26 = trunc i32 %25 to i8
%27 = load i8*, i8** %6
%28 = load i32, i32* %5
%29 = sext i32 %28 to i64
%30 = getelementptr inbounds i8, i8* %27, i64 %29
store i8 %26, i8* %30
br label %31
31: ; preds = %17
%32 = load i32, i32* %5
%33 = add nsw i32 %32, 1
store i32 %33, i32* %5
br label %12
34: ; preds = %12
%35 = load i8*, i8** %6
ret i8* %35
}

LLVM IR (-O2):
define i8* @float_to_uchar(float* nocapture %0, i64 %1) {
%3 = bitcast float* %0 to i8*
%4 = trunc i64 %1 to i32
%5 = tail call i64 @malloc(i32 %4)
%6 = inttoptr i64 %5 to i8*
%7 = icmp eq i64 %1, 0
br i1 %7, label %103, label %8
8: ; preds = %2
%9 = icmp ult i64 %1, 4
br i1 %9, label %66, label %10
10: ; preds = %8
%11 = getelementptr i8, i8* %6, i64 %1
%12 = getelementptr float, float* %0, i64 %1
%13 = bitcast float* %12 to i8*
%14 = icmp ult i8* %6, %13
%15 = icmp ugt i8* %11, %3
%16 = and i1 %14, %15
br i1 %16, label %66, label %17
17: ; preds = %10
%18 = and i64 %1, -4
%19 = add i64 %18, -4
%20 = lshr exact i64 %19, 2
%21 = add nuw nsw i64 %20, 1
%22 = and i64 %21, 1
%23 = icmp eq i64 %19, 0
br i1 %23, label %51, label %24
24: ; preds = %17
%25 = and i64 %21, 9223372036854775806
br label %26
26: ; preds = %26, %24
%27 = phi i64 [ 0, %24 ], [ %48, %26 ]
%28 = phi i64 [ 0, %24 ], [ %49, %26 ]
%29 = getelementptr inbounds float, float* %0, i64 %27
%30 = bitcast float* %29 to <4 x float>*
%31 = load <4 x float>, <4 x float>* %30
%32 = fpext <4 x float> %31 to <4 x double>
%33 = fmul <4 x double> %32, <double 2.550000e+02, double 2.550000e+02, double 2.550000e+02, double 2.550000e+02>
%34 = fptosi <4 x double> %33 to <4 x i32>
%35 = trunc <4 x i32> %34 to <4 x i8>
%36 = getelementptr inbounds i8, i8* %6, i64 %27
%37 = bitcast i8* %36 to <4 x i8>*
store <4 x i8> %35, <4 x i8>* %37
%38 = or i64 %27, 4
%39 = getelementptr inbounds float, float* %0, i64 %38
%40 = bitcast float* %39 to <4 x float>*
%41 = load <4 x float>, <4 x float>* %40
%42 = fpext <4 x float> %41 to <4 x double>
%43 = fmul <4 x double> %42, <double 2.550000e+02, double 2.550000e+02, double 2.550000e+02, double 2.550000e+02>
%44 = fptosi <4 x double> %43 to <4 x i32>
%45 = trunc <4 x i32> %44 to <4 x i8>
%46 = getelementptr inbounds i8, i8* %6, i64 %38
%47 = bitcast i8* %46 to <4 x i8>*
store <4 x i8> %45, <4 x i8>* %47
%48 = add nuw i64 %27, 8
%49 = add i64 %28, 2
%50 = icmp eq i64 %49, %25
br i1 %50, label %51, label %26
51: ; preds = %26, %17
%52 = phi i64 [ 0, %17 ], [ %48, %26 ]
%53 = icmp eq i64 %22, 0
br i1 %53, label %64, label %54
54: ; preds = %51
%55 = getelementptr inbounds float, float* %0, i64 %52
%56 = bitcast float* %55 to <4 x float>*
%57 = load <4 x float>, <4 x float>* %56
%58 = fpext <4 x float> %57 to <4 x double>
%59 = fmul <4 x double> %58, <double 2.550000e+02, double 2.550000e+02, double 2.550000e+02, double 2.550000e+02>
%60 = fptosi <4 x double> %59 to <4 x i32>
%61 = trunc <4 x i32> %60 to <4 x i8>
%62 = getelementptr inbounds i8, i8* %6, i64 %52
%63 = bitcast i8* %62 to <4 x i8>*
store <4 x i8> %61, <4 x i8>* %63
br label %64
64: ; preds = %51, %54
%65 = icmp eq i64 %18, %1
br i1 %65, label %103, label %66
66: ; preds = %10, %8, %64
%67 = phi i64 [ 0, %10 ], [ 0, %8 ], [ %18, %64 ]
%68 = xor i64 %67, -1
%69 = and i64 %1, 1
%70 = icmp eq i64 %69, 0
br i1 %70, label %80, label %71
71: ; preds = %66
%72 = getelementptr inbounds float, float* %0, i64 %67
%73 = load float, float* %72
%74 = fpext float %73 to double
%75 = fmul double %74, 2.550000e+02
%76 = fptosi double %75 to i32
%77 = trunc i32 %76 to i8
%78 = getelementptr inbounds i8, i8* %6, i64 %67
store i8 %77, i8* %78
%79 = or i64 %67, 1
br label %80
80: ; preds = %71, %66
%81 = phi i64 [ %67, %66 ], [ %79, %71 ]
%82 = sub i64 0, %1
%83 = icmp eq i64 %68, %82
br i1 %83, label %103, label %84
84: ; preds = %80, %84
%85 = phi i64 [ %101, %84 ], [ %81, %80 ]
%86 = getelementptr inbounds float, float* %0, i64 %85
%87 = load float, float* %86
%88 = fpext float %87 to double
%89 = fmul double %88, 2.550000e+02
%90 = fptosi double %89 to i32
%91 = trunc i32 %90 to i8
%92 = getelementptr inbounds i8, i8* %6, i64 %85
store i8 %91, i8* %92
%93 = add nuw nsw i64 %85, 1
%94 = getelementptr inbounds float, float* %0, i64 %93
%95 = load float, float* %94
%96 = fpext float %95 to double
%97 = fmul double %96, 2.550000e+02
%98 = fptosi double %97 to i32
%99 = trunc i32 %98 to i8
%100 = getelementptr inbounds i8, i8* %6, i64 %93
store i8 %99, i8* %100
%101 = add nuw nsw i64 %85, 2
%102 = icmp eq i64 %101, %1
br i1 %102, label %103, label %84
103: ; preds = %80, %84, %64, %2
ret i8* %6
}