#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
scalar_t__ fabs(double);
int is_ok(const double *val, long v[6], double basic_angle,
          double sub_division) {
  int i;
  int ok = 1;
  for (i = 0; i < 6; i++) {
    if (val[i] == -1e+100)
      v[i] = 0xffffffff;
    else {
      double d = (val[i] * sub_division) / basic_angle;
      double e;
      v[i] = d;
      e = (v[i] * basic_angle) / sub_division;
      if (fabs(e - val[i]) > 0) {
        ok = 0;
      }
    }
  }
  return ok;
}


x86 assembly (clang, -O0):
<is_ok>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movsd  %xmm0,-0x18(%rbp)
movsd  %xmm1,-0x20(%rbp)
movl   $0x1,-0x28(%rbp)
movl   $0x0,-0x24(%rbp)
cmpl   $0x6,-0x24(%rbp)
jge    1208 <is_ok+0xf8>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  0xea9(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    117d <is_ok+0x6d>
jp     117d <is_ok+0x6d>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    $0xffffffff,%edx
mov    %rdx,(%rax,%rcx,8)
jmp    11f5 <is_ok+0xe5>
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mulsd  -0x20(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
cvttsd2si -0x30(%rbp),%rdx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
cvtsi2sdq (%rax,%rcx,8),%xmm0
mulsd  -0x18(%rbp),%xmm0
divsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x24(%rbp),%rcx
subsd  (%rax,%rcx,8),%xmm0
call   1030 <fabs@plt>
cmp    $0x0,%rax
jle    11f0 <is_ok+0xe0>
movl   $0x0,-0x28(%rbp)
jmp    11f5 <is_ok+0xe5>
jmp    11fa <is_ok+0xea>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1138 <is_ok+0x28>
mov    -0x28(%rbp),%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<is_ok>:
push   %rbp
push   %r15
push   %r14
push   %rbx
sub    $0x18,%rsp
mov    %rsi,%rbx
mov    %rdi,%rbp
mov    $0xffffffff,%r15d
movsd  (%rdi),%xmm2
ucomisd 0xece(%rip),%xmm2
movsd  %xmm1,0x10(%rsp)
movsd  %xmm0,0x8(%rsp)
jne    114d <is_ok+0x3d>
jp     114d <is_ok+0x3d>
mov    %r15,(%rbx)
mov    $0x1,%r14d
jmp    1188 <is_ok+0x78>
movapd %xmm0,%xmm3
movapd %xmm2,%xmm0
mulsd  %xmm1,%xmm0
divsd  %xmm3,%xmm0
cvttsd2si %xmm0,%rax
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
mov    %rax,(%rbx)
mulsd  %xmm3,%xmm0
divsd  %xmm1,%xmm0
subsd  %xmm2,%xmm0
call   1030 <fabs@plt>
xor    %r14d,%r14d
test   %rax,%rax
setle  %r14b
movsd  0x8(%rbp),%xmm1
ucomisd 0xe6b(%rip),%xmm1
jne    119f <is_ok+0x8f>
jp     119f <is_ok+0x8f>
mov    %r15,0x8(%rbx)
jmp    11e2 <is_ok+0xd2>
movapd %xmm1,%xmm0
movsd  0x10(%rsp),%xmm2
mulsd  %xmm2,%xmm0
movsd  0x8(%rsp),%xmm3
divsd  %xmm3,%xmm0
cvttsd2si %xmm0,%rax
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
mov    %rax,0x8(%rbx)
mulsd  %xmm3,%xmm0
divsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
call   1030 <fabs@plt>
xor    %ecx,%ecx
test   %rax,%rax
cmovg  %ecx,%r14d
movsd  0x10(%rbp),%xmm1
ucomisd 0xe11(%rip),%xmm1
jne    11f9 <is_ok+0xe9>
jp     11f9 <is_ok+0xe9>
mov    %r15,0x10(%rbx)
jmp    123c <is_ok+0x12c>
movapd %xmm1,%xmm0
movsd  0x10(%rsp),%xmm2
mulsd  %xmm2,%xmm0
movsd  0x8(%rsp),%xmm3
divsd  %xmm3,%xmm0
cvttsd2si %xmm0,%rax
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
mov    %rax,0x10(%rbx)
mulsd  %xmm3,%xmm0
divsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
call   1030 <fabs@plt>
xor    %ecx,%ecx
test   %rax,%rax
cmovg  %ecx,%r14d
movsd  0x18(%rbp),%xmm1
ucomisd 0xdb7(%rip),%xmm1
jne    1253 <is_ok+0x143>
jp     1253 <is_ok+0x143>
mov    %r15,0x18(%rbx)
jmp    1296 <is_ok+0x186>
movapd %xmm1,%xmm0
movsd  0x10(%rsp),%xmm2
mulsd  %xmm2,%xmm0
movsd  0x8(%rsp),%xmm3
divsd  %xmm3,%xmm0
cvttsd2si %xmm0,%rax
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
mov    %rax,0x18(%rbx)
mulsd  %xmm3,%xmm0
divsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
call   1030 <fabs@plt>
xor    %ecx,%ecx
test   %rax,%rax
cmovg  %ecx,%r14d
movsd  0x20(%rbp),%xmm1
ucomisd 0xd5d(%rip),%xmm1
jne    12ad <is_ok+0x19d>
jp     12ad <is_ok+0x19d>
mov    %r15,0x20(%rbx)
jmp    12f0 <is_ok+0x1e0>
movapd %xmm1,%xmm0
movsd  0x10(%rsp),%xmm2
mulsd  %xmm2,%xmm0
movsd  0x8(%rsp),%xmm3
divsd  %xmm3,%xmm0
cvttsd2si %xmm0,%rax
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
mov    %rax,0x20(%rbx)
mulsd  %xmm3,%xmm0
divsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
call   1030 <fabs@plt>
xor    %ecx,%ecx
test   %rax,%rax
cmovg  %ecx,%r14d
movsd  0x28(%rbp),%xmm1
ucomisd 0xd03(%rip),%xmm1
jne    1307 <is_ok+0x1f7>
jp     1307 <is_ok+0x1f7>
mov    %r15,0x28(%rbx)
jmp    134a <is_ok+0x23a>
movapd %xmm1,%xmm0
movsd  0x10(%rsp),%xmm2
mulsd  %xmm2,%xmm0
movsd  0x8(%rsp),%xmm3
divsd  %xmm3,%xmm0
cvttsd2si %xmm0,%rax
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
mov    %rax,0x28(%rbx)
mulsd  %xmm3,%xmm0
divsd  %xmm2,%xmm0
subsd  %xmm1,%xmm0
call   1030 <fabs@plt>
xor    %ecx,%ecx
test   %rax,%rax
cmovg  %ecx,%r14d
mov    %r14d,%eax
add    $0x18,%rsp
pop    %rbx
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define i32 @is_ok(double* %0, i64* %1, double %2, double %3) {
%5 = alloca double*
%6 = alloca i64*
%7 = alloca double
%8 = alloca double
%9 = alloca i32
%10 = alloca i32
%11 = alloca double
%12 = alloca double
store double* %0, double** %5
store i64* %1, i64** %6
store double %2, double* %7
store double %3, double* %8
store i32 1, i32* %10
store i32 0, i32* %9
br label %13
13: ; preds = %66, %4
%14 = load i32, i32* %9
%15 = icmp slt i32 %14, 6
br i1 %15, label %16, label %69
16: ; preds = %13
%17 = load double*, double** %5
%18 = load i32, i32* %9
%19 = sext i32 %18 to i64
%20 = getelementptr inbounds double, double* %17, i64 %19
%21 = load double, double* %20
%22 = fcmp oeq double %21, -1.000000e+100
br i1 %22, label %23, label %28
23: ; preds = %16
%24 = load i64*, i64** %6
%25 = load i32, i32* %9
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds i64, i64* %24, i64 %26
store i64 4294967295, i64* %27
br label %65
28: ; preds = %16
%29 = load double*, double** %5
%30 = load i32, i32* %9
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds double, double* %29, i64 %31
%33 = load double, double* %32
%34 = load double, double* %8
%35 = fmul double %33, %34
%36 = load double, double* %7
%37 = fdiv double %35, %36
store double %37, double* %11
%38 = load double, double* %11
%39 = fptosi double %38 to i64
%40 = load i64*, i64** %6
%41 = load i32, i32* %9
%42 = sext i32 %41 to i64
%43 = getelementptr inbounds i64, i64* %40, i64 %42
store i64 %39, i64* %43
%44 = load i64*, i64** %6
%45 = load i32, i32* %9
%46 = sext i32 %45 to i64
%47 = getelementptr inbounds i64, i64* %44, i64 %46
%48 = load i64, i64* %47
%49 = sitofp i64 %48 to double
%50 = load double, double* %7
%51 = fmul double %49, %50
%52 = load double, double* %8
%53 = fdiv double %51, %52
store double %53, double* %12
%54 = load double, double* %12
%55 = load double*, double** %5
%56 = load i32, i32* %9
%57 = sext i32 %56 to i64
%58 = getelementptr inbounds double, double* %55, i64 %57
%59 = load double, double* %58
%60 = fsub double %54, %59
%61 = call i64 @fabs(double %60)
%62 = icmp sgt i64 %61, 0
br i1 %62, label %63, label %64
63: ; preds = %28
store i32 0, i32* %10
br label %64
64: ; preds = %63, %28
br label %65
65: ; preds = %64, %23
br label %66
66: ; preds = %65
%67 = load i32, i32* %9
%68 = add nsw i32 %67, 1
store i32 %68, i32* %9
br label %13
69: ; preds = %13
%70 = load i32, i32* %10
ret i32 %70
}

LLVM IR (-O2):
define i32 @is_ok(double* nocapture %0, i64* nocapture writeonly %1, double %2, double %3) {
%5 = load double, double* %0
%6 = fcmp oeq double %5, -1.000000e+100
br i1 %6, label %7, label %8
7: ; preds = %4
store i64 4294967295, i64* %1
br label %19
8: ; preds = %4
%9 = fmul double %5, %3
%10 = fdiv double %9, %2
%11 = fptosi double %10 to i64
store i64 %11, i64* %1
%12 = sitofp i64 %11 to double
%13 = fmul double %12, %2
%14 = fdiv double %13, %3
%15 = fsub double %14, %5
%16 = tail call i64 @fabs(double %15)
%17 = icmp slt i64 %16, 1
%18 = zext i1 %17 to i32
br label %19
19: ; preds = %7, %8
%20 = phi i32 [ 1, %7 ], [ %18, %8 ]
%21 = getelementptr inbounds double, double* %0, i64 1
%22 = load double, double* %21
%23 = fcmp oeq double %22, -1.000000e+100
br i1 %23, label %36, label %24
24: ; preds = %19
%25 = fmul double %22, %3
%26 = fdiv double %25, %2
%27 = fptosi double %26 to i64
%28 = getelementptr inbounds i64, i64* %1, i64 1
store i64 %27, i64* %28
%29 = sitofp i64 %27 to double
%30 = fmul double %29, %2
%31 = fdiv double %30, %3
%32 = fsub double %31, %22
%33 = tail call i64 @fabs(double %32)
%34 = icmp sgt i64 %33, 0
%35 = select i1 %34, i32 0, i32 %20
br label %38
36: ; preds = %19
%37 = getelementptr inbounds i64, i64* %1, i64 1
store i64 4294967295, i64* %37
br label %38
38: ; preds = %36, %24
%39 = phi i32 [ %20, %36 ], [ %35, %24 ]
%40 = getelementptr inbounds double, double* %0, i64 2
%41 = load double, double* %40
%42 = fcmp oeq double %41, -1.000000e+100
br i1 %42, label %55, label %43
43: ; preds = %38
%44 = fmul double %41, %3
%45 = fdiv double %44, %2
%46 = fptosi double %45 to i64
%47 = getelementptr inbounds i64, i64* %1, i64 2
store i64 %46, i64* %47
%48 = sitofp i64 %46 to double
%49 = fmul double %48, %2
%50 = fdiv double %49, %3
%51 = fsub double %50, %41
%52 = tail call i64 @fabs(double %51)
%53 = icmp sgt i64 %52, 0
%54 = select i1 %53, i32 0, i32 %39
br label %57
55: ; preds = %38
%56 = getelementptr inbounds i64, i64* %1, i64 2
store i64 4294967295, i64* %56
br label %57
57: ; preds = %55, %43
%58 = phi i32 [ %39, %55 ], [ %54, %43 ]
%59 = getelementptr inbounds double, double* %0, i64 3
%60 = load double, double* %59
%61 = fcmp oeq double %60, -1.000000e+100
br i1 %61, label %74, label %62
62: ; preds = %57
%63 = fmul double %60, %3
%64 = fdiv double %63, %2
%65 = fptosi double %64 to i64
%66 = getelementptr inbounds i64, i64* %1, i64 3
store i64 %65, i64* %66
%67 = sitofp i64 %65 to double
%68 = fmul double %67, %2
%69 = fdiv double %68, %3
%70 = fsub double %69, %60
%71 = tail call i64 @fabs(double %70)
%72 = icmp sgt i64 %71, 0
%73 = select i1 %72, i32 0, i32 %58
br label %76
74: ; preds = %57
%75 = getelementptr inbounds i64, i64* %1, i64 3
store i64 4294967295, i64* %75
br label %76
76: ; preds = %74, %62
%77 = phi i32 [ %58, %74 ], [ %73, %62 ]
%78 = getelementptr inbounds double, double* %0, i64 4
%79 = load double, double* %78
%80 = fcmp oeq double %79, -1.000000e+100
br i1 %80, label %93, label %81
81: ; preds = %76
%82 = fmul double %79, %3
%83 = fdiv double %82, %2
%84 = fptosi double %83 to i64
%85 = getelementptr inbounds i64, i64* %1, i64 4
store i64 %84, i64* %85
%86 = sitofp i64 %84 to double
%87 = fmul double %86, %2
%88 = fdiv double %87, %3
%89 = fsub double %88, %79
%90 = tail call i64 @fabs(double %89)
%91 = icmp sgt i64 %90, 0
%92 = select i1 %91, i32 0, i32 %77
br label %95
93: ; preds = %76
%94 = getelementptr inbounds i64, i64* %1, i64 4
store i64 4294967295, i64* %94
br label %95
95: ; preds = %93, %81
%96 = phi i32 [ %77, %93 ], [ %92, %81 ]
%97 = getelementptr inbounds double, double* %0, i64 5
%98 = load double, double* %97
%99 = fcmp oeq double %98, -1.000000e+100
br i1 %99, label %112, label %100
100: ; preds = %95
%101 = fmul double %98, %3
%102 = fdiv double %101, %2
%103 = fptosi double %102 to i64
%104 = getelementptr inbounds i64, i64* %1, i64 5
store i64 %103, i64* %104
%105 = sitofp i64 %103 to double
%106 = fmul double %105, %2
%107 = fdiv double %106, %3
%108 = fsub double %107, %98
%109 = tail call i64 @fabs(double %108)
%110 = icmp sgt i64 %109, 0
%111 = select i1 %110, i32 0, i32 %96
br label %114
112: ; preds = %95
%113 = getelementptr inbounds i64, i64* %1, i64 5
store i64 4294967295, i64* %113
br label %114
114: ; preds = %112, %100
%115 = phi i32 [ %96, %112 ], [ %111, %100 ]
ret i32 %115
}