int get_forward_diag(unsigned long long board_l, unsigned long long board_u,
                     int diag) {
  int len = (diag < 10) ? (10 - diag) : (10 - diag / 10);
  int i;
  unsigned short res = 0;
  unsigned long long *board;
  int pos = diag;
  unsigned short mask = 0x1;
  for (i = 0; i < len; i++) {
    if (pos > 49)
      board = &board_u;
    else
      board = &board_l;
    res |= (*board >> (pos % 50)) & mask;
    pos += 10;
    mask <<= 1;
  }
  return res;
}


x86 assembly (clang, -O0):
<get_forward_diag>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
cmpl   $0xa,-0x14(%rbp)
jge    1129 <get_forward_diag+0x29>
mov    $0xa,%eax
sub    -0x14(%rbp),%eax
mov    %eax,-0x34(%rbp)
jmp    1140 <get_forward_diag+0x40>
mov    -0x14(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    $0xa,%eax
sub    %ecx,%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,-0x18(%rbp)
movw   $0x0,-0x1e(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x2c(%rbp)
movw   $0x1,-0x2e(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    11e0 <get_forward_diag+0xe0>
cmpl   $0x31,-0x2c(%rbp)
jle    1182 <get_forward_diag+0x82>
lea    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
jmp    118a <get_forward_diag+0x8a>
lea    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x28(%rbp),%rax
mov    (%rax),%rax
mov    %rax,-0x40(%rbp)
mov    -0x2c(%rbp),%eax
mov    $0x32,%ecx
cltd
idiv   %ecx
mov    -0x40(%rbp),%rax
mov    %edx,%ecx
shr    %cl,%rax
mov    %rax,%rcx
movzwl -0x2e(%rbp),%eax
and    %rax,%rcx
movzwl -0x1e(%rbp),%eax
or     %rcx,%rax
mov    %ax,-0x1e(%rbp)
mov    -0x2c(%rbp),%eax
add    $0xa,%eax
mov    %eax,-0x2c(%rbp)
movzwl -0x2e(%rbp),%eax
shl    $0x1,%eax
mov    %ax,-0x2e(%rbp)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    115f <get_forward_diag+0x5f>
movzwl -0x1e(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<get_forward_diag>:
mov    %edx,%ecx
cmp    $0xa,%edx
jl     1116 <get_forward_diag+0x16>
mov    %edx,%eax
mov    $0xcccccccd,%ecx
imul   %rax,%rcx
shr    $0x23,%rcx
xor    %eax,%eax
cmp    $0x9,%ecx
jg     1224 <get_forward_diag+0x124>
mov    $0xa,%eax
sub    %ecx,%eax
mov    $0x1,%r9d
cmp    $0x2,%eax
cmovge %eax,%r9d
jge    114e <get_forward_diag+0x4e>
xor    %r11d,%r11d
mov    $0x1,%r8w
test   $0x1,%r9b
jne    11f4 <get_forward_diag+0xf4>
jmp    1220 <get_forward_diag+0x120>
push   %rbp
push   %rbx
mov    %r9d,%r10d
and    $0x7ffffffe,%r10d
mov    $0x1,%r8w
xor    %r11d,%r11d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
cmp    $0x32,%edx
mov    %rdi,%rax
cmovge %rsi,%rax
movslq %edx,%rdx
imul   $0x51eb851f,%rdx,%rcx
mov    %rcx,%rbx
shr    $0x3f,%rbx
shr    $0x24,%rcx
add    %ebx,%ecx
imul   $0x32,%ecx,%ebx
mov    %edx,%ecx
sub    %ebx,%ecx
shr    %cl,%rax
and    %r8d,%eax
or     %eax,%r11d
lea    (%r8,%r8,1),%ebp
cmp    $0x28,%edx
mov    %rdi,%rbx
cmovge %rsi,%rbx
lea    0xa(%rdx),%ecx
movslq %ecx,%rcx
imul   $0x51eb851f,%rcx,%rcx
mov    %rcx,%rax
shr    $0x3f,%rax
shr    $0x24,%rcx
add    %eax,%ecx
imul   $0x32,%ecx,%eax
neg    %eax
lea    (%rdx,%rax,1),%ecx
add    $0xa,%ecx
shr    %cl,%rbx
and    %ebp,%ebx
or     %r11d,%ebx
mov    %ebx,%r11d
add    $0x14,%edx
shl    $0x2,%r8d
add    $0xfffffffe,%r10d
jne    1170 <get_forward_diag+0x70>
pop    %rbx
pop    %rbp
test   $0x1,%r9b
je     1220 <get_forward_diag+0x120>
cmp    $0x32,%edx
cmovge %rsi,%rdi
movslq %edx,%rcx
imul   $0x51eb851f,%rcx,%rax
mov    %rax,%rdx
shr    $0x3f,%rdx
shr    $0x24,%rax
add    %edx,%eax
imul   $0x32,%eax,%eax
sub    %eax,%ecx
shr    %cl,%rdi
and    %edi,%r8d
or     %r8d,%r11d
movzwl %r11w,%eax
ret

LLVM IR (-O0):
define i32 @get_forward_diag(i64 %0, i64 %1, i32 %2) {
%4 = alloca i64
%5 = alloca i64
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i16
%10 = alloca i64*
%11 = alloca i32
%12 = alloca i16
store i64 %0, i64* %4
store i64 %1, i64* %5
store i32 %2, i32* %6
%13 = load i32, i32* %6
%14 = icmp slt i32 %13, 10
br i1 %14, label %15, label %18
15: ; preds = %3
%16 = load i32, i32* %6
%17 = sub nsw i32 10, %16
br label %22
18: ; preds = %3
%19 = load i32, i32* %6
%20 = sdiv i32 %19, 10
%21 = sub nsw i32 10, %20
br label %22
22: ; preds = %18, %15
%23 = phi i32 [ %17, %15 ], [ %21, %18 ]
store i32 %23, i32* %7
store i16 0, i16* %9
%24 = load i32, i32* %6
store i32 %24, i32* %11
store i16 1, i16* %12
store i32 0, i32* %8
br label %25
25: ; preds = %54, %22
%26 = load i32, i32* %8
%27 = load i32, i32* %7
%28 = icmp slt i32 %26, %27
br i1 %28, label %29, label %57
29: ; preds = %25
%30 = load i32, i32* %11
%31 = icmp sgt i32 %30, 49
br i1 %31, label %32, label %33
32: ; preds = %29
store i64* %5, i64** %10
br label %34
33: ; preds = %29
store i64* %4, i64** %10
br label %34
34: ; preds = %33, %32
%35 = load i64*, i64** %10
%36 = load i64, i64* %35
%37 = load i32, i32* %11
%38 = srem i32 %37, 50
%39 = zext i32 %38 to i64
%40 = lshr i64 %36, %39
%41 = load i16, i16* %12
%42 = zext i16 %41 to i64
%43 = and i64 %40, %42
%44 = load i16, i16* %9
%45 = zext i16 %44 to i64
%46 = or i64 %45, %43
%47 = trunc i64 %46 to i16
store i16 %47, i16* %9
%48 = load i32, i32* %11
%49 = add nsw i32 %48, 10
store i32 %49, i32* %11
%50 = load i16, i16* %12
%51 = zext i16 %50 to i32
%52 = shl i32 %51, 1
%53 = trunc i32 %52 to i16
store i16 %53, i16* %12
br label %54
54: ; preds = %34
%55 = load i32, i32* %8
%56 = add nsw i32 %55, 1
store i32 %56, i32* %8
br label %25
57: ; preds = %25
%58 = load i16, i16* %9
%59 = zext i16 %58 to i32
ret i32 %59
}

LLVM IR (-O2):
define i32 @get_forward_diag(i64 %0, i64 %1, i32 %2) {
%4 = icmp slt i32 %2, 10
%5 = udiv i32 %2, 10
%6 = select i1 %4, i32 %2, i32 %5
%7 = icmp slt i32 %6, 10
br i1 %7, label %8, label %60
8: ; preds = %3
%9 = sub i32 10, %6
%10 = call i32 @llvm.smax.i32(i32 %9, i32 1)
%11 = and i32 %10, 1
%12 = icmp slt i32 %9, 2
br i1 %12, label %42, label %13
13: ; preds = %8
%14 = and i32 %10, 2147483646
br label %15
15: ; preds = %15, %13
%16 = phi i16 [ 1, %13 ], [ %39, %15 ]
%17 = phi i32 [ %2, %13 ], [ %38, %15 ]
%18 = phi i16 [ 0, %13 ], [ %37, %15 ]
%19 = phi i32 [ 0, %13 ], [ %40, %15 ]
%20 = icmp sgt i32 %17, 49
%21 = select i1 %20, i64 %1, i64 %0
%22 = srem i32 %17, 50
%23 = zext i32 %22 to i64
%24 = lshr i64 %21, %23
%25 = trunc i64 %24 to i16
%26 = and i16 %16, %25
%27 = or i16 %26, %18
%28 = add nsw i32 %17, 10
%29 = shl i16 %16, 1
%30 = icmp sgt i32 %17, 39
%31 = select i1 %30, i64 %1, i64 %0
%32 = srem i32 %28, 50
%33 = zext i32 %32 to i64
%34 = lshr i64 %31, %33
%35 = trunc i64 %34 to i16
%36 = and i16 %29, %35
%37 = or i16 %36, %27
%38 = add nsw i32 %17, 20
%39 = shl i16 %16, 2
%40 = add i32 %19, 2
%41 = icmp eq i32 %40, %14
br i1 %41, label %42, label %15
42: ; preds = %15, %8
%43 = phi i16 [ undef, %8 ], [ %37, %15 ]
%44 = phi i16 [ 1, %8 ], [ %39, %15 ]
%45 = phi i32 [ %2, %8 ], [ %38, %15 ]
%46 = phi i16 [ 0, %8 ], [ %37, %15 ]
%47 = icmp eq i32 %11, 0
br i1 %47, label %57, label %48
48: ; preds = %42
%49 = icmp sgt i32 %45, 49
%50 = select i1 %49, i64 %1, i64 %0
%51 = srem i32 %45, 50
%52 = zext i32 %51 to i64
%53 = lshr i64 %50, %52
%54 = trunc i64 %53 to i16
%55 = and i16 %44, %54
%56 = or i16 %55, %46
br label %57
57: ; preds = %42, %48
%58 = phi i16 [ %43, %42 ], [ %56, %48 ]
%59 = zext i16 %58 to i32
br label %60
60: ; preds = %57, %3
%61 = phi i32 [ 0, %3 ], [ %59, %57 ]
ret i32 %61
}