float *image_crop_rgb96f(signed int xres, signed int yres, float *fimg,
                         signed int szx, signed int szy, signed int sx,
                         signed int sy) {
  float *cropped;
  signed int x;
  signed int y;
  void *return_value_malloc$1;
  return_value_malloc$1 = malloc((unsigned long int)(szx * szy * 3) * 4ul);
  cropped = (float *)return_value_malloc$1;
  memset((void *)cropped, 0, (unsigned long int)(szx * szy * 3) * 4ul);
  y = 0;
  while (!(y >= szy)) {
    signed int oaddr = ((y + sy) * xres + sx) * 3;
    if (y + sy >= 0) {
      if (!(y + sy >= yres)) {
        x = 0;
        while (!(x >= szx)) {
          if (x + sx >= 0) {
            if (!(x + sx >= xres)) {
              signed int addr = (szx * y + x) * 3;
              cropped[(signed long int)addr] =
                  fimg[(signed long int)(oaddr + x * 3)];
              cropped[(signed long int)(addr + 1)] =
                  fimg[(signed long int)(oaddr + x * 3 + 1)];
              cropped[(signed long int)(addr + 2)] =
                  fimg[(signed long int)(oaddr + x * 3 + 2)];
            }
          }
          x = x + 1;
        }
      }
    }
    y = y + 1;
  }
  return cropped;
}


