unsigned short nextprime(x)
unsigned short x;
{
  unsigned short half;
  unsigned short y;
  if (x == 2)
    return (2);
  if (x % 2 == 0)
    x++;
  while (1) {
    half = x / 2;
    for (y = 3; y < half; y += 2)
      if (x % y == 0)
        goto next;
    return (x);
  next:
    x += 2;
    if (x == 1)
      return (0);
  }
}


x86 assembly (clang, -O0):
<nextprime>:
push   %rbp
mov    %rsp,%rbp
mov    %di,%ax
mov    %ax,-0x4(%rbp)
movzwl -0x4(%rbp),%eax
cmp    $0x2,%eax
jne    1123 <nextprime+0x23>
movw   $0x2,-0x2(%rbp)
jmp    11d2 <nextprime+0xd2>
movzwl -0x4(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1144 <nextprime+0x44>
mov    -0x4(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x4(%rbp)
jmp    1149 <nextprime+0x49>
movzwl -0x4(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %ax,-0x6(%rbp)
movw   $0x3,-0x8(%rbp)
movzwl -0x8(%rbp),%eax
movzwl -0x6(%rbp),%ecx
cmp    %ecx,%eax
jge    119d <nextprime+0x9d>
movzwl -0x4(%rbp),%eax
movzwl -0x8(%rbp),%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1188 <nextprime+0x88>
jmp    11aa <nextprime+0xaa>
jmp    118d <nextprime+0x8d>
movzwl -0x8(%rbp),%eax
add    $0x2,%eax
mov    %ax,-0x8(%rbp)
jmp    115f <nextprime+0x5f>
mov    -0x4(%rbp),%ax
mov    %ax,-0x2(%rbp)
jmp    11d2 <nextprime+0xd2>
movzwl -0x4(%rbp),%eax
add    $0x2,%eax
mov    %ax,-0x4(%rbp)
movzwl -0x4(%rbp),%eax
cmp    $0x1,%eax
jne    11cd <nextprime+0xcd>
movw   $0x0,-0x2(%rbp)
jmp    11d2 <nextprime+0xd2>
jmp    1149 <nextprime+0x49>
movzwl -0x2(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<nextprime>:
mov    $0x2,%ax
cmp    $0x2,%di
jne    110b <nextprime+0xb>
ret
mov    %edi,%r8d
not    %r8d
and    $0x1,%r8d
add    %edi,%r8d
cmp    $0x8,%r8w
jb     115f <nextprime+0x5f>
movzwl %r8w,%ecx
mov    %ecx,%edi
shr    %edi
mov    $0x3,%esi
nopl   0x0(%rax)
mov    %ecx,%eax
xor    %edx,%edx
div    %esi
test   %edx,%edx
je     1150 <nextprime+0x50>
add    $0x2,%esi
movzwl %si,%esi
cmp    %edi,%esi
jb     1130 <nextprime+0x30>
jmp    115f <nextprime+0x5f>
cs nopw 0x0(%rax,%rax,1)
add    $0x2,%r8d
xor    %eax,%eax
cmp    $0x1,%r8w
jne    1118 <nextprime+0x18>
jmp    110a <nextprime+0xa>
mov    %r8d,%eax
ret

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

LLVM IR (-O2):
define zeroext i16 @nextprime(i32 %0) {
%2 = and i32 %0, 65535
%3 = icmp eq i32 %2, 2
br i1 %3, label %26, label %4
4: ; preds = %1
%5 = trunc i32 %0 to i16
%6 = and i16 %5, 1
%7 = xor i16 %6, 1
%8 = add i16 %7, %5
br label %9
9: ; preds = %23, %4
%10 = phi i16 [ %8, %4 ], [ %24, %23 ]
%11 = zext i16 %10 to i32
%12 = lshr i16 %10, 1
%13 = zext i16 %12 to i32
%14 = icmp ugt i16 %10, 7
br i1 %14, label %19, label %26
15: ; preds = %19
%16 = add nuw nsw i32 %20, 2
%17 = and i32 %16, 65535
%18 = icmp ult i32 %17, %13
br i1 %18, label %19, label %26
19: ; preds = %9, %15
%20 = phi i32 [ %17, %15 ], [ 3, %9 ]
%21 = urem i32 %11, %20
%22 = icmp eq i32 %21, 0
br i1 %22, label %23, label %15
23: ; preds = %19
%24 = add i16 %10, 2
%25 = icmp eq i16 %24, 1
br i1 %25, label %26, label %9
26: ; preds = %23, %9, %15, %1
%27 = phi i16 [ 2, %1 ], [ %10, %15 ], [ %10, %9 ], [ 0, %23 ]
ret i16 %27
}