int extend_options(int h, int map, int x, int y, int dx) {
  while (dx--) {
    if (x != dx && y != -x)
      map++;
  }
  return map;
}


x86 assembly (clang, -O0):
<extend_options>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x14(%rbp)
cmp    $0x0,%eax
je     1152 <extend_options+0x52>
mov    -0xc(%rbp),%eax
cmp    -0x14(%rbp),%eax
je     114d <extend_options+0x4d>
mov    -0x10(%rbp),%eax
xor    %ecx,%ecx
sub    -0xc(%rbp),%ecx
cmp    %ecx,%eax
je     114d <extend_options+0x4d>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    1114 <extend_options+0x14>
mov    -0x8(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<extend_options>:
mov    %esi,%eax
test   %r8d,%r8d
je     129c <extend_options+0x19c>
mov    %edx,%esi
neg    %esi
cmp    $0x8,%r8d
jb     1270 <extend_options+0x170>
xor    %edi,%edi
cmp    %ecx,%esi
setne  %dil
mov    %r8d,%r9d
and    $0xfffffff8,%r9d
movd   %r8d,%xmm0
pshufd $0x0,%xmm0,%xmm6
paddd  0xec6(%rip),%xmm6
movd   %eax,%xmm0
movd   %edx,%xmm2
pshufd $0x0,%xmm2,%xmm3
movd   %edi,%xmm2
pshufd $0x0,%xmm2,%xmm8
lea    -0x8(%r9),%eax
mov    %eax,%edi
shr    $0x3,%edi
add    $0x1,%edi
test   %eax,%eax
je     129d <extend_options+0x19d>
mov    %edi,%eax
and    $0xfffffffe,%eax
pxor   %xmm4,%xmm4
pcmpeqd %xmm9,%xmm9
movdqa 0xe94(%rip),%xmm10
movdqa 0xe9c(%rip),%xmm7
pand   %xmm8,%xmm7
movdqa 0xe9e(%rip),%xmm11
movdqa 0xea5(%rip),%xmm12
movdqa 0xead(%rip),%xmm2
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movdqa %xmm6,%xmm1
paddd  %xmm9,%xmm1
movdqa %xmm6,%xmm5
paddd  %xmm10,%xmm5
pcmpeqd %xmm3,%xmm1
pcmpeqd %xmm3,%xmm5
pandn  %xmm7,%xmm1
paddd  %xmm0,%xmm1
pandn  %xmm7,%xmm5
paddd  %xmm4,%xmm5
movdqa %xmm6,%xmm0
paddd  %xmm11,%xmm0
movdqa %xmm6,%xmm4
paddd  %xmm12,%xmm4
pcmpeqd %xmm3,%xmm0
pcmpeqd %xmm3,%xmm4
pandn  %xmm7,%xmm0
paddd  %xmm1,%xmm0
pandn  %xmm7,%xmm4
paddd  %xmm5,%xmm4
paddd  %xmm2,%xmm6
add    $0xfffffffe,%eax
jne    11b0 <extend_options+0xb0>
test   $0x1,%dil
je     124d <extend_options+0x14d>
pcmpeqd %xmm1,%xmm1
paddd  %xmm6,%xmm1
paddd  0xded(%rip),%xmm6
pcmpeqd %xmm3,%xmm1
pcmpeqd %xmm3,%xmm6
pandn  %xmm8,%xmm1
movdqa 0xde8(%rip),%xmm2
pand   %xmm2,%xmm1
paddd  %xmm1,%xmm0
pandn  %xmm8,%xmm6
pand   %xmm2,%xmm6
paddd  %xmm6,%xmm4
paddd  %xmm4,%xmm0
pshufd $0xee,%xmm0,%xmm1
paddd  %xmm0,%xmm1
pshufd $0x55,%xmm1,%xmm0
paddd  %xmm1,%xmm0
movd   %xmm0,%eax
cmp    %r8d,%r9d
je     129c <extend_options+0x19c>
and    $0x7,%r8d
add    $0x1,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
cmp    %ecx,%esi
setne  %dil
cmp    %r8d,%edx
setne  %r9b
and    %dil,%r9b
movzbl %r9b,%edi
add    %edi,%eax
add    $0xffffffff,%r8d
jne    1280 <extend_options+0x180>
ret
pxor   %xmm4,%xmm4
test   $0x1,%dil
jne    1213 <extend_options+0x113>
jmp    124d <extend_options+0x14d>

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

LLVM IR (-O2):
define i32 @extend_options(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = icmp eq i32 %4, 0
br i1 %6, label %97, label %7
7: ; preds = %5
%8 = sub nsw i32 0, %2
%9 = icmp ne i32 %8, %3
%10 = icmp ult i32 %4, 8
br i1 %10, label %85, label %11
11: ; preds = %7
%12 = and i32 %4, -8
%13 = and i32 %4, 7
%14 = insertelement <4 x i32> poison, i32 %4, i64 0
%15 = shufflevector <4 x i32> %14, <4 x i32> poison, <4 x i32> zeroinitializer
%16 = add <4 x i32> %15, <i32 0, i32 -1, i32 -2, i32 -3>
%17 = insertelement <4 x i32> <i32 poison, i32 0, i32 0, i32 0>, i32 %1, i64 0
%18 = insertelement <4 x i32> poison, i32 %2, i64 0
%19 = shufflevector <4 x i32> %18, <4 x i32> poison, <4 x i32> zeroinitializer
%20 = insertelement <4 x i32> poison, i32 %2, i64 0
%21 = shufflevector <4 x i32> %20, <4 x i32> poison, <4 x i32> zeroinitializer
%22 = insertelement <4 x i1> poison, i1 %9, i64 0
%23 = shufflevector <4 x i1> %22, <4 x i1> poison, <4 x i32> zeroinitializer
%24 = insertelement <4 x i1> poison, i1 %9, i64 0
%25 = shufflevector <4 x i1> %24, <4 x i1> poison, <4 x i32> zeroinitializer
%26 = add i32 %12, -8
%27 = lshr exact i32 %26, 3
%28 = add nuw nsw i32 %27, 1
%29 = and i32 %28, 1
%30 = icmp eq i32 %26, 0
br i1 %30, label %61, label %31
31: ; preds = %11
%32 = and i32 %28, 1073741822
br label %33
33: ; preds = %33, %31
%34 = phi <4 x i32> [ %16, %31 ], [ %58, %33 ]
%35 = phi <4 x i32> [ %17, %31 ], [ %56, %33 ]
%36 = phi <4 x i32> [ zeroinitializer, %31 ], [ %57, %33 ]
%37 = phi i32 [ 0, %31 ], [ %59, %33 ]
%38 = add nsw <4 x i32> %34, <i32 -1, i32 -1, i32 -1, i32 -1>
%39 = add <4 x i32> %34, <i32 -5, i32 -5, i32 -5, i32 -5>
%40 = icmp ne <4 x i32> %38, %19
%41 = icmp ne <4 x i32> %39, %21
%42 = select <4 x i1> %40, <4 x i1> %23, <4 x i1> zeroinitializer
%43 = select <4 x i1> %41, <4 x i1> %25, <4 x i1> zeroinitializer
%44 = zext <4 x i1> %42 to <4 x i32>
%45 = zext <4 x i1> %43 to <4 x i32>
%46 = add <4 x i32> %35, %44
%47 = add <4 x i32> %36, %45
%48 = add <4 x i32> %34, <i32 -9, i32 -9, i32 -9, i32 -9>
%49 = add <4 x i32> %34, <i32 -13, i32 -13, i32 -13, i32 -13>
%50 = icmp ne <4 x i32> %48, %19
%51 = icmp ne <4 x i32> %49, %21
%52 = select <4 x i1> %50, <4 x i1> %23, <4 x i1> zeroinitializer
%53 = select <4 x i1> %51, <4 x i1> %25, <4 x i1> zeroinitializer
%54 = zext <4 x i1> %52 to <4 x i32>
%55 = zext <4 x i1> %53 to <4 x i32>
%56 = add <4 x i32> %46, %54
%57 = add <4 x i32> %47, %55
%58 = add <4 x i32> %34, <i32 -16, i32 -16, i32 -16, i32 -16>
%59 = add i32 %37, 2
%60 = icmp eq i32 %59, %32
br i1 %60, label %61, label %33
61: ; preds = %33, %11
%62 = phi <4 x i32> [ undef, %11 ], [ %56, %33 ]
%63 = phi <4 x i32> [ undef, %11 ], [ %57, %33 ]
%64 = phi <4 x i32> [ %16, %11 ], [ %58, %33 ]
%65 = phi <4 x i32> [ %17, %11 ], [ %56, %33 ]
%66 = phi <4 x i32> [ zeroinitializer, %11 ], [ %57, %33 ]
%67 = icmp eq i32 %29, 0
br i1 %67, label %79, label %68
68: ; preds = %61
%69 = add nsw <4 x i32> %64, <i32 -1, i32 -1, i32 -1, i32 -1>
%70 = add <4 x i32> %64, <i32 -5, i32 -5, i32 -5, i32 -5>
%71 = icmp ne <4 x i32> %69, %19
%72 = icmp ne <4 x i32> %70, %21
%73 = select <4 x i1> %71, <4 x i1> %23, <4 x i1> zeroinitializer
%74 = select <4 x i1> %72, <4 x i1> %25, <4 x i1> zeroinitializer
%75 = zext <4 x i1> %73 to <4 x i32>
%76 = zext <4 x i1> %74 to <4 x i32>
%77 = add <4 x i32> %65, %75
%78 = add <4 x i32> %66, %76
br label %79
79: ; preds = %61, %68
%80 = phi <4 x i32> [ %62, %61 ], [ %77, %68 ]
%81 = phi <4 x i32> [ %63, %61 ], [ %78, %68 ]
%82 = add <4 x i32> %81, %80
%83 = call i32 @llvm.vector.reduce.add.v4i32(<4 x i32> %82)
%84 = icmp eq i32 %12, %4
br i1 %84, label %97, label %85
85: ; preds = %7, %79
%86 = phi i32 [ %4, %7 ], [ %13, %79 ]
%87 = phi i32 [ %1, %7 ], [ %83, %79 ]
br label %88
88: ; preds = %85, %88
%89 = phi i32 [ %91, %88 ], [ %86, %85 ]
%90 = phi i32 [ %95, %88 ], [ %87, %85 ]
%91 = add nsw i32 %89, -1
%92 = icmp ne i32 %91, %2
%93 = select i1 %92, i1 %9, i1 false
%94 = zext i1 %93 to i32
%95 = add nsw i32 %90, %94
%96 = icmp eq i32 %91, 0
br i1 %96, label %97, label %88
97: ; preds = %88, %79, %5
%98 = phi i32 [ %1, %5 ], [ %83, %79 ], [ %95, %88 ]
ret i32 %98
}