x86 assembly (clang, -O0):
<image_crop_rgb96f>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    0x10(%rbp),%eax
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    %r9d,-0x1c(%rbp)
mov    -0x14(%rbp),%eax
imul   -0x18(%rbp),%eax
imul   $0x3,%eax,%eax
movslq %eax,%rdi
shl    $0x2,%rdi
call   1040 <malloc@plt>
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rdi
mov    -0x14(%rbp),%eax
imul   -0x18(%rbp),%eax
imul   $0x3,%eax,%eax
movslq %eax,%rdx
shl    $0x2,%rdx
xor    %esi,%esi
call   1030 <memset@plt>
movl   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x18(%rbp),%eax
setge  %al
xor    $0xff,%al
test   $0x1,%al
jne    119d <image_crop_rgb96f+0x7d>
jmp    12bc <image_crop_rgb96f+0x19c>
mov    -0x30(%rbp),%eax
add    0x10(%rbp),%eax
imul   -0x4(%rbp),%eax
add    -0x1c(%rbp),%eax
imul   $0x3,%eax,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x30(%rbp),%eax
add    0x10(%rbp),%eax
cmp    $0x0,%eax
jl     12ae <image_crop_rgb96f+0x18e>
mov    -0x30(%rbp),%eax
add    0x10(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    12a9 <image_crop_rgb96f+0x189>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0x14(%rbp),%eax
setge  %al
xor    $0xff,%al
test   $0x1,%al
jne    11ed <image_crop_rgb96f+0xcd>
jmp    12a4 <image_crop_rgb96f+0x184>
mov    -0x2c(%rbp),%eax
add    -0x1c(%rbp),%eax
cmp    $0x0,%eax
jl     1296 <image_crop_rgb96f+0x176>
mov    -0x2c(%rbp),%eax
add    -0x1c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    1291 <image_crop_rgb96f+0x171>
mov    -0x14(%rbp),%eax
imul   -0x30(%rbp),%eax
add    -0x2c(%rbp),%eax
imul   $0x3,%eax,%eax
mov    %eax,-0x40(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
imul   $0x3,-0x2c(%rbp),%edx
add    %edx,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x40(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
imul   $0x3,-0x2c(%rbp),%edx
add    %edx,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x10(%rbp),%rax
mov    -0x3c(%rbp),%ecx
imul   $0x3,-0x2c(%rbp),%edx
add    %edx,%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%ecx
add    $0x2,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    1296 <image_crop_rgb96f+0x176>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    11d5 <image_crop_rgb96f+0xb5>
jmp    12a9 <image_crop_rgb96f+0x189>
jmp    12ae <image_crop_rgb96f+0x18e>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
jmp    1185 <image_crop_rgb96f+0x65>
mov    -0x28(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<image_crop_rgb96f>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x28,%rsp
mov    %r9d,%r12d
mov    %r8d,%r14d
mov    %rdx,%rbx
mov    %esi,%ebp
mov    %edi,%r13d
mov    %ecx,0xc(%rsp)
mov    %ecx,%eax
imul   %r8d,%eax
lea    (%rax,%rax,2),%eax
movslq %eax,%rsi
shl    $0x2,%rsi
mov    $0x1,%edi
call   1030 <calloc@plt>
mov    %rax,0x10(%rsp)
test   %r14d,%r14d
jle    122c <image_crop_rgb96f+0x11c>
mov    0x60(%rsp),%ecx
movslq %r12d,%rax
movslq %r13d,%r9
movslq 0xc(%rsp),%rsi
movslq %ecx,%r11
movslq %ebp,%rcx
mov    %rcx,0x20(%rsp)
mov    %r14d,%r10d
mov    %esi,%edi
mov    0x10(%rsp),%rbp
add    $0x8,%rbp
shl    $0x2,%rsi
lea    (%rsi,%rsi,2),%r14
mov    %r11d,%ecx
imul   %r9d,%ecx
lea    (%rcx,%rcx,2),%esi
mov    %rax,0x18(%rsp)
lea    (%rax,%rax,2),%ecx
add    %esi,%ecx
lea    (%r9,%r9,2),%r12d
lea    (%rdi,%rdi,2),%rdi
xor    %r13d,%r13d
jmp    11bf <image_crop_rgb96f+0xaf>
nopl   0x0(%rax)
add    $0x1,%r13
add    %r14,%rbp
add    %r12,%rcx
cmp    %r10,%r13
je     122c <image_crop_rgb96f+0x11c>
mov    %r13,%rsi
add    %r11,%rsi
js     11b0 <image_crop_rgb96f+0xa0>
cmp    0x20(%rsp),%rsi
jge    11b0 <image_crop_rgb96f+0xa0>
cmpl   $0x0,0xc(%rsp)
jle    11b0 <image_crop_rgb96f+0xa0>
xor    %esi,%esi
mov    0x18(%rsp),%r8
jmp    11ed <image_crop_rgb96f+0xdd>
xchg   %ax,%ax
add    $0x1,%r8
add    $0x3,%rsi
cmp    %rsi,%rdi
je     11b0 <image_crop_rgb96f+0xa0>
test   %r8,%r8
js     11e0 <image_crop_rgb96f+0xd0>
cmp    %r9,%r8
jge    11e0 <image_crop_rgb96f+0xd0>
lea    (%rcx,%rsi,1),%rax
cltq
movss  (%rbx,%rax,4),%xmm0
movss  %xmm0,-0x8(%rbp,%rsi,4)
lea    0x1(%rax),%r15d
movslq %r15d,%rdx
movss  (%rbx,%rdx,4),%xmm0
movss  %xmm0,-0x4(%rbp,%rsi,4)
add    $0x2,%eax
cltq
movss  (%rbx,%rax,4),%xmm0
movss  %xmm0,0x0(%rbp,%rsi,4)
jmp    11e0 <image_crop_rgb96f+0xd0>
mov    0x10(%rsp),%rax
add    $0x28,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define float* @image_crop_rgb96f(i32 %0, i32 %1, float* %2, i32 %3, i32 %4, i32 %5, i32 %6) {
%8 = alloca i32
%9 = alloca i32
%10 = alloca float*
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca i32
%15 = alloca float*
%16 = alloca i32
%17 = alloca i32
%18 = alloca i8*
%19 = alloca i32
%20 = alloca i32
store i32 %0, i32* %8
store i32 %1, i32* %9
store float* %2, float** %10
store i32 %3, i32* %11
store i32 %4, i32* %12
store i32 %5, i32* %13
store i32 %6, i32* %14
%21 = load i32, i32* %11
%22 = load i32, i32* %12
%23 = mul nsw i32 %21, %22
%24 = mul nsw i32 %23, 3
%25 = sext i32 %24 to i64
%26 = mul i64 %25, 4
%27 = call i8* @malloc(i64 %26)
store i8* %27, i8** %18
%28 = load i8*, i8** %18
%29 = bitcast i8* %28 to float*
store float* %29, float** %15
%30 = load float*, float** %15
%31 = bitcast float* %30 to i8*
%32 = load i32, i32* %11
%33 = load i32, i32* %12
%34 = mul nsw i32 %32, %33
%35 = mul nsw i32 %34, 3
%36 = sext i32 %35 to i64
%37 = mul i64 %36, 4
store i32 0, i32* %17
br label %38
38: ; preds = %132, %7
%39 = load i32, i32* %17
%40 = load i32, i32* %12
%41 = icmp sge i32 %39, %40
%42 = xor i1 %41, true
br i1 %42, label %43, label %135
43: ; preds = %38
%44 = load i32, i32* %17
%45 = load i32, i32* %14
%46 = add nsw i32 %44, %45
%47 = load i32, i32* %8
%48 = mul nsw i32 %46, %47
%49 = load i32, i32* %13
%50 = add nsw i32 %48, %49
%51 = mul nsw i32 %50, 3
store i32 %51, i32* %19
%52 = load i32, i32* %17
%53 = load i32, i32* %14
%54 = add nsw i32 %52, %53
%55 = icmp sge i32 %54, 0
br i1 %55, label %56, label %132
56: ; preds = %43
%57 = load i32, i32* %17
%58 = load i32, i32* %14
%59 = add nsw i32 %57, %58
%60 = load i32, i32* %9
%61 = icmp sge i32 %59, %60
br i1 %61, label %131, label %62
62: ; preds = %56
store i32 0, i32* %16
br label %63
63: ; preds = %127, %62
%64 = load i32, i32* %16
%65 = load i32, i32* %11
%66 = icmp sge i32 %64, %65
%67 = xor i1 %66, true
br i1 %67, label %68, label %130
68: ; preds = %63
%69 = load i32, i32* %16
%70 = load i32, i32* %13
%71 = add nsw i32 %69, %70
%72 = icmp sge i32 %71, 0
br i1 %72, label %73, label %127
73: ; preds = %68
%74 = load i32, i32* %16
%75 = load i32, i32* %13
%76 = add nsw i32 %74, %75
%77 = load i32, i32* %8
%78 = icmp sge i32 %76, %77
br i1 %78, label %126, label %79
79: ; preds = %73
%80 = load i32, i32* %11
%81 = load i32, i32* %17
%82 = mul nsw i32 %80, %81
%83 = load i32, i32* %16
%84 = add nsw i32 %82, %83
%85 = mul nsw i32 %84, 3
store i32 %85, i32* %20
%86 = load float*, float** %10
%87 = load i32, i32* %19
%88 = load i32, i32* %16
%89 = mul nsw i32 %88, 3
%90 = add nsw i32 %87, %89
%91 = sext i32 %90 to i64
%92 = getelementptr inbounds float, float* %86, i64 %91
%93 = load float, float* %92
%94 = load float*, float** %15
%95 = load i32, i32* %20
%96 = sext i32 %95 to i64
%97 = getelementptr inbounds float, float* %94, i64 %96
store float %93, float* %97
%98 = load float*, float** %10
%99 = load i32, i32* %19
%100 = load i32, i32* %16
%101 = mul nsw i32 %100, 3
%102 = add nsw i32 %99, %101
%103 = add nsw i32 %102, 1
%104 = sext i32 %103 to i64
%105 = getelementptr inbounds float, float* %98, i64 %104
%106 = load float, float* %105
%107 = load float*, float** %15
%108 = load i32, i32* %20
%109 = add nsw i32 %108, 1
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds float, float* %107, i64 %110
store float %106, float* %111
%112 = load float*, float** %10
%113 = load i32, i32* %19
%114 = load i32, i32* %16
%115 = mul nsw i32 %114, 3
%116 = add nsw i32 %113, %115
%117 = add nsw i32 %116, 2
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds float, float* %112, i64 %118
%120 = load float, float* %119
%121 = load float*, float** %15
%122 = load i32, i32* %20
%123 = add nsw i32 %122, 2
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds float, float* %121, i64 %124
store float %120, float* %125
br label %126
126: ; preds = %79, %73
br label %127
127: ; preds = %126, %68
%128 = load i32, i32* %16
%129 = add nsw i32 %128, 1
store i32 %129, i32* %16
br label %63
130: ; preds = %63
br label %131
131: ; preds = %130, %56
br label %132
132: ; preds = %131, %43
%133 = load i32, i32* %17
%134 = add nsw i32 %133, 1
store i32 %134, i32* %17
br label %38
135: ; preds = %38
%136 = load float*, float** %15
ret float* %136
}

LLVM IR (-O2):
define noalias float* @image_crop_rgb96f(i32 %0, i32 %1, float* nocapture %2, i32 %3, i32 %4, i32 %5, i32 %6) {
%8 = mul i32 %3, 3
%9 = mul i32 %8, %4
%10 = sext i32 %9 to i64
%11 = shl nsw i64 %10, 2
%12 = call i8* @calloc(i64 1, i64 %11)
%13 = bitcast i8* %12 to float*
%14 = icmp sgt i32 %4, 0
br i1 %14, label %15, label %70
15: ; preds = %7
%16 = icmp slt i32 %3, 1
%17 = sext i32 %5 to i64
%18 = sext i32 %0 to i64
%19 = sext i32 %3 to i64
%20 = sext i32 %6 to i64
%21 = sext i32 %1 to i64
%22 = zext i32 %4 to i64
%23 = zext i32 %3 to i64
br label %24
24: ; preds = %15, %67
%25 = phi i64 [ 0, %15 ], [ %68, %67 ]
%26 = add nsw i64 %25, %20
%27 = icmp slt i64 %26, 0
%28 = icmp sge i64 %26, %21
%29 = or i1 %27, %28
%30 = or i1 %29, %16
br i1 %30, label %67, label %31
31: ; preds = %24
%32 = mul nsw i64 %25, %19
%33 = trunc i64 %26 to i32
%34 = mul i32 %33, %0
br label %35
35: ; preds = %31, %64
%36 = phi i64 [ 0, %31 ], [ %65, %64 ]
%37 = add nsw i64 %36, %17
%38 = icmp sgt i64 %37, -1
%39 = icmp slt i64 %37, %18
%40 = and i1 %38, %39
br i1 %40, label %41, label %64
41: ; preds = %35
%42 = add nsw i64 %36, %32
%43 = mul nsw i64 %42, 3
%44 = trunc i64 %36 to i32
%45 = add i32 %44, %5
%46 = add i32 %45, %34
%47 = mul i32 %46, 3
%48 = sext i32 %47 to i64
%49 = getelementptr inbounds float, float* %2, i64 %48
%50 = load float, float* %49
%51 = getelementptr inbounds float, float* %13, i64 %43
store float %50, float* %51
%52 = add nsw i32 %47, 1
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds float, float* %2, i64 %53
%55 = load float, float* %54
%56 = add nsw i64 %43, 1
%57 = getelementptr inbounds float, float* %13, i64 %56
store float %55, float* %57
%58 = add nsw i32 %47, 2
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds float, float* %2, i64 %59
%61 = load float, float* %60
%62 = add nsw i64 %43, 2
%63 = getelementptr inbounds float, float* %13, i64 %62
store float %61, float* %63
br label %64
64: ; preds = %41, %35
%65 = add nuw nsw i64 %36, 1
%66 = icmp eq i64 %65, %23
br i1 %66, label %67, label %35
67: ; preds = %64, %24
%68 = add nuw nsw i64 %25, 1
%69 = icmp eq i64 %68, %22
br i1 %69, label %70, label %24
70: ; preds = %67, %7
ret float* %13
}