#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 */
typedef int uint64_t;

/* Variables and functions */
scalar_t__ isnan(double);
double fmod(double x, double y) {
  union {
    double f;
    uint64_t i;
  } ux = {x}, uy = {y};
  int ex = ux.i >> 52 & 0x7ff;
  int ey = uy.i >> 52 & 0x7ff;
  int sx = ux.i >> 63;
  uint64_t i;
  uint64_t uxi = ux.i;
  if (uy.i << 1 == 0 || isnan(y) || ex == 0x7ff)
    return (x * y) / (x * y);
  if (uxi << 1 <= uy.i << 1) {
    if (uxi << 1 == uy.i << 1)
      return 0 * x;
    return x;
  }
  if (!ex) {
    for (i = uxi << 12; i >> 63 == 0; ex--, i <<= 1)
      ;
    uxi <<= -ex + 1;
  } else {
    uxi &= -1ULL >> 12;
    uxi |= 1ULL << 52;
  }
  if (!ey) {
    for (i = uy.i << 12; i >> 63 == 0; ey--, i <<= 1)
      ;
    uy.i <<= -ey + 1;
  } else {
    uy.i &= -1ULL >> 12;
    uy.i |= 1ULL << 52;
  }
  for (; ex > ey; ex--) {
    i = uxi - uy.i;
    if (i >> 63 == 0) {
      if (i == 0)
        return 0 * x;
      uxi = i;
    }
    uxi <<= 1;
  }
  i = uxi - uy.i;
  if (i >> 63 == 0) {
    if (i == 0)
      return 0 * x;
    uxi = i;
  }
  for (; uxi >> 52 == 0; uxi <<= 1, ex--)
    ;
  if (ex > 0) {
    uxi -= 1ULL << 52;
    uxi |= (uint64_t)ex << 52;
  } else {
    uxi >>= -ex + 1;
  }
  uxi |= (uint64_t)sx << 63;
  ux.i = uxi;
  return ux.f;
}


