#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*/ memcpy(char *, char *, unsigned long);
unsigned long textureScale(char *srcBuf, long width, long height, long bpp,
                           char *destBuf, long destination_width,
                           long destination_height) {
  if (width != destination_width || height != destination_height)
    return 0;
  unsigned long textureLength =
      (destination_width * destination_height * bpp) / 8;
  if (destBuf == NULL)
    return textureLength;
  memcpy(destBuf, srcBuf, textureLength);
  return textureLength;
}


x86 assembly (clang, -O0):
<textureScale>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    0x10(%rbp),%rax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
mov    -0x18(%rbp),%rax
cmp    -0x38(%rbp),%rax
jne    1150 <textureScale+0x40>
mov    -0x20(%rbp),%rax
cmp    0x10(%rbp),%rax
je     115d <textureScale+0x4d>
movq   $0x0,-0x8(%rbp)
jmp    11aa <textureScale+0x9a>
mov    -0x38(%rbp),%rax
imul   0x10(%rbp),%rax
imul   -0x28(%rbp),%rax
mov    $0x8,%ecx
cqto
idiv   %rcx
mov    %rax,-0x40(%rbp)
cmpq   $0x0,-0x30(%rbp)
jne    1191 <textureScale+0x81>
mov    -0x40(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    11aa <textureScale+0x9a>
mov    -0x30(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x40(%rbp),%rdx
call   1030 <memcpy@plt>
mov    -0x40(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<textureScale>:
push   %rbx
xor    %ebx,%ebx
cmp    %r9,%rsi
jne    114c <textureScale+0x3c>
cmp    0x10(%rsp),%rdx
jne    114c <textureScale+0x3c>
imul   %rcx,%rsi
imul   %rdx,%rsi
lea    0x7(%rsi),%rbx
test   %rsi,%rsi
cmovns %rsi,%rbx
sar    $0x3,%rbx
test   %r8,%r8
je     114c <textureScale+0x3c>
mov    %rdi,%rax
mov    %r8,%rdi
mov    %rax,%rsi
mov    %rbx,%rdx
call   1030 <memcpy@plt>
mov    %rbx,%rax
pop    %rbx
ret

LLVM IR (-O0):
define i64 @textureScale(i8* %0, i64 %1, i64 %2, i64 %3, i8* %4, i64 %5, i64 %6) {
%8 = alloca i64
%9 = alloca i8*
%10 = alloca i64
%11 = alloca i64
%12 = alloca i64
%13 = alloca i8*
%14 = alloca i64
%15 = alloca i64
%16 = alloca i64
store i8* %0, i8** %9
store i64 %1, i64* %10
store i64 %2, i64* %11
store i64 %3, i64* %12
store i8* %4, i8** %13
store i64 %5, i64* %14
store i64 %6, i64* %15
%17 = load i64, i64* %10
%18 = load i64, i64* %14
%19 = icmp ne i64 %17, %18
br i1 %19, label %24, label %20
20: ; preds = %7
%21 = load i64, i64* %11
%22 = load i64, i64* %15
%23 = icmp ne i64 %21, %22
br i1 %23, label %24, label %25
24: ; preds = %20, %7
store i64 0, i64* %8
br label %42
25: ; preds = %20
%26 = load i64, i64* %14
%27 = load i64, i64* %15
%28 = mul nsw i64 %26, %27
%29 = load i64, i64* %12
%30 = mul nsw i64 %28, %29
%31 = sdiv i64 %30, 8
store i64 %31, i64* %16
%32 = load i8*, i8** %13
%33 = icmp eq i8* %32, null
br i1 %33, label %34, label %36
34: ; preds = %25
%35 = load i64, i64* %16
store i64 %35, i64* %8
br label %42
36: ; preds = %25
%37 = load i8*, i8** %13
%38 = load i8*, i8** %9
%39 = load i64, i64* %16
%40 = call i32 @memcpy(i8* %37, i8* %38, i64 %39)
%41 = load i64, i64* %16
store i64 %41, i64* %8
br label %42
42: ; preds = %36, %34, %24
%43 = load i64, i64* %8
ret i64 %43
}

LLVM IR (-O2):
define i64 @textureScale(i8* %0, i64 %1, i64 %2, i64 %3, i8* %4, i64 %5, i64 %6) {
%8 = icmp eq i64 %1, %5
%9 = icmp eq i64 %2, %6
%10 = and i1 %8, %9
br i1 %10, label %11, label %18
11: ; preds = %7
%12 = mul i64 %1, %3
%13 = mul i64 %12, %2
%14 = sdiv i64 %13, 8
%15 = icmp eq i8* %4, null
br i1 %15, label %18, label %16
16: ; preds = %11
%17 = tail call i32 @memcpy(i8* %4, i8* %0, i64 %14)
br label %18
18: ; preds = %16, %11, %7
%19 = phi i64 [ 0, %7 ], [ %14, %11 ], [ %14, %16 ]
ret i64 %19
}