#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 */
float floor(float);
void FloorDivMod(float numer, float denom, int *quotient, int *rem) {
  int q, r;
  float x;
  if (numer >= 0.0) {
    x = floor(numer / denom);
    q = (int)x;
    r = (int)floor(numer - (x * denom));
  } else {
    x = floor(-numer / denom);
    q = -(int)x;
    r = (int)floor(-numer - (x * denom));
    if (r != 0) {
      q--;
      r = (int)denom - r;
    }
  }
  *quotient = q;
  *rem = r;
}


x86 assembly (clang, -O0):
<FloorDivMod>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jb     1191 <FloorDivMod+0x81>
movss  -0x4(%rbp),%xmm0
divss  -0x8(%rbp),%xmm0
call   1030 <floor@plt>
movss  %xmm0,-0x24(%rbp)
cvttss2si -0x24(%rbp),%eax
mov    %eax,-0x1c(%rbp)
movss  -0x4(%rbp),%xmm1
movss  -0x24(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
call   1030 <floor@plt>
cvttss2si %xmm0,%eax
mov    %eax,-0x20(%rbp)
jmp    121e <FloorDivMod+0x10e>
movss  -0x4(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
divss  -0x8(%rbp),%xmm0
call   1030 <floor@plt>
movss  %xmm0,-0x24(%rbp)
cvttss2si -0x24(%rbp),%ecx
xor    %eax,%eax
sub    %ecx,%eax
mov    %eax,-0x1c(%rbp)
movss  -0x4(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
movss  -0x24(%rbp),%xmm0
movss  -0x8(%rbp),%xmm2
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
call   1030 <floor@plt>
cvttss2si %xmm0,%eax
mov    %eax,-0x20(%rbp)
cmpl   $0x0,-0x20(%rbp)
je     1219 <FloorDivMod+0x109>
mov    -0x1c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x1c(%rbp)
cvttss2si -0x8(%rbp),%eax
sub    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    121e <FloorDivMod+0x10e>
mov    -0x1c(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<FloorDivMod>:
push   %rbp
push   %r14
push   %rbx
sub    $0x20,%rsp
mov    %rsi,%r14
mov    %rdi,%rbx
movaps %xmm0,%xmm2
xorps  %xmm0,%xmm0
ucomiss %xmm0,%xmm2
movss  %xmm1,0xc(%rsp)
movaps %xmm2,0x10(%rsp)
movaps %xmm2,%xmm0
jae    1177 <FloorDivMod+0x67>
xorps  0xec2(%rip),%xmm0
divss  %xmm1,%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%ebp
xorps  0xeae(%rip),%xmm0
mulss  0xc(%rsp),%xmm0
subss  0x10(%rsp),%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%ecx
test   %ecx,%ecx
je     11a1 <FloorDivMod+0x91>
not    %ebp
cvttss2si 0xc(%rsp),%eax
sub    %ecx,%eax
jmp    11a5 <FloorDivMod+0x95>
divss  %xmm1,%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%ebp
mulss  0xc(%rsp),%xmm0
movaps 0x10(%rsp),%xmm1
subss  %xmm0,%xmm1
movaps %xmm1,%xmm0
call   1030 <floorf@plt>
cvttss2si %xmm0,%eax
jmp    11a5 <FloorDivMod+0x95>
neg    %ebp
xor    %eax,%eax
mov    %ebp,(%rbx)
mov    %eax,(%r14)
add    $0x20,%rsp
pop    %rbx
pop    %r14
pop    %rbp
ret

LLVM IR (-O0):
define void @FloorDivMod(float %0, float %1, i32* %2, i32* %3) {
%5 = alloca float
%6 = alloca float
%7 = alloca i32*
%8 = alloca i32*
%9 = alloca i32
%10 = alloca i32
%11 = alloca float
store float %0, float* %5
store float %1, float* %6
store i32* %2, i32** %7
store i32* %3, i32** %8
%12 = load float, float* %5
%13 = fpext float %12 to double
%14 = fcmp oge double %13, 0.000000e+00
br i1 %14, label %15, label %29
15: ; preds = %4
%16 = load float, float* %5
%17 = load float, float* %6
%18 = fdiv float %16, %17
%19 = call float @floor(float %18)
store float %19, float* %11
%20 = load float, float* %11
%21 = fptosi float %20 to i32
store i32 %21, i32* %9
%22 = load float, float* %5
%23 = load float, float* %11
%24 = load float, float* %6
%25 = fneg float %23
%26 = call float @llvm.fmuladd.f32(float %25, float %24, float %22)
%27 = call float @floor(float %26)
%28 = fptosi float %27 to i32
store i32 %28, i32* %10
br label %56
29: ; preds = %4
%30 = load float, float* %5
%31 = fneg float %30
%32 = load float, float* %6
%33 = fdiv float %31, %32
%34 = call float @floor(float %33)
store float %34, float* %11
%35 = load float, float* %11
%36 = fptosi float %35 to i32
%37 = sub nsw i32 0, %36
store i32 %37, i32* %9
%38 = load float, float* %5
%39 = fneg float %38
%40 = load float, float* %11
%41 = load float, float* %6
%42 = fneg float %40
%43 = call float @llvm.fmuladd.f32(float %42, float %41, float %39)
%44 = call float @floor(float %43)
%45 = fptosi float %44 to i32
store i32 %45, i32* %10
%46 = load i32, i32* %10
%47 = icmp ne i32 %46, 0
br i1 %47, label %48, label %55
48: ; preds = %29
%49 = load i32, i32* %9
%50 = add nsw i32 %49, -1
store i32 %50, i32* %9
%51 = load float, float* %6
%52 = fptosi float %51 to i32
%53 = load i32, i32* %10
%54 = sub nsw i32 %52, %53
store i32 %54, i32* %10
br label %55
55: ; preds = %48, %29
br label %56
56: ; preds = %55, %15
%57 = load i32, i32* %9
%58 = load i32*, i32** %7
store i32 %57, i32* %58
%59 = load i32, i32* %10
%60 = load i32*, i32** %8
store i32 %59, i32* %60
ret void
}

LLVM IR (-O2):
define void @FloorDivMod(float %0, float %1, i32* nocapture writeonly %2, i32* nocapture writeonly %3) {
%5 = fcmp ult float %0, 0.000000e+00
br i1 %5, label %14, label %6
6: ; preds = %4
%7 = fdiv float %0, %1
%8 = tail call float @llvm.floor.f32(float %7)
%9 = fptosi float %8 to i32
%10 = fneg float %8
%11 = tail call float @llvm.fmuladd.f32(float %10, float %1, float %0)
%12 = tail call float @llvm.floor.f32(float %11)
%13 = fptosi float %12 to i32
br label %29
14: ; preds = %4
%15 = fneg float %0
%16 = fdiv float %15, %1
%17 = tail call float @llvm.floor.f32(float %16)
%18 = fptosi float %17 to i32
%19 = sub nsw i32 0, %18
%20 = fneg float %17
%21 = tail call float @llvm.fmuladd.f32(float %20, float %1, float %15)
%22 = tail call float @llvm.floor.f32(float %21)
%23 = fptosi float %22 to i32
%24 = icmp eq i32 %23, 0
br i1 %24, label %29, label %25
25: ; preds = %14
%26 = xor i32 %18, -1
%27 = fptosi float %1 to i32
%28 = sub nsw i32 %27, %23
br label %29
29: ; preds = %14, %25, %6
%30 = phi i32 [ %9, %6 ], [ %26, %25 ], [ %19, %14 ]
%31 = phi i32 [ %13, %6 ], [ %28, %25 ], [ 0, %14 ]
store i32 %30, i32* %2
store i32 %31, i32* %3
ret void
}