double fmod(double x, double y) {
  double zint, z;
  int i;
  z = x / y;
  zint = 0.0;
  while (z > 32768.0) {
    zint += 32768.0;
    z -= 32768;
  }
  while (z < -32768.0) {
    zint -= 32768.0;
    z += 32768.0;
  }
  i = (int)z;
  zint += (double)i;
  return (x - zint * y);
}


x86 assembly (clang, -O0):
<fmod>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  -0x8(%rbp),%xmm0
divsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  0xece(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1169 <fmod+0x69>
movsd  0xebc(%rip),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  0xea5(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1125 <fmod+0x25>
jmp    116e <fmod+0x6e>
movsd  0xe92(%rip),%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    11ae <fmod+0xae>
movsd  -0x18(%rbp),%xmm0
movsd  0xe72(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  0xe61(%rip),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    116e <fmod+0x6e>
cvttsd2si -0x20(%rbp),%eax
mov    %eax,-0x24(%rbp)
cvtsi2sdl -0x24(%rbp),%xmm0
addsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x8(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
movsd  -0x10(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<fmod>:
movapd %xmm0,%xmm2
divsd  %xmm1,%xmm2
xorpd  %xmm3,%xmm3
ucomisd 0xeec(%rip),%xmm2
jbe    113e <fmod+0x3e>
xorpd  %xmm3,%xmm3
movsd  0xede(%rip),%xmm4
movsd  0xede(%rip),%xmm5
nopw   0x0(%rax,%rax,1)
addsd  %xmm4,%xmm3
addsd  %xmm5,%xmm2
ucomisd %xmm4,%xmm2
ja     1130 <fmod+0x30>
movsd  0xec2(%rip),%xmm4
ucomisd %xmm2,%xmm4
jbe    116e <fmod+0x6e>
movsd  0xeac(%rip),%xmm5
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
addsd  %xmm4,%xmm3
addsd  %xmm5,%xmm2
ucomisd %xmm2,%xmm4
ja     1160 <fmod+0x60>
cvttpd2dq %xmm2,%xmm2
cvtdq2pd %xmm2,%xmm2
addsd  %xmm3,%xmm2
mulsd  %xmm1,%xmm2
subsd  %xmm2,%xmm0
ret

LLVM IR (-O0):
define double @fmod(double %0, double %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca i32
store double %0, double* %3
store double %1, double* %4
%8 = load double, double* %3
%9 = load double, double* %4
%10 = fdiv double %8, %9
store double %10, double* %6
store double 0.000000e+00, double* %5
br label %11
11: ; preds = %14, %2
%12 = load double, double* %6
%13 = fcmp ogt double %12, 3.276800e+04
br i1 %13, label %14, label %19
14: ; preds = %11
%15 = load double, double* %5
%16 = fadd double %15, 3.276800e+04
store double %16, double* %5
%17 = load double, double* %6
%18 = fsub double %17, 3.276800e+04
store double %18, double* %6
br label %11
19: ; preds = %11
br label %20
20: ; preds = %23, %19
%21 = load double, double* %6
%22 = fcmp olt double %21, -3.276800e+04
br i1 %22, label %23, label %28
23: ; preds = %20
%24 = load double, double* %5
%25 = fsub double %24, 3.276800e+04
store double %25, double* %5
%26 = load double, double* %6
%27 = fadd double %26, 3.276800e+04
store double %27, double* %6
br label %20
28: ; preds = %20
%29 = load double, double* %6
%30 = fptosi double %29 to i32
store i32 %30, i32* %7
%31 = load i32, i32* %7
%32 = sitofp i32 %31 to double
%33 = load double, double* %5
%34 = fadd double %33, %32
store double %34, double* %5
%35 = load double, double* %3
%36 = load double, double* %5
%37 = load double, double* %4
%38 = fneg double %36
%39 = call double @llvm.fmuladd.f64(double %38, double %37, double %35)
ret double %39
}

LLVM IR (-O2):
define double @fmod(double %0, double %1) {
%3 = fdiv double %0, %1
%4 = fcmp ogt double %3, 3.276800e+04
br i1 %4, label %9, label %5
5: ; preds = %9, %2
%6 = phi double [ %3, %2 ], [ %13, %9 ]
%7 = phi double [ 0.000000e+00, %2 ], [ %12, %9 ]
%8 = fcmp olt double %6, -3.276800e+04
br i1 %8, label %15, label %21
9: ; preds = %2, %9
%10 = phi double [ %12, %9 ], [ 0.000000e+00, %2 ]
%11 = phi double [ %13, %9 ], [ %3, %2 ]
%12 = fadd double %10, 3.276800e+04
%13 = fadd double %11, -3.276800e+04
%14 = fcmp ogt double %13, 3.276800e+04
br i1 %14, label %9, label %5
15: ; preds = %5, %15
%16 = phi double [ %18, %15 ], [ %7, %5 ]
%17 = phi double [ %19, %15 ], [ %6, %5 ]
%18 = fadd double %16, -3.276800e+04
%19 = fadd double %17, 3.276800e+04
%20 = fcmp olt double %19, -3.276800e+04
br i1 %20, label %15, label %21
21: ; preds = %15, %5
%22 = phi double [ %6, %5 ], [ %19, %15 ]
%23 = phi double [ %7, %5 ], [ %18, %15 ]
%24 = fptosi double %22 to i32
%25 = sitofp i32 %24 to double
%26 = fadd double %23, %25
%27 = fneg double %26
%28 = tail call double @llvm.fmuladd.f64(double %27, double %1, double %0)
ret double %28
}