unsigned char MKImageProcessingGetUnsignedCharValue(const unsigned char *buffer,
                                                    short x, short y,
                                                    const int width,
                                                    const int height) {
  if (x < 0) {
    x = 0;
  }
  if (y < 0) {
    y = 0;
  }
  if (x >= width) {
    x = (width - 1);
  }
  if (y >= height) {
    y = (height - 1);
  }
  const unsigned int offset = x + (y * width);
  return *(buffer + offset);
}


x86 assembly (clang, -O0):
<MKImageProcessingGetUnsignedCharValue>:
push   %rbp
mov    %rsp,%rbp
mov    %dx,%ax
mov    %si,%dx
mov    %rdi,-0x8(%rbp)
mov    %dx,-0xa(%rbp)
mov    %ax,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
movswl -0xa(%rbp),%eax
cmp    $0x0,%eax
jge    1130 <MKImageProcessingGetUnsignedCharValue+0x30>
movw   $0x0,-0xa(%rbp)
movswl -0xc(%rbp),%eax
cmp    $0x0,%eax
jge    1143 <MKImageProcessingGetUnsignedCharValue+0x43>
movw   $0x0,-0xc(%rbp)
movswl -0xa(%rbp),%eax
cmp    -0x10(%rbp),%eax
jl     115a <MKImageProcessingGetUnsignedCharValue+0x5a>
mov    -0x10(%rbp),%eax
sub    $0x1,%eax
mov    %ax,-0xa(%rbp)
movswl -0xc(%rbp),%eax
cmp    -0x14(%rbp),%eax
jl     1171 <MKImageProcessingGetUnsignedCharValue+0x71>
mov    -0x14(%rbp),%eax
sub    $0x1,%eax
mov    %ax,-0xc(%rbp)
movswl -0xa(%rbp),%eax
movswl -0xc(%rbp),%ecx
imul   -0x10(%rbp),%ecx
add    %ecx,%eax
mov    %eax,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
movzbl (%rax,%rcx,1),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<MKImageProcessingGetUnsignedCharValue>:
xor    %eax,%eax
test   %si,%si
cmovs  %eax,%esi
test   %dx,%dx
cmovns %edx,%eax
movzwl %si,%r9d
lea    -0x1(%rcx),%edx
cmp    %ecx,%r9d
cmovl  %esi,%edx
movzwl %ax,%r9d
lea    -0x1(%r8),%esi
cmp    %r8d,%r9d
cmovl  %eax,%esi
movswl %dx,%eax
movswl %si,%edx
imul   %ecx,%edx
add    %eax,%edx
mov    (%rdi,%rdx,1),%al
ret

LLVM IR (-O0):
define zeroext i8 @MKImageProcessingGetUnsignedCharValue(i8* %0, i16 signext %1, i16 signext %2, i32 %3, i32 %4) {
%6 = alloca i8*
%7 = alloca i16
%8 = alloca i16
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
store i8* %0, i8** %6
store i16 %1, i16* %7
store i16 %2, i16* %8
store i32 %3, i32* %9
store i32 %4, i32* %10
%12 = load i16, i16* %7
%13 = sext i16 %12 to i32
%14 = icmp slt i32 %13, 0
br i1 %14, label %15, label %16
15: ; preds = %5
store i16 0, i16* %7
br label %16
16: ; preds = %15, %5
%17 = load i16, i16* %8
%18 = sext i16 %17 to i32
%19 = icmp slt i32 %18, 0
br i1 %19, label %20, label %21
20: ; preds = %16
store i16 0, i16* %8
br label %21
21: ; preds = %20, %16
%22 = load i16, i16* %7
%23 = sext i16 %22 to i32
%24 = load i32, i32* %9
%25 = icmp sge i32 %23, %24
br i1 %25, label %26, label %30
26: ; preds = %21
%27 = load i32, i32* %9
%28 = sub nsw i32 %27, 1
%29 = trunc i32 %28 to i16
store i16 %29, i16* %7
br label %30
30: ; preds = %26, %21
%31 = load i16, i16* %8
%32 = sext i16 %31 to i32
%33 = load i32, i32* %10
%34 = icmp sge i32 %32, %33
br i1 %34, label %35, label %39
35: ; preds = %30
%36 = load i32, i32* %10
%37 = sub nsw i32 %36, 1
%38 = trunc i32 %37 to i16
store i16 %38, i16* %8
br label %39
39: ; preds = %35, %30
%40 = load i16, i16* %7
%41 = sext i16 %40 to i32
%42 = load i16, i16* %8
%43 = sext i16 %42 to i32
%44 = load i32, i32* %9
%45 = mul nsw i32 %43, %44
%46 = add nsw i32 %41, %45
store i32 %46, i32* %11
%47 = load i8*, i8** %6
%48 = load i32, i32* %11
%49 = zext i32 %48 to i64
%50 = getelementptr inbounds i8, i8* %47, i64 %49
%51 = load i8, i8* %50
ret i8 %51
}

LLVM IR (-O2):
define zeroext i8 @MKImageProcessingGetUnsignedCharValue(i8* nocapture %0, i16 signext %1, i16 signext %2, i32 %3, i32 %4) {
%6 = icmp sgt i16 %1, 0
%7 = select i1 %6, i16 %1, i16 0
%8 = icmp sgt i16 %2, 0
%9 = select i1 %8, i16 %2, i16 0
%10 = zext i16 %7 to i32
%11 = icmp slt i32 %10, %3
%12 = trunc i32 %3 to i16
%13 = add i16 %12, -1
%14 = select i1 %11, i16 %7, i16 %13
%15 = zext i16 %9 to i32
%16 = icmp slt i32 %15, %4
%17 = trunc i32 %4 to i16
%18 = add i16 %17, -1
%19 = select i1 %16, i16 %9, i16 %18
%20 = sext i16 %14 to i32
%21 = sext i16 %19 to i32
%22 = mul nsw i32 %21, %3
%23 = add nsw i32 %22, %20
%24 = zext i32 %23 to i64
%25 = getelementptr inbounds i8, i8* %0, i64 %24
%26 = load i8, i8* %25
ret i8 %26
}