#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 */
double M_PI;
double cos(double);
void *floor(short);
double sin(double);
void c_rotate(char *image, char *new_img, short width, short height,
              unsigned short wh, double degrees,
              unsigned char bytes_per_pixel) {
  unsigned int hwh = floor(wh / 2 + 0.5);
  unsigned int bbline = wh * bytes_per_pixel;
  unsigned int bline = width * bytes_per_pixel;
  unsigned short hwidth = floor(width / 2 + 0.5);
  unsigned short hheight = floor(height / 2 + 0.5);
  double sinma = sin((degrees * M_PI) / 180);
  double cosma = cos((degrees * M_PI) / 180);
  short x;
  short y;
  for (x = 0; x < wh; x++) {
    short xt = x - hwh;
    for (y = 0; y < wh; y++) {
      short yt = y - hwh;
      short xs = ((cosma * xt - sinma * yt) + hwidth);
      short ys = ((sinma * xt + cosma * yt) + hheight);
      if (xs >= 0 && xs < width && ys >= 0 && ys < height) {
        switch (bytes_per_pixel) {
        case 4: {
          *((unsigned int *)(new_img + (x * bytes_per_pixel) + (y * bbline))) =
              *((unsigned int *)(image + (xs * bytes_per_pixel) +
                                 (ys * bline)));
        } break;
        case 3: {
          *(new_img + (x * bytes_per_pixel) + (y * bbline)) =
              *(image + (xs * bytes_per_pixel) + (ys * bline));
          *(new_img + (x * bytes_per_pixel) + (y * bbline) + 1) =
              *(image + (xs * bytes_per_pixel) + (ys * bline) + 1);
          *(new_img + (x * bytes_per_pixel) + (y * bbline) + 2) =
              *(image + (xs * bytes_per_pixel) + (ys * bline) + 2);
        } break;
        case 2: {
          *((unsigned short *)(new_img + (x * bytes_per_pixel) +
                               (y * bbline))) =
              *((unsigned short *)(image + (xs * bytes_per_pixel) +
                                   (ys * bline)));
        } break;
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<c_rotate>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %r8d,-0x74(%rbp)
mov    %ecx,%eax
mov    -0x74(%rbp),%ecx
mov    %eax,-0x70(%rbp)
mov    %edx,%eax
mov    -0x70(%rbp),%edx
mov    %eax,-0x6c(%rbp)
mov    %rsi,%rax
mov    -0x6c(%rbp),%esi
mov    %rax,-0x68(%rbp)
mov    %rdi,%r8
mov    -0x68(%rbp),%rdi
mov    %r9b,%al
mov    %r8,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %si,-0x12(%rbp)
mov    %dx,-0x14(%rbp)
mov    %cx,-0x16(%rbp)
movsd  %xmm0,-0x20(%rbp)
mov    %al,-0x21(%rbp)
movzwl -0x16(%rbp),%eax
shr    %eax
cvtsi2sd %eax,%xmm0
movsd  0xe77(%rip),%xmm1
movsd  %xmm1,-0x60(%rbp)
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
movswl %ax,%edi
call   1050 <floor@plt>
movsd  -0x60(%rbp),%xmm1
mov    %eax,-0x28(%rbp)
movzwl -0x16(%rbp),%eax
movzbl -0x21(%rbp),%ecx
imul   %ecx,%eax
mov    %eax,-0x2c(%rbp)
movswl -0x12(%rbp),%eax
movzbl -0x21(%rbp),%ecx
imul   %ecx,%eax
mov    %eax,-0x30(%rbp)
movswl -0x12(%rbp),%eax
mov    %eax,%ecx
shr    $0x1f,%ecx
add    %ecx,%eax
sar    %eax
cvtsi2sd %eax,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
movswl %ax,%edi
call   1050 <floor@plt>
movsd  -0x60(%rbp),%xmm1
mov    %ax,-0x32(%rbp)
movswl -0x14(%rbp),%eax
mov    %eax,%ecx
shr    $0x1f,%ecx
add    %ecx,%eax
sar    %eax
cvtsi2sd %eax,%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
movswl %ax,%edi
call   1050 <floor@plt>
mov    %ax,-0x34(%rbp)
movsd  -0x20(%rbp),%xmm0
mov    0x2dc3(%rip),%rax
mulsd  (%rax),%xmm0
movsd  0xdcf(%rip),%xmm1
divsd  %xmm1,%xmm0
call   1030 <sin@plt>
movsd  %xmm0,-0x40(%rbp)
movsd  -0x20(%rbp),%xmm0
mov    0x2d9d(%rip),%rax
mulsd  (%rax),%xmm0
movsd  0xda9(%rip),%xmm1
divsd  %xmm1,%xmm0
call   1040 <cos@plt>
movsd  %xmm0,-0x48(%rbp)
movw   $0x0,-0x4a(%rbp)
movswl -0x4a(%rbp),%eax
movzwl -0x16(%rbp),%ecx
cmp    %ecx,%eax
jge    1523 <c_rotate+0x3f3>
movswl -0x4a(%rbp),%eax
sub    -0x28(%rbp),%eax
mov    %ax,-0x4e(%rbp)
movw   $0x0,-0x4c(%rbp)
movswl -0x4c(%rbp),%eax
movzwl -0x16(%rbp),%ecx
cmp    %ecx,%eax
jge    150d <c_rotate+0x3dd>
movzwl -0x4c(%rbp),%eax
mov    -0x28(%rbp),%ecx
sub    %ecx,%eax
mov    %ax,-0x50(%rbp)
movsd  -0x48(%rbp),%xmm0
movswl -0x4e(%rbp),%eax
cvtsi2sd %eax,%xmm2
movsd  -0x40(%rbp),%xmm1
movswl -0x50(%rbp),%eax
cvtsi2sd %eax,%xmm3
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
movzwl -0x32(%rbp),%eax
cvtsi2sd %eax,%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %ax,-0x52(%rbp)
movsd  -0x40(%rbp),%xmm0
movswl -0x4e(%rbp),%eax
cvtsi2sd %eax,%xmm2
movsd  -0x48(%rbp),%xmm1
movswl -0x50(%rbp),%eax
cvtsi2sd %eax,%xmm3
mulsd  %xmm3,%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movzwl -0x34(%rbp),%eax
cvtsi2sd %eax,%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %ax,-0x54(%rbp)
movswl -0x52(%rbp),%eax
cmp    $0x0,%eax
jl     14f7 <c_rotate+0x3c7>
movswl -0x52(%rbp),%eax
movswl -0x12(%rbp),%ecx
cmp    %ecx,%eax
jge    14f7 <c_rotate+0x3c7>
movswl -0x54(%rbp),%eax
cmp    $0x0,%eax
jl     14f7 <c_rotate+0x3c7>
movswl -0x54(%rbp),%eax
movswl -0x14(%rbp),%ecx
cmp    %ecx,%eax
jge    14f7 <c_rotate+0x3c7>
movzbl -0x21(%rbp),%eax
mov    %eax,-0x78(%rbp)
sub    $0x2,%eax
je     14ac <c_rotate+0x37c>
jmp    136c <c_rotate+0x23c>
mov    -0x78(%rbp),%eax
sub    $0x3,%eax
je     13d7 <c_rotate+0x2a7>
jmp    137d <c_rotate+0x24d>
mov    -0x78(%rbp),%eax
sub    $0x4,%eax
jne    14f2 <c_rotate+0x3c2>
jmp    138e <c_rotate+0x25e>
mov    -0x8(%rbp),%rax
movswl -0x52(%rbp),%ecx
movzbl -0x21(%rbp),%edx
imul   %edx,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
movswl -0x54(%rbp),%ecx
imul   -0x30(%rbp),%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%edx
mov    -0x10(%rbp),%rax
movswl -0x4a(%rbp),%ecx
movzbl -0x21(%rbp),%esi
imul   %esi,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
movswl -0x4c(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
mov    %ecx,%ecx
mov    %edx,(%rax,%rcx,1)
jmp    14f2 <c_rotate+0x3c2>
mov    -0x8(%rbp),%rax
movswl -0x52(%rbp),%ecx
movzbl -0x21(%rbp),%edx
imul   %edx,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
movswl -0x54(%rbp),%ecx
imul   -0x30(%rbp),%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
movswl -0x4a(%rbp),%ecx
movzbl -0x21(%rbp),%esi
imul   %esi,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
movswl -0x4c(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
mov    %ecx,%ecx
mov    %dl,(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
movswl -0x52(%rbp),%ecx
movzbl -0x21(%rbp),%edx
imul   %edx,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
movswl -0x54(%rbp),%ecx
imul   -0x30(%rbp),%ecx
mov    %ecx,%ecx
mov    0x1(%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
movswl -0x4a(%rbp),%ecx
movzbl -0x21(%rbp),%esi
imul   %esi,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
movswl -0x4c(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
mov    %ecx,%ecx
mov    %dl,0x1(%rax,%rcx,1)
mov    -0x8(%rbp),%rax
movswl -0x52(%rbp),%ecx
movzbl -0x21(%rbp),%edx
imul   %edx,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
movswl -0x54(%rbp),%ecx
imul   -0x30(%rbp),%ecx
mov    %ecx,%ecx
mov    0x2(%rax,%rcx,1),%dl
mov    -0x10(%rbp),%rax
movswl -0x4a(%rbp),%ecx
movzbl -0x21(%rbp),%esi
imul   %esi,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
movswl -0x4c(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
mov    %ecx,%ecx
mov    %dl,0x2(%rax,%rcx,1)
jmp    14f2 <c_rotate+0x3c2>
mov    -0x8(%rbp),%rax
movswl -0x52(%rbp),%ecx
movzbl -0x21(%rbp),%edx
imul   %edx,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
movswl -0x54(%rbp),%ecx
imul   -0x30(%rbp),%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%dx
mov    -0x10(%rbp),%rax
movswl -0x4a(%rbp),%ecx
movzbl -0x21(%rbp),%esi
imul   %esi,%ecx
movslq %ecx,%rcx
add    %rcx,%rax
movswl -0x4c(%rbp),%ecx
imul   -0x2c(%rbp),%ecx
mov    %ecx,%ecx
mov    %dx,(%rax,%rcx,1)
jmp    14f7 <c_rotate+0x3c7>
jmp    14fc <c_rotate+0x3cc>
mov    -0x4c(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x4c(%rbp)
jmp    128c <c_rotate+0x15c>
jmp    1512 <c_rotate+0x3e2>
mov    -0x4a(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x4a(%rbp)
jmp    126b <c_rotate+0x13b>
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<c_rotate>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x38,%rsp
mov    %r9d,%r13d
movsd  %xmm0,(%rsp)
mov    %r8d,%ebp
mov    %ecx,%r14d
mov    %edx,%r15d
mov    %rsi,0x18(%rsp)
mov    %rdi,%rbx
movzwl %r14w,%eax
mov    %eax,0x10(%rsp)
movzwl %r15w,%eax
mov    %eax,0x8(%rsp)
mov    %r8d,%eax
shr    %eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
addsd  0xe85(%rip),%xmm0
cvttsd2si %xmm0,%eax
movswl %ax,%edi
call   1050 <floor@plt>
mov    %rax,%r12
mov    0x8(%rsp),%eax
shr    $0xf,%eax
add    %r15d,%eax
cwtl
sar    %eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
addsd  0xe5a(%rip),%xmm0
cvttsd2si %xmm0,%eax
movswl %ax,%edi
call   1050 <floor@plt>
mov    %rax,0x8(%rsp)
mov    0x10(%rsp),%eax
shr    $0xf,%eax
add    %r14d,%eax
cwtl
sar    %eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
addsd  0xe2d(%rip),%xmm0
cvttsd2si %xmm0,%eax
movswl %ax,%edi
call   1050 <floor@plt>
mov    %rax,0x10(%rsp)
mov    0x2dfd(%rip),%rax
movsd  (%rax),%xmm0
mulsd  (%rsp),%xmm0
divsd  0xe0c(%rip),%xmm0
call   1030 <sin@plt>
movapd %xmm0,0x20(%rsp)
movsd  (%rsp),%xmm0
mov    0x2dd5(%rip),%rax
mulsd  (%rax),%xmm0
divsd  0xde9(%rip),%xmm0
call   1040 <cos@plt>
movapd 0x20(%rsp),%xmm8
test   %ebp,%ebp
je     13ba <c_rotate+0x28a>
mov    %r13d,%eax
imul   %ebp,%eax
mov    %eax,(%rsp)
mov    %r15d,%r11d
imul   %r13d,%r11d
movapd 0xdc5(%rip),%xmm1
xorpd  %xmm8,%xmm1
movzwl 0x8(%rsp),%eax
cvtsi2sd %eax,%xmm2
movzwl 0x10(%rsp),%eax
cvtsi2sd %eax,%xmm3
xor    %r10d,%r10d
jmp    1281 <c_rotate+0x151>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r10d
movswl %r10w,%r10d
cmp    %ebp,%r10d
jge    13ba <c_rotate+0x28a>
mov    %r10d,%eax
sub    %r12d,%eax
cwtl
xorps  %xmm4,%xmm4
cvtsi2sd %eax,%xmm4
movslq %r10d,%rax
mov    0x18(%rsp),%rcx
lea    (%rcx,%rax,2),%rdx
mov    %rdx,0x10(%rsp)
lea    (%rax,%rax,2),%r9
add    %rcx,%r9
lea    (%rcx,%rax,4),%rax
mov    %rax,0x8(%rsp)
xor    %esi,%esi
jmp    12fe <c_rotate+0x1ce>
lea    (%rcx,%rcx,2),%ecx
add    %rbx,%rcx
imul   %r11d,%eax
mov    %rbx,%rdx
movzbl (%rax,%rcx,1),%ebx
mov    %esi,%edi
imul   (%rsp),%edi
mov    %bl,(%r9,%rdi,1)
movzbl 0x1(%rax,%rcx,1),%ebx
mov    %bl,0x1(%r9,%rdi,1)
mov    %rdx,%rbx
movzbl 0x2(%rax,%rcx,1),%eax
mov    %al,0x2(%r9,%rdi,1)
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%esi
movswl %si,%esi
cmp    %ebp,%esi
jge    1270 <c_rotate+0x140>
mov    %esi,%eax
sub    %r12d,%eax
cwtl
xorps  %xmm5,%xmm5
cvtsi2sd %eax,%xmm5
movapd %xmm1,%xmm6
mulsd  %xmm5,%xmm6
movapd %xmm0,%xmm7
mulsd  %xmm4,%xmm7
addsd  %xmm6,%xmm7
addsd  %xmm2,%xmm7
cvttsd2si %xmm7,%eax
test   %ax,%ax
js     12f0 <c_rotate+0x1c0>
cmp    %r15w,%ax
jge    12f0 <c_rotate+0x1c0>
mulsd  %xmm0,%xmm5
movapd %xmm8,%xmm6
mulsd  %xmm4,%xmm6
addsd  %xmm5,%xmm6
addsd  %xmm3,%xmm6
cvttsd2si %xmm6,%r8d
test   %r8w,%r8w
js     12f0 <c_rotate+0x1c0>
cmp    %r14w,%r8w
jge    12f0 <c_rotate+0x1c0>
movswl %ax,%ecx
movswl %r8w,%eax
cmp    $0x2,%r13b
je     1399 <c_rotate+0x269>
cmp    $0x3,%r13b
je     12b4 <c_rotate+0x184>
cmp    $0x4,%r13b
jne    12f0 <c_rotate+0x1c0>
shl    $0x2,%ecx
add    %rbx,%rcx
imul   %r11d,%eax
mov    (%rax,%rcx,1),%eax
mov    %esi,%ecx
imul   (%rsp),%ecx
mov    0x8(%rsp),%rdx
mov    %eax,(%rdx,%rcx,1)
jmp    12f0 <c_rotate+0x1c0>
add    %ecx,%ecx
add    %rbx,%rcx
imul   %r11d,%eax
movzwl (%rax,%rcx,1),%eax
mov    %esi,%ecx
imul   (%rsp),%ecx
mov    0x10(%rsp),%rdx
mov    %ax,(%rdx,%rcx,1)
jmp    12f0 <c_rotate+0x1c0>
add    $0x38,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@M_PI = global double 0.000000e+00
define void @c_rotate(i8* %0, i8* %1, i16 signext %2, i16 signext %3, i16 zeroext %4, double %5, i8 zeroext %6) {
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i16
%11 = alloca i16
%12 = alloca i16
%13 = alloca double
%14 = alloca i8
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i16
%19 = alloca i16
%20 = alloca double
%21 = alloca double
%22 = alloca i16
%23 = alloca i16
%24 = alloca i16
%25 = alloca i16
%26 = alloca i16
%27 = alloca i16
store i8* %0, i8** %8
store i8* %1, i8** %9
store i16 %2, i16* %10
store i16 %3, i16* %11
store i16 %4, i16* %12
store double %5, double* %13
store i8 %6, i8* %14
%28 = load i16, i16* %12
%29 = zext i16 %28 to i32
%30 = sdiv i32 %29, 2
%31 = sitofp i32 %30 to double
%32 = fadd double %31, 5.000000e-01
%33 = fptosi double %32 to i16
%34 = call i8* @floor(i16 signext %33)
%35 = ptrtoint i8* %34 to i32
store i32 %35, i32* %15
%36 = load i16, i16* %12
%37 = zext i16 %36 to i32
%38 = load i8, i8* %14
%39 = zext i8 %38 to i32
%40 = mul nsw i32 %37, %39
store i32 %40, i32* %16
%41 = load i16, i16* %10
%42 = sext i16 %41 to i32
%43 = load i8, i8* %14
%44 = zext i8 %43 to i32
%45 = mul nsw i32 %42, %44
store i32 %45, i32* %17
%46 = load i16, i16* %10
%47 = sext i16 %46 to i32
%48 = sdiv i32 %47, 2
%49 = sitofp i32 %48 to double
%50 = fadd double %49, 5.000000e-01
%51 = fptosi double %50 to i16
%52 = call i8* @floor(i16 signext %51)
%53 = ptrtoint i8* %52 to i16
store i16 %53, i16* %18
%54 = load i16, i16* %11
%55 = sext i16 %54 to i32
%56 = sdiv i32 %55, 2
%57 = sitofp i32 %56 to double
%58 = fadd double %57, 5.000000e-01
%59 = fptosi double %58 to i16
%60 = call i8* @floor(i16 signext %59)
%61 = ptrtoint i8* %60 to i16
store i16 %61, i16* %19
%62 = load double, double* %13
%63 = load double, double* @M_PI
%64 = fmul double %62, %63
%65 = fdiv double %64, 1.800000e+02
%66 = call double @sin(double %65)
store double %66, double* %20
%67 = load double, double* %13
%68 = load double, double* @M_PI
%69 = fmul double %67, %68
%70 = fdiv double %69, 1.800000e+02
%71 = call double @cos(double %70)
store double %71, double* %21
store i16 0, i16* %22
br label %72
72: ; preds = %311, %7
%73 = load i16, i16* %22
%74 = sext i16 %73 to i32
%75 = load i16, i16* %12
%76 = zext i16 %75 to i32
%77 = icmp slt i32 %74, %76
br i1 %77, label %78, label %314
78: ; preds = %72
%79 = load i16, i16* %22
%80 = sext i16 %79 to i32
%81 = load i32, i32* %15
%82 = sub i32 %80, %81
%83 = trunc i32 %82 to i16
store i16 %83, i16* %24
store i16 0, i16* %23
br label %84
84: ; preds = %307, %78
%85 = load i16, i16* %23
%86 = sext i16 %85 to i32
%87 = load i16, i16* %12
%88 = zext i16 %87 to i32
%89 = icmp slt i32 %86, %88
br i1 %89, label %90, label %310
90: ; preds = %84
%91 = load i16, i16* %23
%92 = sext i16 %91 to i32
%93 = load i32, i32* %15
%94 = sub i32 %92, %93
%95 = trunc i32 %94 to i16
store i16 %95, i16* %25
%96 = load double, double* %21
%97 = load i16, i16* %24
%98 = sext i16 %97 to i32
%99 = sitofp i32 %98 to double
%100 = load double, double* %20
%101 = load i16, i16* %25
%102 = sext i16 %101 to i32
%103 = sitofp i32 %102 to double
%104 = fmul double %100, %103
%105 = fneg double %104
%106 = call double @llvm.fmuladd.f64(double %96, double %99, double %105)
%107 = load i16, i16* %18
%108 = zext i16 %107 to i32
%109 = sitofp i32 %108 to double
%110 = fadd double %106, %109
%111 = fptosi double %110 to i16
store i16 %111, i16* %26
%112 = load double, double* %20
%113 = load i16, i16* %24
%114 = sext i16 %113 to i32
%115 = sitofp i32 %114 to double
%116 = load double, double* %21
%117 = load i16, i16* %25
%118 = sext i16 %117 to i32
%119 = sitofp i32 %118 to double
%120 = fmul double %116, %119
%121 = call double @llvm.fmuladd.f64(double %112, double %115, double %120)
%122 = load i16, i16* %19
%123 = zext i16 %122 to i32
%124 = sitofp i32 %123 to double
%125 = fadd double %121, %124
%126 = fptosi double %125 to i16
store i16 %126, i16* %27
%127 = load i16, i16* %26
%128 = sext i16 %127 to i32
%129 = icmp sge i32 %128, 0
br i1 %129, label %130, label %306
130: ; preds = %90
%131 = load i16, i16* %26
%132 = sext i16 %131 to i32
%133 = load i16, i16* %10
%134 = sext i16 %133 to i32
%135 = icmp slt i32 %132, %134
br i1 %135, label %136, label %306
136: ; preds = %130
%137 = load i16, i16* %27
%138 = sext i16 %137 to i32
%139 = icmp sge i32 %138, 0
br i1 %139, label %140, label %306
140: ; preds = %136
%141 = load i16, i16* %27
%142 = sext i16 %141 to i32
%143 = load i16, i16* %11
%144 = sext i16 %143 to i32
%145 = icmp slt i32 %142, %144
br i1 %145, label %146, label %306
146: ; preds = %140
%147 = load i8, i8* %14
%148 = zext i8 %147 to i32
switch i32 %148, label %305 [
i32 4, label %149
i32 3, label %181
i32 2, label %273
]
149: ; preds = %146
%150 = load i8*, i8** %8
%151 = load i16, i16* %26
%152 = sext i16 %151 to i32
%153 = load i8, i8* %14
%154 = zext i8 %153 to i32
%155 = mul nsw i32 %152, %154
%156 = sext i32 %155 to i64
%157 = getelementptr inbounds i8, i8* %150, i64 %156
%158 = load i16, i16* %27
%159 = sext i16 %158 to i32
%160 = load i32, i32* %17
%161 = mul i32 %159, %160
%162 = zext i32 %161 to i64
%163 = getelementptr inbounds i8, i8* %157, i64 %162
%164 = bitcast i8* %163 to i32*
%165 = load i32, i32* %164
%166 = load i8*, i8** %9
%167 = load i16, i16* %22
%168 = sext i16 %167 to i32
%169 = load i8, i8* %14
%170 = zext i8 %169 to i32
%171 = mul nsw i32 %168, %170
%172 = sext i32 %171 to i64
%173 = getelementptr inbounds i8, i8* %166, i64 %172
%174 = load i16, i16* %23
%175 = sext i16 %174 to i32
%176 = load i32, i32* %16
%177 = mul i32 %175, %176
%178 = zext i32 %177 to i64
%179 = getelementptr inbounds i8, i8* %173, i64 %178
%180 = bitcast i8* %179 to i32*
store i32 %165, i32* %180
br label %305
181: ; preds = %146
%182 = load i8*, i8** %8
%183 = load i16, i16* %26
%184 = sext i16 %183 to i32
%185 = load i8, i8* %14
%186 = zext i8 %185 to i32
%187 = mul nsw i32 %184, %186
%188 = sext i32 %187 to i64
%189 = getelementptr inbounds i8, i8* %182, i64 %188
%190 = load i16, i16* %27
%191 = sext i16 %190 to i32
%192 = load i32, i32* %17
%193 = mul i32 %191, %192
%194 = zext i32 %193 to i64
%195 = getelementptr inbounds i8, i8* %189, i64 %194
%196 = load i8, i8* %195
%197 = load i8*, i8** %9
%198 = load i16, i16* %22
%199 = sext i16 %198 to i32
%200 = load i8, i8* %14
%201 = zext i8 %200 to i32
%202 = mul nsw i32 %199, %201
%203 = sext i32 %202 to i64
%204 = getelementptr inbounds i8, i8* %197, i64 %203
%205 = load i16, i16* %23
%206 = sext i16 %205 to i32
%207 = load i32, i32* %16
%208 = mul i32 %206, %207
%209 = zext i32 %208 to i64
%210 = getelementptr inbounds i8, i8* %204, i64 %209
store i8 %196, i8* %210
%211 = load i8*, i8** %8
%212 = load i16, i16* %26
%213 = sext i16 %212 to i32
%214 = load i8, i8* %14
%215 = zext i8 %214 to i32
%216 = mul nsw i32 %213, %215
%217 = sext i32 %216 to i64
%218 = getelementptr inbounds i8, i8* %211, i64 %217
%219 = load i16, i16* %27
%220 = sext i16 %219 to i32
%221 = load i32, i32* %17
%222 = mul i32 %220, %221
%223 = zext i32 %222 to i64
%224 = getelementptr inbounds i8, i8* %218, i64 %223
%225 = getelementptr inbounds i8, i8* %224, i64 1
%226 = load i8, i8* %225
%227 = load i8*, i8** %9
%228 = load i16, i16* %22
%229 = sext i16 %228 to i32
%230 = load i8, i8* %14
%231 = zext i8 %230 to i32
%232 = mul nsw i32 %229, %231
%233 = sext i32 %232 to i64
%234 = getelementptr inbounds i8, i8* %227, i64 %233
%235 = load i16, i16* %23
%236 = sext i16 %235 to i32
%237 = load i32, i32* %16
%238 = mul i32 %236, %237
%239 = zext i32 %238 to i64
%240 = getelementptr inbounds i8, i8* %234, i64 %239
%241 = getelementptr inbounds i8, i8* %240, i64 1
store i8 %226, i8* %241
%242 = load i8*, i8** %8
%243 = load i16, i16* %26
%244 = sext i16 %243 to i32
%245 = load i8, i8* %14
%246 = zext i8 %245 to i32
%247 = mul nsw i32 %244, %246
%248 = sext i32 %247 to i64
%249 = getelementptr inbounds i8, i8* %242, i64 %248
%250 = load i16, i16* %27
%251 = sext i16 %250 to i32
%252 = load i32, i32* %17
%253 = mul i32 %251, %252
%254 = zext i32 %253 to i64
%255 = getelementptr inbounds i8, i8* %249, i64 %254
%256 = getelementptr inbounds i8, i8* %255, i64 2
%257 = load i8, i8* %256
%258 = load i8*, i8** %9
%259 = load i16, i16* %22
%260 = sext i16 %259 to i32
%261 = load i8, i8* %14
%262 = zext i8 %261 to i32
%263 = mul nsw i32 %260, %262
%264 = sext i32 %263 to i64
%265 = getelementptr inbounds i8, i8* %258, i64 %264
%266 = load i16, i16* %23
%267 = sext i16 %266 to i32
%268 = load i32, i32* %16
%269 = mul i32 %267, %268
%270 = zext i32 %269 to i64
%271 = getelementptr inbounds i8, i8* %265, i64 %270
%272 = getelementptr inbounds i8, i8* %271, i64 2
store i8 %257, i8* %272
br label %305
273: ; preds = %146
%274 = load i8*, i8** %8
%275 = load i16, i16* %26
%276 = sext i16 %275 to i32
%277 = load i8, i8* %14
%278 = zext i8 %277 to i32
%279 = mul nsw i32 %276, %278
%280 = sext i32 %279 to i64
%281 = getelementptr inbounds i8, i8* %274, i64 %280
%282 = load i16, i16* %27
%283 = sext i16 %282 to i32
%284 = load i32, i32* %17
%285 = mul i32 %283, %284
%286 = zext i32 %285 to i64
%287 = getelementptr inbounds i8, i8* %281, i64 %286
%288 = bitcast i8* %287 to i16*
%289 = load i16, i16* %288
%290 = load i8*, i8** %9
%291 = load i16, i16* %22
%292 = sext i16 %291 to i32
%293 = load i8, i8* %14
%294 = zext i8 %293 to i32
%295 = mul nsw i32 %292, %294
%296 = sext i32 %295 to i64
%297 = getelementptr inbounds i8, i8* %290, i64 %296
%298 = load i16, i16* %23
%299 = sext i16 %298 to i32
%300 = load i32, i32* %16
%301 = mul i32 %299, %300
%302 = zext i32 %301 to i64
%303 = getelementptr inbounds i8, i8* %297, i64 %302
%304 = bitcast i8* %303 to i16*
store i16 %289, i16* %304
br label %305
305: ; preds = %146, %273, %181, %149
br label %306
306: ; preds = %305, %140, %136, %130, %90
br label %307
307: ; preds = %306
%308 = load i16, i16* %23
%309 = add i16 %308, 1
store i16 %309, i16* %23
br label %84
310: ; preds = %84
br label %311
311: ; preds = %310
%312 = load i16, i16* %22
%313 = add i16 %312, 1
store i16 %313, i16* %22
br label %72
314: ; preds = %72
ret void
}

LLVM IR (-O2):
@M_PI = global double 0.000000e+00
define void @c_rotate(i8* nocapture %0, i8* nocapture writeonly %1, i16 signext %2, i16 signext %3, i16 zeroext %4, double %5, i8 zeroext %6) {
%8 = zext i16 %4 to i32
%9 = lshr i32 %8, 1
%10 = sitofp i32 %9 to double
%11 = fadd double %10, 5.000000e-01
%12 = fptosi double %11 to i16
%13 = tail call i8* @floor(i16 signext %12)
%14 = ptrtoint i8* %13 to i64
%15 = trunc i64 %14 to i16
%16 = zext i8 %6 to i32
%17 = mul nuw nsw i32 %16, %8
%18 = sext i16 %2 to i32
%19 = mul nsw i32 %16, %18
%20 = sdiv i16 %2, 2
%21 = sitofp i16 %20 to double
%22 = fadd double %21, 5.000000e-01
%23 = fptosi double %22 to i16
%24 = tail call i8* @floor(i16 signext %23)
%25 = sdiv i16 %3, 2
%26 = sitofp i16 %25 to double
%27 = fadd double %26, 5.000000e-01
%28 = fptosi double %27 to i16
%29 = tail call i8* @floor(i16 signext %28)
%30 = load double, double* @M_PI
%31 = fmul double %30, %5
%32 = fdiv double %31, 1.800000e+02
%33 = tail call double @sin(double %32)
%34 = load double, double* @M_PI
%35 = fmul double %34, %5
%36 = fdiv double %35, 1.800000e+02
%37 = tail call double @cos(double %36)
%38 = icmp eq i16 %4, 0
br i1 %38, label %139, label %39
39: ; preds = %7
%40 = ptrtoint i8* %29 to i64
%41 = trunc i64 %40 to i32
%42 = ptrtoint i8* %24 to i64
%43 = trunc i64 %42 to i32
%44 = fneg double %33
%45 = and i32 %43, 65535
%46 = sitofp i32 %45 to double
%47 = and i32 %41, 65535
%48 = sitofp i32 %47 to double
br label %49
49: ; preds = %134, %39
%50 = phi i32 [ 0, %39 ], [ %137, %134 ]
%51 = trunc i32 %50 to i16
%52 = sub i16 %51, %15
%53 = sitofp i16 %52 to double
%54 = shl nsw i32 %50, 1
%55 = sext i32 %54 to i64
%56 = getelementptr inbounds i8, i8* %1, i64 %55
%57 = mul nsw i32 %50, 3
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds i8, i8* %1, i64 %58
%60 = shl nsw i32 %50, 2
%61 = sext i32 %60 to i64
%62 = getelementptr inbounds i8, i8* %1, i64 %61
br label %63
63: ; preds = %49, %129
%64 = phi i32 [ 0, %49 ], [ %132, %129 ]
%65 = trunc i32 %64 to i16
%66 = sub i16 %65, %15
%67 = sitofp i16 %66 to double
%68 = fmul double %44, %67
%69 = tail call double @llvm.fmuladd.f64(double %37, double %53, double %68)
%70 = fadd double %69, %46
%71 = fptosi double %70 to i16
%72 = sext i16 %71 to i32
%73 = icmp sgt i16 %71, -1
br i1 %73, label %74, label %129
74: ; preds = %63
%75 = fmul double %37, %67
%76 = tail call double @llvm.fmuladd.f64(double %33, double %53, double %75)
%77 = fadd double %76, %48
%78 = fptosi double %77 to i16
%79 = icmp slt i16 %71, %2
%80 = sext i16 %78 to i32
%81 = icmp sgt i16 %78, -1
%82 = select i1 %79, i1 %81, i1 false
%83 = icmp slt i16 %78, %3
%84 = select i1 %82, i1 %83, i1 false
br i1 %84, label %85, label %129
85: ; preds = %74
switch i8 %6, label %129 [
i8 4, label %86
i8 3, label %99
i8 2, label %116
]
86: ; preds = %85
%87 = shl nsw i32 %72, 2
%88 = zext i32 %87 to i64
%89 = getelementptr inbounds i8, i8* %0, i64 %88
%90 = mul i32 %19, %80
%91 = zext i32 %90 to i64
%92 = getelementptr inbounds i8, i8* %89, i64 %91
%93 = bitcast i8* %92 to i32*
%94 = load i32, i32* %93
%95 = mul i32 %64, %17
%96 = zext i32 %95 to i64
%97 = getelementptr inbounds i8, i8* %62, i64 %96
%98 = bitcast i8* %97 to i32*
store i32 %94, i32* %98
br label %129
99: ; preds = %85
%100 = mul nsw i32 %72, 3
%101 = zext i32 %100 to i64
%102 = getelementptr inbounds i8, i8* %0, i64 %101
%103 = mul i32 %19, %80
%104 = zext i32 %103 to i64
%105 = getelementptr inbounds i8, i8* %102, i64 %104
%106 = load i8, i8* %105
%107 = mul i32 %64, %17
%108 = zext i32 %107 to i64
%109 = getelementptr inbounds i8, i8* %59, i64 %108
store i8 %106, i8* %109
%110 = getelementptr inbounds i8, i8* %105, i64 1
%111 = load i8, i8* %110
%112 = getelementptr inbounds i8, i8* %109, i64 1
store i8 %111, i8* %112
%113 = getelementptr inbounds i8, i8* %105, i64 2
%114 = load i8, i8* %113
%115 = getelementptr inbounds i8, i8* %109, i64 2
store i8 %114, i8* %115
br label %129
116: ; preds = %85
%117 = shl nsw i32 %72, 1
%118 = zext i32 %117 to i64
%119 = getelementptr inbounds i8, i8* %0, i64 %118
%120 = mul i32 %19, %80
%121 = zext i32 %120 to i64
%122 = getelementptr inbounds i8, i8* %119, i64 %121
%123 = bitcast i8* %122 to i16*
%124 = load i16, i16* %123
%125 = mul i32 %64, %17
%126 = zext i32 %125 to i64
%127 = getelementptr inbounds i8, i8* %56, i64 %126
%128 = bitcast i8* %127 to i16*
store i16 %124, i16* %128
br label %129
129: ; preds = %86, %99, %116, %85, %74, %63
%130 = shl nsw i32 %64, 16
%131 = add i32 %130, 65536
%132 = ashr exact i32 %131, 16
%133 = icmp slt i32 %132, %8
br i1 %133, label %63, label %134
134: ; preds = %129
%135 = shl nsw i32 %50, 16
%136 = add i32 %135, 65536
%137 = ashr exact i32 %136, 16
%138 = icmp slt i32 %137, %8
br i1 %138, label %49, label %139
139: ; preds = %134, %7
ret void
}