int rotatecw(int d, int n) {
  int i;
  int d1;
  d1 = d;
  for (i = 0; i < n; i++) {
    d1 = (d1 << 1);
    if (d1 >= 16)
      d1 -= 15;
  }
  return d1;
}


x86 assembly (clang, -O0):
<rotatecw>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    -0x4(%rbp),%eax
mov    %eax,-0x10(%rbp)
movl   $0x0,-0xc(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x8(%rbp),%eax
jge    1152 <rotatecw+0x52>
mov    -0x10(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x10(%rbp)
cmpl   $0x10,-0x10(%rbp)
jl     113f <rotatecw+0x3f>
mov    -0x10(%rbp),%eax
sub    $0xf,%eax
mov    %eax,-0x10(%rbp)
jmp    1144 <rotatecw+0x44>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0xc(%rbp)
jmp    1117 <rotatecw+0x17>
mov    -0x10(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<rotatecw>:
mov    %edi,%eax
test   %esi,%esi
jle    1182 <rotatecw+0x82>
lea    -0x1(%rsi),%edx
mov    %esi,%ecx
and    $0x3,%ecx
cmp    $0x3,%edx
jb     115f <rotatecw+0x5f>
and    $0xfffffffc,%esi
cs nopw 0x0(%rax,%rax,1)
lea    (%rax,%rax,1),%edx
lea    0x0(,%rax,4),%edi
cmp    $0x10,%edx
lea    -0x1e(,%rax,4),%eax
cmovl  %edi,%eax
lea    (%rax,%rax,1),%edx
cmp    $0x10,%eax
lea    -0x1e(%rax,%rax,1),%eax
cmovl  %edx,%eax
lea    (%rax,%rax,1),%edx
cmp    $0x10,%eax
lea    -0x1e(%rax,%rax,1),%edi
cmovl  %edx,%edi
lea    -0xf(%rdi),%eax
cmp    $0x10,%edi
cmovl  %edi,%eax
add    $0xfffffffc,%esi
jne    1120 <rotatecw+0x20>
test   %ecx,%ecx
je     1182 <rotatecw+0x82>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
lea    (%rax,%rax,1),%edx
cmp    $0x10,%edx
lea    -0xf(%rax,%rax,1),%eax
cmovl  %edx,%eax
add    $0xffffffff,%ecx
jne    1170 <rotatecw+0x70>
ret

LLVM IR (-O0):
define i32 @rotatecw(i32 %0, i32 %1) {
%3 = alloca i32
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
store i32 %0, i32* %3
store i32 %1, i32* %4
%7 = load i32, i32* %3
store i32 %7, i32* %6
store i32 0, i32* %5
br label %8
8: ; preds = %21, %2
%9 = load i32, i32* %5
%10 = load i32, i32* %4
%11 = icmp slt i32 %9, %10
br i1 %11, label %12, label %24
12: ; preds = %8
%13 = load i32, i32* %6
%14 = shl i32 %13, 1
store i32 %14, i32* %6
%15 = load i32, i32* %6
%16 = icmp sge i32 %15, 16
br i1 %16, label %17, label %20
17: ; preds = %12
%18 = load i32, i32* %6
%19 = sub nsw i32 %18, 15
store i32 %19, i32* %6
br label %20
20: ; preds = %17, %12
br label %21
21: ; preds = %20
%22 = load i32, i32* %5
%23 = add nsw i32 %22, 1
store i32 %23, i32* %5
br label %8
24: ; preds = %8
%25 = load i32, i32* %6
ret i32 %25
}

LLVM IR (-O2):
define i32 @rotatecw(i32 %0, i32 %1) {
%3 = icmp sgt i32 %1, 0
br i1 %3, label %4, label %44
4: ; preds = %2
%5 = add i32 %1, -1
%6 = and i32 %1, 3
%7 = icmp ult i32 %5, 3
br i1 %7, label %31, label %8
8: ; preds = %4
%9 = and i32 %1, -4
br label %10
10: ; preds = %10, %8
%11 = phi i32 [ %0, %8 ], [ %28, %10 ]
%12 = phi i32 [ 0, %8 ], [ %29, %10 ]
%13 = shl i32 %11, 1
%14 = icmp sgt i32 %13, 15
%15 = shl i32 %11, 2
%16 = add i32 %15, -30
%17 = select i1 %14, i32 %16, i32 %15
%18 = icmp sgt i32 %17, 15
%19 = shl i32 %17, 1
%20 = add i32 %19, -30
%21 = select i1 %18, i32 %20, i32 %19
%22 = icmp sgt i32 %21, 15
%23 = shl i32 %21, 1
%24 = add i32 %23, -30
%25 = select i1 %22, i32 %24, i32 %23
%26 = icmp sgt i32 %25, 15
%27 = add nsw i32 %25, -15
%28 = select i1 %26, i32 %27, i32 %25
%29 = add i32 %12, 4
%30 = icmp eq i32 %29, %9
br i1 %30, label %31, label %10
31: ; preds = %10, %4
%32 = phi i32 [ undef, %4 ], [ %28, %10 ]
%33 = phi i32 [ %0, %4 ], [ %28, %10 ]
%34 = icmp eq i32 %6, 0
br i1 %34, label %44, label %35
35: ; preds = %31, %35
%36 = phi i32 [ %41, %35 ], [ %33, %31 ]
%37 = phi i32 [ %42, %35 ], [ 0, %31 ]
%38 = shl i32 %36, 1
%39 = icmp sgt i32 %38, 15
%40 = add nsw i32 %38, -15
%41 = select i1 %39, i32 %40, i32 %38
%42 = add i32 %37, 1
%43 = icmp eq i32 %42, %6
br i1 %43, label %44, label %35
44: ; preds = %31, %35, %2
%45 = phi i32 [ %0, %2 ], [ %32, %31 ], [ %41, %35 ]
ret i32 %45
}