int exact_square(int number) {
  int count = 0;
  int value = 0;
  for (count = 0; count <= number / 2; count++) {
    if (count * count == number) {
      value = 1;
    }
  }
  return value;
}


x86 assembly (clang, -O0):
<exact_square>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
movl   $0x0,-0x8(%rbp)
movl   $0x0,-0xc(%rbp)
movl   $0x0,-0x8(%rbp)
mov    -0x8(%rbp),%eax
mov    %eax,-0x10(%rbp)
mov    -0x4(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x10(%rbp),%eax
cmp    %ecx,%eax
jg     1164 <exact_square+0x64>
mov    -0x8(%rbp),%eax
imul   -0x8(%rbp),%eax
cmp    -0x4(%rbp),%eax
jne    1151 <exact_square+0x51>
movl   $0x1,-0xc(%rbp)
jmp    1156 <exact_square+0x56>
mov    -0x8(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x8(%rbp)
jmp    111c <exact_square+0x1c>
mov    -0xc(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<exact_square>:
xor    %eax,%eax
cmp    $0xffffffff,%edi
jl     1322 <exact_square+0x222>
mov    %edi,%r8d
shr    $0x1f,%r8d
add    %edi,%r8d
sar    %r8d
add    $0x1,%r8d
xor    %eax,%eax
mov    $0x0,%edx
cmp    $0x8,%r8d
jb     1301 <exact_square+0x201>
mov    %r8d,%edx
and    $0xfffffff8,%edx
movd   %edi,%xmm0
pshufd $0x0,%xmm0,%xmm12
lea    -0x8(%rdx),%esi
mov    %esi,%eax
shr    $0x3,%eax
add    $0x1,%eax
test   %esi,%esi
je     1323 <exact_square+0x223>
mov    %eax,%esi
and    $0xfffffffe,%esi
movdqa 0xea3(%rip),%xmm5
pxor   %xmm7,%xmm7
movdqa 0xea6(%rip),%xmm8
movdqa 0xead(%rip),%xmm9
movdqa 0xeb4(%rip),%xmm10
movdqa 0xebb(%rip),%xmm11
pxor   %xmm3,%xmm3
nopl   0x0(%rax)
movdqa %xmm5,%xmm6
paddd  %xmm8,%xmm6
movdqa %xmm5,%xmm2
pmuludq %xmm5,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm5,%xmm4
pmuludq %xmm4,%xmm4
pshufd $0xe8,%xmm4,%xmm4
punpckldq %xmm4,%xmm2
pshufd $0xf5,%xmm6,%xmm4
pmuludq %xmm6,%xmm6
pshufd $0xe8,%xmm6,%xmm6
pmuludq %xmm4,%xmm4
pshufd $0xe8,%xmm4,%xmm4
punpckldq %xmm4,%xmm6
pcmpeqd %xmm12,%xmm2
pcmpeqd %xmm12,%xmm6
movdqa %xmm5,%xmm4
paddd  %xmm9,%xmm4
movdqa %xmm5,%xmm1
paddd  %xmm10,%xmm1
pshufd $0xf5,%xmm4,%xmm0
pmuludq %xmm4,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pmuludq %xmm0,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm4
pshufd $0xf5,%xmm1,%xmm0
pmuludq %xmm1,%xmm1
pshufd $0xe8,%xmm1,%xmm1
pmuludq %xmm0,%xmm0
pshufd $0xe8,%xmm0,%xmm0
punpckldq %xmm0,%xmm1
pcmpeqd %xmm12,%xmm4
por    %xmm2,%xmm4
pcmpeqd %xmm12,%xmm1
por    %xmm6,%xmm1
movdqa %xmm4,%xmm6
pandn  %xmm7,%xmm6
psubd  %xmm4,%xmm6
movdqa %xmm1,%xmm2
pandn  %xmm3,%xmm2
psubd  %xmm1,%xmm2
paddd  %xmm11,%xmm5
movdqa %xmm6,%xmm7
movdqa %xmm2,%xmm3
add    $0xfffffffe,%esi
jne    1190 <exact_square+0x90>
test   $0x1,%al
je     12d5 <exact_square+0x1d5>
movdqa 0xd9f(%rip),%xmm0
paddd  %xmm5,%xmm0
pshufd $0xf5,%xmm5,%xmm1
pmuludq %xmm5,%xmm5
pshufd $0xe8,%xmm5,%xmm3
pmuludq %xmm1,%xmm1
pshufd $0xe8,%xmm1,%xmm1
punpckldq %xmm1,%xmm3
pshufd $0xf5,%xmm0,%xmm1
pmuludq %xmm0,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pmuludq %xmm1,%xmm1
pshufd $0xe8,%xmm1,%xmm1
punpckldq %xmm1,%xmm0
pcmpeqd %xmm12,%xmm3
pcmpeqd %xmm12,%xmm0
movdqa %xmm3,%xmm1
pandn  %xmm6,%xmm1
psubd  %xmm3,%xmm1
movdqa %xmm0,%xmm3
pandn  %xmm2,%xmm3
psubd  %xmm0,%xmm3
movdqa %xmm1,%xmm6
movdqa %xmm3,%xmm2
pxor   %xmm0,%xmm0
movdqa %xmm6,%xmm1
pcmpeqd %xmm0,%xmm1
pand   %xmm1,%xmm2
pandn  %xmm6,%xmm1
por    %xmm2,%xmm1
pcmpeqd %xmm0,%xmm1
movmskps %xmm1,%esi
xor    %eax,%eax
cmp    $0xf,%esi
setne  %al
cmp    %edx,%r8d
je     1322 <exact_square+0x222>
mov    $0x1,%esi
cs nopw 0x0(%rax,%rax,1)
mov    %edx,%ecx
imul   %edx,%ecx
cmp    %edi,%ecx
cmove  %esi,%eax
add    $0x1,%edx
cmp    %edx,%r8d
jne    1310 <exact_square+0x210>
ret
movdqa 0xcd5(%rip),%xmm5
pxor   %xmm6,%xmm6
pxor   %xmm2,%xmm2
test   $0x1,%al
jne    1269 <exact_square+0x169>
jmp    12d5 <exact_square+0x1d5>

LLVM IR (-O0):
define i32 @exact_square(i32 %0) {
%2 = alloca i32
%3 = alloca i32
%4 = alloca i32
store i32 %0, i32* %2
store i32 0, i32* %3
store i32 0, i32* %4
store i32 0, i32* %3
br label %5
5: ; preds = %18, %1
%6 = load i32, i32* %3
%7 = load i32, i32* %2
%8 = sdiv i32 %7, 2
%9 = icmp sle i32 %6, %8
br i1 %9, label %10, label %21
10: ; preds = %5
%11 = load i32, i32* %3
%12 = load i32, i32* %3
%13 = mul nsw i32 %11, %12
%14 = load i32, i32* %2
%15 = icmp eq i32 %13, %14
br i1 %15, label %16, label %17
16: ; preds = %10
store i32 1, i32* %4
br label %17
17: ; preds = %16, %10
br label %18
18: ; preds = %17
%19 = load i32, i32* %3
%20 = add nsw i32 %19, 1
store i32 %20, i32* %3
br label %5
21: ; preds = %5
%22 = load i32, i32* %4
ret i32 %22
}

LLVM IR (-O2):
define i32 @exact_square(i32 %0) {
%2 = icmp slt i32 %0, -1
br i1 %2, label %79, label %3
3: ; preds = %1
%4 = sdiv i32 %0, 2
%5 = add nsw i32 %4, 1
%6 = icmp ult i32 %5, 8
br i1 %6, label %68, label %7
7: ; preds = %3
%8 = and i32 %5, -8
%9 = insertelement <4 x i32> poison, i32 %0, i64 0
%10 = shufflevector <4 x i32> %9, <4 x i32> poison, <4 x i32> zeroinitializer
%11 = insertelement <4 x i32> poison, i32 %0, i64 0
%12 = shufflevector <4 x i32> %11, <4 x i32> poison, <4 x i32> zeroinitializer
%13 = add i32 %8, -8
%14 = lshr exact i32 %13, 3
%15 = add nuw nsw i32 %14, 1
%16 = and i32 %15, 1
%17 = icmp eq i32 %13, 0
br i1 %17, label %43, label %18
18: ; preds = %7
%19 = and i32 %15, 1073741822
br label %20
20: ; preds = %20, %18
%21 = phi <4 x i32> [ zeroinitializer, %18 ], [ %37, %20 ]
%22 = phi <4 x i32> [ zeroinitializer, %18 ], [ %39, %20 ]
%23 = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %18 ], [ %40, %20 ]
%24 = phi i32 [ 0, %18 ], [ %41, %20 ]
%25 = add <4 x i32> %23, <i32 4, i32 4, i32 4, i32 4>
%26 = mul nsw <4 x i32> %23, %23
%27 = mul nsw <4 x i32> %25, %25
%28 = icmp eq <4 x i32> %26, %10
%29 = icmp eq <4 x i32> %27, %12
%30 = add <4 x i32> %23, <i32 8, i32 8, i32 8, i32 8>
%31 = add <4 x i32> %23, <i32 12, i32 12, i32 12, i32 12>
%32 = mul nsw <4 x i32> %30, %30
%33 = mul nsw <4 x i32> %31, %31
%34 = icmp eq <4 x i32> %32, %10
%35 = icmp eq <4 x i32> %33, %12
%36 = select <4 x i1> %34, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> %28
%37 = select <4 x i1> %36, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %21
%38 = select <4 x i1> %35, <4 x i1> <i1 true, i1 true, i1 true, i1 true>, <4 x i1> %29
%39 = select <4 x i1> %38, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %22
%40 = add <4 x i32> %23, <i32 16, i32 16, i32 16, i32 16>
%41 = add i32 %24, 2
%42 = icmp eq i32 %41, %19
br i1 %42, label %43, label %20
43: ; preds = %20, %7
%44 = phi <4 x i32> [ undef, %7 ], [ %37, %20 ]
%45 = phi <4 x i32> [ undef, %7 ], [ %39, %20 ]
%46 = phi <4 x i32> [ zeroinitializer, %7 ], [ %37, %20 ]
%47 = phi <4 x i32> [ zeroinitializer, %7 ], [ %39, %20 ]
%48 = phi <4 x i32> [ <i32 0, i32 1, i32 2, i32 3>, %7 ], [ %40, %20 ]
%49 = icmp eq i32 %16, 0
br i1 %49, label %58, label %50
50: ; preds = %43
%51 = add <4 x i32> %48, <i32 4, i32 4, i32 4, i32 4>
%52 = mul nsw <4 x i32> %48, %48
%53 = mul nsw <4 x i32> %51, %51
%54 = icmp eq <4 x i32> %52, %10
%55 = icmp eq <4 x i32> %53, %12
%56 = select <4 x i1> %54, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %46
%57 = select <4 x i1> %55, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> %47
br label %58
58: ; preds = %43, %50
%59 = phi <4 x i32> [ %44, %43 ], [ %56, %50 ]
%60 = phi <4 x i32> [ %45, %43 ], [ %57, %50 ]
%61 = icmp eq <4 x i32> %59, zeroinitializer
%62 = select <4 x i1> %61, <4 x i32> %60, <4 x i32> %59
%63 = icmp ne <4 x i32> %62, zeroinitializer
%64 = bitcast <4 x i1> %63 to i4
%65 = icmp ne i4 %64, 0
%66 = zext i1 %65 to i32
%67 = icmp eq i32 %5, %8
br i1 %67, label %79, label %68
68: ; preds = %3, %58
%69 = phi i32 [ 0, %3 ], [ %66, %58 ]
%70 = phi i32 [ 0, %3 ], [ %8, %58 ]
br label %71
71: ; preds = %68, %71
%72 = phi i32 [ %76, %71 ], [ %69, %68 ]
%73 = phi i32 [ %77, %71 ], [ %70, %68 ]
%74 = mul nsw i32 %73, %73
%75 = icmp eq i32 %74, %0
%76 = select i1 %75, i32 1, i32 %72
%77 = add nuw nsw i32 %73, 1
%78 = icmp eq i32 %73, %4
br i1 %78, label %79, label %71
79: ; preds = %71, %58, %1
%80 = phi i32 [ 0, %1 ], [ %66, %58 ], [ %76, %71 ]
ret i32 %80
}