#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__ ceil(scalar_t__);
int /*<<< orphan*/ fprintf(int /*<<< orphan*/, char *, int);
scalar_t__ sqrt(int);
int /*<<< orphan*/ stderr;
void hex_l2qr(int l, int *q, int *r) {
  int s, l0, dl, R, j;
  if (l == 0) {
    *q = 0;
    *r = 0;
    return;
  }
  R = (int)ceil(sqrt(l / 3.0 + 0.25) - 0.5);
  l0 = 3 * R * (R - 1) + 1;
  dl = l - l0;
  j = dl / R;
  switch (j) {
  case 0:
    *r = R;
    *q = -dl;
    break;
  case 1:
    *q = -R;
    s = dl - R;
    *r = -*q - s;
    break;
  case 2:
    s = R;
    *r = 2 * R - dl;
    *q = -*r - s;
    break;
  case 3:
    *r = -R;
    *q = dl - 3 * R;
    break;
  case 4:
    *q = R;
    s = 4 * R - dl;
    *r = -*q - s;
    break;
  case 5:
    s = -R;
    *r = dl - 5 * R;
    *q = -*r - s;
    break;
  default:
    fprintf(stderr, "j = %d is >5 or <0\n", j);
    break;
  }
}


x86 assembly (clang, -O0):
<hex_l2qr>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
cmpl   $0x0,-0x4(%rbp)
jne    1166 <hex_l2qr+0x36>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
jmp    12f7 <hex_l2qr+0x1c7>
cvtsi2sdl -0x4(%rbp),%xmm0
movsd  0xe8d(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  0xe89(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%edi
call   1050 <sqrt@plt>
cvtsi2sd %rax,%xmm0
movsd  0xe77(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%rdi
call   1030 <ceil@plt>
mov    %eax,-0x28(%rbp)
mov    -0x28(%rbp),%ecx
mov    %ecx,%eax
add    $0xffffffff,%eax
imul   %eax,%ecx
mov    %ecx,%eax
lea    0x1(%rax,%rax,2),%eax
mov    %eax,-0x20(%rbp)
mov    -0x4(%rbp),%eax
mov    -0x20(%rbp),%ecx
sub    %ecx,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
mov    -0x28(%rbp),%ecx
cltd
idiv   %ecx
mov    %eax,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
mov    %rax,-0x38(%rbp)
sub    $0x5,%rax
ja     12df <hex_l2qr+0x1af>
mov    -0x38(%rbp),%rax
lea    0xe27(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x28(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
xor    %ecx,%ecx
sub    -0x24(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
jmp    12f7 <hex_l2qr+0x1c7>
xor    %ecx,%ecx
sub    -0x28(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x24(%rbp),%eax
sub    -0x28(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
xor    %ecx,%ecx
sub    (%rax),%ecx
sub    -0x1c(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
jmp    12f7 <hex_l2qr+0x1c7>
mov    -0x28(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x28(%rbp),%ecx
shl    $0x1,%ecx
sub    -0x24(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
xor    %ecx,%ecx
sub    (%rax),%ecx
sub    -0x1c(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
jmp    12f7 <hex_l2qr+0x1c7>
xor    %ecx,%ecx
sub    -0x28(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x24(%rbp),%ecx
imul   $0x3,-0x28(%rbp),%eax
sub    %eax,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
jmp    12f7 <hex_l2qr+0x1c7>
mov    -0x28(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x28(%rbp),%eax
shl    $0x2,%eax
sub    -0x24(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
xor    %ecx,%ecx
sub    (%rax),%ecx
sub    -0x1c(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
jmp    12f7 <hex_l2qr+0x1c7>
xor    %eax,%eax
sub    -0x28(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x24(%rbp),%ecx
imul   $0x5,-0x28(%rbp),%eax
sub    %eax,%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x18(%rbp),%rax
xor    %ecx,%ecx
sub    (%rax),%ecx
sub    -0x1c(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
jmp    12f7 <hex_l2qr+0x1c7>
mov    0x2cfa(%rip),%rax
mov    (%rax),%edi
mov    -0x2c(%rbp),%edx
lea    0xd3e(%rip),%rsi
call   1040 <fprintf@plt>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<hex_l2qr>:
push   %rbp
push   %r14
push   %rbx
mov    %rdx,%r14
mov    %rsi,%rbx
test   %edi,%edi
je     11a8 <hex_l2qr+0x78>
mov    %edi,%ebp
cvtsi2sd %edi,%xmm0
divsd  0xeb4(%rip),%xmm0
addsd  0xeb4(%rip),%xmm0
cvttsd2si %xmm0,%edi
call   1050 <sqrt@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %rax,%xmm0
addsd  0xea3(%rip),%xmm0
cvttsd2si %xmm0,%rdi
call   1030 <ceil@plt>
mov    %rax,%rcx
lea    (%rax,%rax,2),%edi
lea    -0x1(%rax),%esi
imul   %edi,%esi
not    %esi
add    %ebp,%esi
mov    %esi,%eax
cltd
idiv   %ecx
cmp    $0x5,%eax
ja     11fe <hex_l2qr+0xce>
lea    0xe80(%rip),%rdx
movslq (%rdx,%rax,4),%rax
add    %rdx,%rax
jmp    *%rax
neg    %esi
mov    %ecx,(%r14)
jmp    11dd <hex_l2qr+0xad>
movl   $0x0,(%rbx)
movl   $0x0,(%r14)
jmp    11f9 <hex_l2qr+0xc9>
mov    %ecx,%eax
neg    %eax
mov    %eax,(%rbx)
add    %ecx,%ecx
sub    %esi,%ecx
mov    %ecx,(%r14)
jmp    11f9 <hex_l2qr+0xc9>
lea    (%rcx,%rcx,1),%eax
sub    %esi,%eax
mov    %eax,(%r14)
add    %ecx,%eax
neg    %eax
mov    %eax,(%rbx)
jmp    11f9 <hex_l2qr+0xc9>
neg    %ecx
mov    %ecx,(%r14)
sub    %edi,%esi
mov    %esi,(%rbx)
jmp    11f9 <hex_l2qr+0xc9>
mov    %ecx,(%rbx)
lea    (%rcx,%rcx,4),%eax
sub    %eax,%esi
mov    %esi,(%r14)
jmp    11f9 <hex_l2qr+0xc9>
lea    (%rcx,%rcx,4),%eax
sub    %eax,%esi
mov    %esi,(%r14)
sub    %esi,%ecx
mov    %ecx,(%rbx)
pop    %rbx
pop    %r14
pop    %rbp
ret
mov    0x2ddb(%rip),%rcx
mov    (%rcx),%edi
lea    0xe22(%rip),%rsi
mov    %eax,%edx
pop    %rbx
pop    %r14
pop    %rbp
jmp    1040 <fprintf@plt>

LLVM IR (-O0):
@stderr = global i32 0
@.str = [20 x i8] c"j = %d is >5 or <0\0A\00"
define void @hex_l2qr(i32 %0, i32* %1, i32* %2) {
%4 = alloca i32
%5 = alloca i32*
%6 = alloca i32*
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
store i32 %0, i32* %4
store i32* %1, i32** %5
store i32* %2, i32** %6
%12 = load i32, i32* %4
%13 = icmp eq i32 %12, 0
br i1 %13, label %14, label %17
14: ; preds = %3
%15 = load i32*, i32** %5
store i32 0, i32* %15
%16 = load i32*, i32** %6
store i32 0, i32* %16
br label %114
17: ; preds = %3
%18 = load i32, i32* %4
%19 = sitofp i32 %18 to double
%20 = fdiv double %19, 3.000000e+00
%21 = fadd double %20, 2.500000e-01
%22 = fptosi double %21 to i32
%23 = call i64 @sqrt(i32 %22)
%24 = sitofp i64 %23 to double
%25 = fsub double %24, 5.000000e-01
%26 = fptosi double %25 to i64
%27 = call i64 @ceil(i64 %26)
%28 = trunc i64 %27 to i32
store i32 %28, i32* %10
%29 = load i32, i32* %10
%30 = mul nsw i32 3, %29
%31 = load i32, i32* %10
%32 = sub nsw i32 %31, 1
%33 = mul nsw i32 %30, %32
%34 = add nsw i32 %33, 1
store i32 %34, i32* %8
%35 = load i32, i32* %4
%36 = load i32, i32* %8
%37 = sub nsw i32 %35, %36
store i32 %37, i32* %9
%38 = load i32, i32* %9
%39 = load i32, i32* %10
%40 = sdiv i32 %38, %39
store i32 %40, i32* %11
%41 = load i32, i32* %11
switch i32 %41, label %110 [
i32 0, label %42
i32 1, label %48
i32 2, label %61
i32 3, label %74
i32 4, label %83
i32 5, label %96
]
42: ; preds = %17
%43 = load i32, i32* %10
%44 = load i32*, i32** %6
store i32 %43, i32* %44
%45 = load i32, i32* %9
%46 = sub nsw i32 0, %45
%47 = load i32*, i32** %5
store i32 %46, i32* %47
br label %114
48: ; preds = %17
%49 = load i32, i32* %10
%50 = sub nsw i32 0, %49
%51 = load i32*, i32** %5
store i32 %50, i32* %51
%52 = load i32, i32* %9
%53 = load i32, i32* %10
%54 = sub nsw i32 %52, %53
store i32 %54, i32* %7
%55 = load i32*, i32** %5
%56 = load i32, i32* %55
%57 = sub nsw i32 0, %56
%58 = load i32, i32* %7
%59 = sub nsw i32 %57, %58
%60 = load i32*, i32** %6
store i32 %59, i32* %60
br label %114
61: ; preds = %17
%62 = load i32, i32* %10
store i32 %62, i32* %7
%63 = load i32, i32* %10
%64 = mul nsw i32 2, %63
%65 = load i32, i32* %9
%66 = sub nsw i32 %64, %65
%67 = load i32*, i32** %6
store i32 %66, i32* %67
%68 = load i32*, i32** %6
%69 = load i32, i32* %68
%70 = sub nsw i32 0, %69
%71 = load i32, i32* %7
%72 = sub nsw i32 %70, %71
%73 = load i32*, i32** %5
store i32 %72, i32* %73
br label %114
74: ; preds = %17
%75 = load i32, i32* %10
%76 = sub nsw i32 0, %75
%77 = load i32*, i32** %6
store i32 %76, i32* %77
%78 = load i32, i32* %9
%79 = load i32, i32* %10
%80 = mul nsw i32 3, %79
%81 = sub nsw i32 %78, %80
%82 = load i32*, i32** %5
store i32 %81, i32* %82
br label %114
83: ; preds = %17
%84 = load i32, i32* %10
%85 = load i32*, i32** %5
store i32 %84, i32* %85
%86 = load i32, i32* %10
%87 = mul nsw i32 4, %86
%88 = load i32, i32* %9
%89 = sub nsw i32 %87, %88
store i32 %89, i32* %7
%90 = load i32*, i32** %5
%91 = load i32, i32* %90
%92 = sub nsw i32 0, %91
%93 = load i32, i32* %7
%94 = sub nsw i32 %92, %93
%95 = load i32*, i32** %6
store i32 %94, i32* %95
br label %114
96: ; preds = %17
%97 = load i32, i32* %10
%98 = sub nsw i32 0, %97
store i32 %98, i32* %7
%99 = load i32, i32* %9
%100 = load i32, i32* %10
%101 = mul nsw i32 5, %100
%102 = sub nsw i32 %99, %101
%103 = load i32*, i32** %6
store i32 %102, i32* %103
%104 = load i32*, i32** %6
%105 = load i32, i32* %104
%106 = sub nsw i32 0, %105
%107 = load i32, i32* %7
%108 = sub nsw i32 %106, %107
%109 = load i32*, i32** %5
store i32 %108, i32* %109
br label %114
110: ; preds = %17
%111 = load i32, i32* @stderr
%112 = load i32, i32* %11
%113 = call i32 @fprintf(i32 %111, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i64 0, i64 0), i32 %112)
br label %114
114: ; preds = %14, %110, %96, %83, %74, %61, %48, %42
ret void
}

LLVM IR (-O2):
@stderr = global i32 0
@.str = [20 x i8] c"j = %d is >5 or <0\0A\00"
define void @hex_l2qr(i32 %0, i32* nocapture writeonly %1, i32* nocapture writeonly %2) {
%4 = icmp eq i32 %0, 0
br i1 %4, label %5, label %6
5: ; preds = %3
store i32 0, i32* %1
store i32 0, i32* %2
br label %47
6: ; preds = %3
%7 = sitofp i32 %0 to double
%8 = fdiv double %7, 3.000000e+00
%9 = fadd double %8, 2.500000e-01
%10 = fptosi double %9 to i32
%11 = tail call i64 @sqrt(i32 %10)
%12 = sitofp i64 %11 to double
%13 = fadd double %12, -5.000000e-01
%14 = fptosi double %13 to i64
%15 = tail call i64 @ceil(i64 %14)
%16 = trunc i64 %15 to i32
%17 = mul nsw i32 %16, 3
%18 = add nsw i32 %16, -1
%19 = mul nsw i32 %17, %18
%20 = xor i32 %19, -1
%21 = add i32 %20, %0
%22 = sdiv i32 %21, %16
switch i32 %22, label %44 [
i32 0, label %23
i32 1, label %25
i32 2, label %29
i32 3, label %34
i32 4, label %37
i32 5, label %40
]
23: ; preds = %6
%24 = sub i32 0, %21
store i32 %16, i32* %2
store i32 %24, i32* %1
br label %47
25: ; preds = %6
%26 = sub i32 0, %16
store i32 %26, i32* %1
%27 = shl i32 %16, 1
%28 = sub i32 %27, %21
store i32 %28, i32* %2
br label %47
29: ; preds = %6
%30 = shl nsw i32 %16, 1
%31 = sub nsw i32 %30, %21
store i32 %31, i32* %2
%32 = add i32 %31, %16
%33 = sub i32 0, %32
store i32 %33, i32* %1
br label %47
34: ; preds = %6
%35 = sub nsw i32 0, %16
store i32 %35, i32* %2
%36 = sub nsw i32 %21, %17
store i32 %36, i32* %1
br label %47
37: ; preds = %6
store i32 %16, i32* %1
%38 = mul i32 %16, -5
%39 = add i32 %38, %21
store i32 %39, i32* %2
br label %47
40: ; preds = %6
%41 = mul i32 %16, -5
%42 = add i32 %21, %41
store i32 %42, i32* %2
%43 = sub i32 %16, %42
store i32 %43, i32* %1
br label %47
44: ; preds = %6
%45 = load i32, i32* @stderr
%46 = tail call i32 @fprintf(i32 %45, i8* getelementptr inbounds ([20 x i8], [20 x i8]* @.str, i64 0, i64 0), i32 %22)
br label %47
47: ; preds = %23, %25, %29, %34, %37, %40, %44, %5
ret void
}