long raster_numbers(long n) {
  const long max_n = 9;
  register long i;
  long A;
  if ((n < 0) || (n > max_n))
    return (0);
  A = 1;
  for (i = 1; i <= n; i++)
    A *= 2 * i;
  return (A);
}


x86 assembly (clang, -O0):
<raster_numbers>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
movq   $0x9,-0x18(%rbp)
cmpq   $0x0,-0x10(%rbp)
jl     1126 <raster_numbers+0x26>
cmpq   $0x9,-0x10(%rbp)
jle    1133 <raster_numbers+0x33>
movq   $0x0,-0x8(%rbp)
jmp    117b <raster_numbers+0x7b>
movq   $0x1,-0x28(%rbp)
movq   $0x1,-0x20(%rbp)
mov    -0x20(%rbp),%rax
cmp    -0x10(%rbp),%rax
jg     1173 <raster_numbers+0x73>
mov    -0x20(%rbp),%rax
shl    $0x1,%rax
imul   -0x28(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x20(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x20(%rbp)
jmp    1143 <raster_numbers+0x43>
mov    -0x28(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<raster_numbers>:
cmp    $0x9,%rdi
jbe    1109 <raster_numbers+0x9>
xor    %eax,%eax
ret
test   %rdi,%rdi
je     112b <raster_numbers+0x2b>
lea    -0x1(%rdi),%rax
mov    %edi,%r8d
and    $0x7,%r8d
cmp    $0x7,%rax
jae    1131 <raster_numbers+0x31>
mov    $0x1,%eax
mov    $0x1,%edx
jmp    11a2 <raster_numbers+0xa2>
mov    $0x1,%eax
ret
and    $0xfffffffffffffff8,%rdi
neg    %rdi
mov    $0x1,%eax
mov    $0x10,%esi
mov    $0x1,%edx
nopw   0x0(%rax,%rax,1)
lea    -0xe(%rsi),%r9
imul   %rax,%r9
lea    -0xc(%rsi),%rax
lea    -0xa(%rsi),%rcx
imul   %rcx,%rax
imul   %r9,%rax
lea    -0x8(%rsi),%r9
lea    -0x6(%rsi),%rcx
imul   %rcx,%r9
lea    -0x4(%rsi),%rcx
imul   %r9,%rcx
imul   %rax,%rcx
lea    -0x2(%rsi),%rax
imul   %rsi,%rax
imul   %rcx,%rax
add    $0x10,%rsi
lea    (%rdi,%rdx,1),%rcx
add    $0x8,%rcx
add    $0x8,%rdx
cmp    $0x1,%rcx
jne    1150 <raster_numbers+0x50>
test   %r8,%r8
je     11be <raster_numbers+0xbe>
add    %rdx,%rdx
nopw   0x0(%rax,%rax,1)
imul   %rdx,%rax
add    $0x2,%rdx
add    $0xffffffffffffffff,%r8
jne    11b0 <raster_numbers+0xb0>
ret

LLVM IR (-O0):
define i64 @raster_numbers(i64 %0) {
%2 = alloca i64
%3 = alloca i64
%4 = alloca i64
%5 = alloca i64
%6 = alloca i64
store i64 %0, i64* %3
store i64 9, i64* %4
%7 = load i64, i64* %3
%8 = icmp slt i64 %7, 0
br i1 %8, label %12, label %9
9: ; preds = %1
%10 = load i64, i64* %3
%11 = icmp sgt i64 %10, 9
br i1 %11, label %12, label %13
12: ; preds = %9, %1
store i64 0, i64* %2
br label %28
13: ; preds = %9
store i64 1, i64* %6
store i64 1, i64* %5
br label %14
14: ; preds = %23, %13
%15 = load i64, i64* %5
%16 = load i64, i64* %3
%17 = icmp sle i64 %15, %16
br i1 %17, label %18, label %26
18: ; preds = %14
%19 = load i64, i64* %5
%20 = mul nsw i64 2, %19
%21 = load i64, i64* %6
%22 = mul nsw i64 %21, %20
store i64 %22, i64* %6
br label %23
23: ; preds = %18
%24 = load i64, i64* %5
%25 = add nsw i64 %24, 1
store i64 %25, i64* %5
br label %14
26: ; preds = %14
%27 = load i64, i64* %6
store i64 %27, i64* %2
br label %28
28: ; preds = %26, %12
%29 = load i64, i64* %2
ret i64 %29
}

LLVM IR (-O2):
define i64 @raster_numbers(i64 %0) {
%2 = icmp ugt i64 %0, 9
br i1 %2, label %55, label %3
3: ; preds = %1
%4 = icmp eq i64 %0, 0
br i1 %4, label %55, label %5
5: ; preds = %3
%6 = add i64 %0, -1
%7 = and i64 %0, 7
%8 = icmp ult i64 %6, 7
br i1 %8, label %41, label %9
9: ; preds = %5
%10 = and i64 %0, -8
br label %11
11: ; preds = %11, %9
%12 = phi i64 [ 1, %9 ], [ %37, %11 ]
%13 = phi i64 [ 1, %9 ], [ %38, %11 ]
%14 = phi i64 [ 0, %9 ], [ %39, %11 ]
%15 = shl nuw nsw i64 %13, 1
%16 = mul nsw i64 %15, %12
%17 = shl i64 %13, 1
%18 = add i64 %17, 2
%19 = mul nsw i64 %18, %16
%20 = shl i64 %13, 1
%21 = add i64 %20, 4
%22 = mul nsw i64 %21, %19
%23 = shl i64 %13, 1
%24 = add i64 %23, 6
%25 = mul nsw i64 %24, %22
%26 = shl i64 %13, 1
%27 = add i64 %26, 8
%28 = mul nsw i64 %27, %25
%29 = shl i64 %13, 1
%30 = add i64 %29, 10
%31 = mul nsw i64 %30, %28
%32 = shl i64 %13, 1
%33 = add i64 %32, 12
%34 = mul nsw i64 %33, %31
%35 = shl i64 %13, 1
%36 = add i64 %35, 14
%37 = mul nsw i64 %36, %34
%38 = add nuw i64 %13, 8
%39 = add i64 %14, 8
%40 = icmp eq i64 %39, %10
br i1 %40, label %41, label %11
41: ; preds = %11, %5
%42 = phi i64 [ undef, %5 ], [ %37, %11 ]
%43 = phi i64 [ 1, %5 ], [ %37, %11 ]
%44 = phi i64 [ 1, %5 ], [ %38, %11 ]
%45 = icmp eq i64 %7, 0
br i1 %45, label %55, label %46
46: ; preds = %41, %46
%47 = phi i64 [ %51, %46 ], [ %43, %41 ]
%48 = phi i64 [ %52, %46 ], [ %44, %41 ]
%49 = phi i64 [ %53, %46 ], [ 0, %41 ]
%50 = shl nuw nsw i64 %48, 1
%51 = mul nsw i64 %50, %47
%52 = add nuw i64 %48, 1
%53 = add i64 %49, 1
%54 = icmp eq i64 %53, %7
br i1 %54, label %55, label %46
55: ; preds = %41, %46, %3, %1
%56 = phi i64 [ 0, %1 ], [ 1, %3 ], [ %42, %41 ], [ %51, %46 ]
ret i64 %56
}