x86 assembly (clang, -O0):
<fmod>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x20(%rbp),%eax
mov    $0x34,%ecx
sar    %cl,%eax
and    $0x7ff,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
mov    $0x34,%ecx
sar    %cl,%eax
and    $0x7ff,%eax
mov    %eax,-0x30(%rbp)
mov    -0x20(%rbp),%eax
mov    $0x3f,%ecx
sar    %cl,%eax
mov    %eax,-0x34(%rbp)
mov    -0x20(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x28(%rbp),%eax
shl    $0x1,%eax
cmp    $0x0,%eax
je     119d <fmod+0x8d>
movsd  -0x18(%rbp),%xmm0
call   1030 <isnan@plt>
cmp    $0x0,%rax
jne    119d <fmod+0x8d>
cmpl   $0x7ff,-0x2c(%rbp)
jne    11bf <fmod+0xaf>
movsd  -0x10(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm1
mulsd  -0x18(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1441 <fmod+0x331>
mov    -0x3c(%rbp),%eax
shl    $0x1,%eax
mov    -0x28(%rbp),%ecx
shl    $0x1,%ecx
cmp    %ecx,%eax
jg     1208 <fmod+0xf8>
mov    -0x3c(%rbp),%eax
shl    $0x1,%eax
mov    -0x28(%rbp),%ecx
shl    $0x1,%ecx
cmp    %ecx,%eax
jne    11f9 <fmod+0xe9>
xorps  %xmm0,%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1441 <fmod+0x331>
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1441 <fmod+0x331>
cmpl   $0x0,-0x2c(%rbp)
jne    125f <fmod+0x14f>
mov    -0x3c(%rbp),%eax
shl    $0xc,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    $0x3f,%ecx
sar    %cl,%eax
cmp    $0x0,%eax
jne    124a <fmod+0x13a>
jmp    1233 <fmod+0x123>
mov    -0x2c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x38(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    121b <fmod+0x10b>
xor    %ecx,%ecx
sub    -0x2c(%rbp),%ecx
add    $0x1,%ecx
mov    -0x3c(%rbp),%eax
shl    %cl,%eax
mov    %eax,-0x3c(%rbp)
jmp    1287 <fmod+0x177>
movslq -0x3c(%rbp),%rax
movabs $0xfffffffffffff,%rcx
and    %rcx,%rax
mov    %eax,-0x3c(%rbp)
movslq -0x3c(%rbp),%rax
movabs $0x10000000000000,%rcx
or     %rcx,%rax
mov    %eax,-0x3c(%rbp)
cmpl   $0x0,-0x30(%rbp)
jne    12de <fmod+0x1ce>
mov    -0x28(%rbp),%eax
shl    $0xc,%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    $0x3f,%ecx
sar    %cl,%eax
cmp    $0x0,%eax
jne    12c9 <fmod+0x1b9>
jmp    12b2 <fmod+0x1a2>
mov    -0x30(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x30(%rbp)
mov    -0x38(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    129a <fmod+0x18a>
xor    %ecx,%ecx
sub    -0x30(%rbp),%ecx
add    $0x1,%ecx
mov    -0x28(%rbp),%eax
shl    %cl,%eax
mov    %eax,-0x28(%rbp)
jmp    1306 <fmod+0x1f6>
movslq -0x28(%rbp),%rax
movabs $0xfffffffffffff,%rcx
and    %rcx,%rax
mov    %eax,-0x28(%rbp)
movslq -0x28(%rbp),%rax
movabs $0x10000000000000,%rcx
or     %rcx,%rax
mov    %eax,-0x28(%rbp)
jmp    130b <fmod+0x1fb>
mov    -0x2c(%rbp),%eax
cmp    -0x30(%rbp),%eax
jle    136c <fmod+0x25c>
mov    -0x3c(%rbp),%eax
sub    -0x28(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    $0x3f,%ecx
sar    %cl,%eax
cmp    $0x0,%eax
jne    1355 <fmod+0x245>
cmpl   $0x0,-0x38(%rbp)
jne    134f <fmod+0x23f>
xorps  %xmm0,%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1441 <fmod+0x331>
mov    -0x38(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x2c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x2c(%rbp)
jmp    130b <fmod+0x1fb>
mov    -0x3c(%rbp),%eax
sub    -0x28(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    $0x3f,%ecx
sar    %cl,%eax
cmp    $0x0,%eax
jne    13aa <fmod+0x29a>
cmpl   $0x0,-0x38(%rbp)
jne    13a4 <fmod+0x294>
xorps  %xmm0,%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1441 <fmod+0x331>
mov    -0x38(%rbp),%eax
mov    %eax,-0x3c(%rbp)
jmp    13af <fmod+0x29f>
mov    -0x3c(%rbp),%eax
mov    $0x34,%ecx
sar    %cl,%eax
cmp    $0x0,%eax
jne    13de <fmod+0x2ce>
jmp    13c7 <fmod+0x2b7>
mov    -0x3c(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x2c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x2c(%rbp)
jmp    13af <fmod+0x29f>
cmpl   $0x0,-0x2c(%rbp)
jle    1411 <fmod+0x301>
movslq -0x3c(%rbp),%rax
movabs $0x10000000000000,%rcx
sub    %rcx,%rax
mov    %eax,-0x3c(%rbp)
mov    -0x2c(%rbp),%eax
mov    $0x34,%ecx
shl    %cl,%eax
or     -0x3c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
jmp    1421 <fmod+0x311>
xor    %ecx,%ecx
sub    -0x2c(%rbp),%ecx
add    $0x1,%ecx
mov    -0x3c(%rbp),%eax
sar    %cl,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x34(%rbp),%eax
mov    $0x3f,%ecx
shl    %cl,%eax
or     -0x3c(%rbp),%eax
mov    %eax,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
mov    %eax,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fmod>:
movq   %xmm1,%rax
test   $0x7fffffff,%eax
je     1145 <fmod+0x35>
sub    $0x18,%rsp
movsd  %xmm0,0x10(%rsp)
movdqa %xmm1,%xmm0
movq   %xmm1,0x8(%rsp)
call   1030 <isnan@plt>
movq   0x8(%rsp),%xmm1
movsd  0x10(%rsp),%xmm0
add    $0x18,%rsp
mulsd  %xmm1,%xmm0
divsd  %xmm0,%xmm0
ret

LLVM IR (-O0):
%union.anon = type { double }
define double @fmod(double %0, double %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca %union.anon
%7 = alloca %union.anon
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
store double %0, double* %4
store double %1, double* %5
%13 = bitcast %union.anon* %6 to double*
%14 = load double, double* %4
store double %14, double* %13
%15 = bitcast %union.anon* %7 to double*
%16 = load double, double* %5
store double %16, double* %15
%17 = bitcast %union.anon* %6 to i32*
%18 = load i32, i32* %17
%19 = ashr i32 %18, 52
%20 = and i32 %19, 2047
store i32 %20, i32* %8
%21 = bitcast %union.anon* %7 to i32*
%22 = load i32, i32* %21
%23 = ashr i32 %22, 52
%24 = and i32 %23, 2047
store i32 %24, i32* %9
%25 = bitcast %union.anon* %6 to i32*
%26 = load i32, i32* %25
%27 = ashr i32 %26, 63
store i32 %27, i32* %10
%28 = bitcast %union.anon* %6 to i32*
%29 = load i32, i32* %28
store i32 %29, i32* %12
%30 = bitcast %union.anon* %7 to i32*
%31 = load i32, i32* %30
%32 = shl i32 %31, 1
%33 = icmp eq i32 %32, 0
br i1 %33, label %41, label %34
34: ; preds = %2
%35 = load double, double* %5
%36 = call i64 @isnan(double %35)
%37 = icmp ne i64 %36, 0
br i1 %37, label %41, label %38
38: ; preds = %34
%39 = load i32, i32* %8
%40 = icmp eq i32 %39, 2047
br i1 %40, label %41, label %49
41: ; preds = %38, %34, %2
%42 = load double, double* %4
%43 = load double, double* %5
%44 = fmul double %42, %43
%45 = load double, double* %4
%46 = load double, double* %5
%47 = fmul double %45, %46
%48 = fdiv double %44, %47
store double %48, double* %3
br label %215
49: ; preds = %38
%50 = load i32, i32* %12
%51 = shl i32 %50, 1
%52 = bitcast %union.anon* %7 to i32*
%53 = load i32, i32* %52
%54 = shl i32 %53, 1
%55 = icmp sle i32 %51, %54
br i1 %55, label %56, label %68
56: ; preds = %49
%57 = load i32, i32* %12
%58 = shl i32 %57, 1
%59 = bitcast %union.anon* %7 to i32*
%60 = load i32, i32* %59
%61 = shl i32 %60, 1
%62 = icmp eq i32 %58, %61
br i1 %62, label %63, label %66
63: ; preds = %56
%64 = load double, double* %4
%65 = fmul double 0.000000e+00, %64
store double %65, double* %3
br label %215
66: ; preds = %56
%67 = load double, double* %4
store double %67, double* %3
br label %215
68: ; preds = %49
%69 = load i32, i32* %8
%70 = icmp ne i32 %69, 0
br i1 %70, label %90, label %71
71: ; preds = %68
%72 = load i32, i32* %12
%73 = shl i32 %72, 12
store i32 %73, i32* %11
br label %74
74: ; preds = %79, %71
%75 = load i32, i32* %11
%76 = ashr i32 %75, 63
%77 = icmp eq i32 %76, 0
br i1 %77, label %78, label %84
78: ; preds = %74
br label %79
79: ; preds = %78
%80 = load i32, i32* %8
%81 = add nsw i32 %80, -1
store i32 %81, i32* %8
%82 = load i32, i32* %11
%83 = shl i32 %82, 1
store i32 %83, i32* %11
br label %74
84: ; preds = %74
%85 = load i32, i32* %8
%86 = sub nsw i32 0, %85
%87 = add nsw i32 %86, 1
%88 = load i32, i32* %12
%89 = shl i32 %88, %87
store i32 %89, i32* %12
br label %99
90: ; preds = %68
%91 = load i32, i32* %12
%92 = sext i32 %91 to i64
%93 = and i64 %92, 4503599627370495
%94 = trunc i64 %93 to i32
store i32 %94, i32* %12
%95 = load i32, i32* %12
%96 = sext i32 %95 to i64
%97 = or i64 %96, 4503599627370496
%98 = trunc i64 %97 to i32
store i32 %98, i32* %12
br label %99
99: ; preds = %90, %84
%100 = load i32, i32* %9
%101 = icmp ne i32 %100, 0
br i1 %101, label %123, label %102
102: ; preds = %99
%103 = bitcast %union.anon* %7 to i32*
%104 = load i32, i32* %103
%105 = shl i32 %104, 12
store i32 %105, i32* %11
br label %106
106: ; preds = %111, %102
%107 = load i32, i32* %11
%108 = ashr i32 %107, 63
%109 = icmp eq i32 %108, 0
br i1 %109, label %110, label %116
110: ; preds = %106
br label %111
111: ; preds = %110
%112 = load i32, i32* %9
%113 = add nsw i32 %112, -1
store i32 %113, i32* %9
%114 = load i32, i32* %11
%115 = shl i32 %114, 1
store i32 %115, i32* %11
br label %106
116: ; preds = %106
%117 = load i32, i32* %9
%118 = sub nsw i32 0, %117
%119 = add nsw i32 %118, 1
%120 = bitcast %union.anon* %7 to i32*
%121 = load i32, i32* %120
%122 = shl i32 %121, %119
store i32 %122, i32* %120
br label %134
123: ; preds = %99
%124 = bitcast %union.anon* %7 to i32*
%125 = load i32, i32* %124
%126 = sext i32 %125 to i64
%127 = and i64 %126, 4503599627370495
%128 = trunc i64 %127 to i32
store i32 %128, i32* %124
%129 = bitcast %union.anon* %7 to i32*
%130 = load i32, i32* %129
%131 = sext i32 %130 to i64
%132 = or i64 %131, 4503599627370496
%133 = trunc i64 %132 to i32
store i32 %133, i32* %129
br label %134
134: ; preds = %123, %116
br label %135
135: ; preds = %158, %134
%136 = load i32, i32* %8
%137 = load i32, i32* %9
%138 = icmp sgt i32 %136, %137
br i1 %138, label %139, label %161
139: ; preds = %135
%140 = load i32, i32* %12
%141 = bitcast %union.anon* %7 to i32*
%142 = load i32, i32* %141
%143 = sub nsw i32 %140, %142
store i32 %143, i32* %11
%144 = load i32, i32* %11
%145 = ashr i32 %144, 63
%146 = icmp eq i32 %145, 0
br i1 %146, label %147, label %155
147: ; preds = %139
%148 = load i32, i32* %11
%149 = icmp eq i32 %148, 0
br i1 %149, label %150, label %153
150: ; preds = %147
%151 = load double, double* %4
%152 = fmul double 0.000000e+00, %151
store double %152, double* %3
br label %215
153: ; preds = %147
%154 = load i32, i32* %11
store i32 %154, i32* %12
br label %155
155: ; preds = %153, %139
%156 = load i32, i32* %12
%157 = shl i32 %156, 1
store i32 %157, i32* %12
br label %158
158: ; preds = %155
%159 = load i32, i32* %8
%160 = add nsw i32 %159, -1
store i32 %160, i32* %8
br label %135
161: ; preds = %135
%162 = load i32, i32* %12
%163 = bitcast %union.anon* %7 to i32*
%164 = load i32, i32* %163
%165 = sub nsw i32 %162, %164
store i32 %165, i32* %11
%166 = load i32, i32* %11
%167 = ashr i32 %166, 63
%168 = icmp eq i32 %167, 0
br i1 %168, label %169, label %177
169: ; preds = %161
%170 = load i32, i32* %11
%171 = icmp eq i32 %170, 0
br i1 %171, label %172, label %175
172: ; preds = %169
%173 = load double, double* %4
%174 = fmul double 0.000000e+00, %173
store double %174, double* %3
br label %215
175: ; preds = %169
%176 = load i32, i32* %11
store i32 %176, i32* %12
br label %177
177: ; preds = %175, %161
br label %178
178: ; preds = %183, %177
%179 = load i32, i32* %12
%180 = ashr i32 %179, 52
%181 = icmp eq i32 %180, 0
br i1 %181, label %182, label %188
182: ; preds = %178
br label %183
183: ; preds = %182
%184 = load i32, i32* %12
%185 = shl i32 %184, 1
store i32 %185, i32* %12
%186 = load i32, i32* %8
%187 = add nsw i32 %186, -1
store i32 %187, i32* %8
br label %178
188: ; preds = %178
%189 = load i32, i32* %8
%190 = icmp sgt i32 %189, 0
br i1 %190, label %191, label %200
191: ; preds = %188
%192 = load i32, i32* %12
%193 = sext i32 %192 to i64
%194 = sub i64 %193, 4503599627370496
%195 = trunc i64 %194 to i32
store i32 %195, i32* %12
%196 = load i32, i32* %8
%197 = shl i32 %196, 52
%198 = load i32, i32* %12
%199 = or i32 %198, %197
store i32 %199, i32* %12
br label %206
200: ; preds = %188
%201 = load i32, i32* %8
%202 = sub nsw i32 0, %201
%203 = add nsw i32 %202, 1
%204 = load i32, i32* %12
%205 = ashr i32 %204, %203
store i32 %205, i32* %12
br label %206
206: ; preds = %200, %191
%207 = load i32, i32* %10
%208 = shl i32 %207, 63
%209 = load i32, i32* %12
%210 = or i32 %209, %208
store i32 %210, i32* %12
%211 = load i32, i32* %12
%212 = bitcast %union.anon* %6 to i32*
store i32 %211, i32* %212
%213 = bitcast %union.anon* %6 to double*
%214 = load double, double* %213
store double %214, double* %3
br label %215
215: ; preds = %206, %172, %150, %66, %63, %41
%216 = load double, double* %3
ret double %216
}

LLVM IR (-O2):
define double @fmod(double %0, double %1) {
%3 = bitcast double %1 to i64
%4 = and i64 %3, 2147483647
%5 = icmp eq i64 %4, 0
br i1 %5, label %8, label %6
6: ; preds = %2
%7 = tail call i64 @isnan(double %1)
br label %8
8: ; preds = %2, %6
%9 = fmul double %0, %1
%10 = fdiv double %9, %9
ret double %10
}