// File: jkingan[P]ladyheather/heathmsc.cpp
// Function: next_tau(long, int)
long next_tau(long tau, int bin_scale)
{
long pow10;
long n;

    switch (bin_scale) {
       case 0 :    // all tau (not practical)
           return tau + 1;

       case 1 :    // one per decade
           return tau * 10;

       case 2 :    // one per octave  (1-2-4-8-16...)
           return tau * 2;

       case 3 :    // 3 dB
       case 4 :    // 1-2-4 decade
       case 5 :    // 1-2-5 decade
       case 8 :    // 1-2-4-8 decade
       case 10 :   // ten per decade
           space_bins:
           pow10 = 1;
           while(tau >= 10) {  // reduce the decade
               pow10 *= 10;
               tau /= 10;
           }

           if(bin_scale == 3) {
               if(tau == 3) return 10 * pow10;
               else         return 3 * pow10;
           }
           if((bin_scale == 4) && (tau == 4)) {
               return 10 * pow10;
           }
           if((bin_scale == 5) && (tau == 2)) {
               return 5 * pow10;
           }
           if((bin_scale == 8) && (tau == 8)) {
               return 10 * pow10;
           }
           if(bin_scale == 10) {
               return (tau + 1) * pow10;
           }
           return tau * 2 * pow10;

       case 29 :    // 29 nice round numbers per decade
           pow10 = 1;
           while(tau > 100) {  // reduce the decade
               pow10 *= 10;
               tau /= 10;
           }

           if(tau < 22) {
               return (tau + 1) * pow10;
           } 
           else if(tau < 40) {
               return (tau + 2) * pow10;
           } 
           else if(tau < 60) {
               return (tau + 5) * pow10;
           } 
           else {
               return (tau + 10) * pow10;
           }

       case 99 :   // logarithmically evenly spaced divisions
           n = (long) (log10((double) tau) * (double)bin_scale + 0.5) + 1;
           n = (long) pow(10.0, (double)n / (double)bin_scale);
           return (n > tau) ? n : tau + 1;

       default : 
          bin_scale = 5;    // 1-2-5 sequence
          goto space_bins;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x10(%rbp)
movl %esi, -0x14(%rbp)
movl -0x14(%rbp), %eax
movq %rax, -0x30(%rbp)
subq $0x63, %rax
ja 0x15eb71
movq -0x30(%rbp), %rax
leaq 0x30981(%rip), %rcx     # 0x18f2cc
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movq -0x10(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
imulq $0xa, -0x10(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
movq -0x10(%rbp), %rax
shlq %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
jmp 0x15e985
movq $0x1, -0x20(%rbp)
cmpq $0xa, -0x10(%rbp)
jl 0x15e9b1
imulq $0xa, -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movl $0xa, %ecx
cqto
idivq %rcx
movq %rax, -0x10(%rbp)
jmp 0x15e98d
cmpl $0x3, -0x14(%rbp)
jne 0x15e9da
cmpq $0x3, -0x10(%rbp)
jne 0x15e9cc
imulq $0xa, -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
imulq $0x3, -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
cmpl $0x4, -0x14(%rbp)
jne 0x15e9f5
cmpq $0x4, -0x10(%rbp)
jne 0x15e9f5
imulq $0xa, -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
cmpl $0x5, -0x14(%rbp)
jne 0x15ea10
cmpq $0x2, -0x10(%rbp)
jne 0x15ea10
imulq $0x5, -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
cmpl $0x8, -0x14(%rbp)
jne 0x15ea2b
cmpq $0x8, -0x10(%rbp)
jne 0x15ea2b
imulq $0xa, -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
cmpl $0xa, -0x14(%rbp)
jne 0x15ea47
movq -0x10(%rbp), %rax
addq $0x1, %rax
imulq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
movq -0x10(%rbp), %rax
shlq %rax
imulq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
movq $0x1, -0x20(%rbp)
cmpq $0x64, -0x10(%rbp)
jle 0x15ea88
imulq $0xa, -0x20(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rax
movl $0xa, %ecx
cqto
idivq %rcx
movq %rax, -0x10(%rbp)
jmp 0x15ea64
cmpq $0x16, -0x10(%rbp)
jge 0x15eaa5
movq -0x10(%rbp), %rax
addq $0x1, %rax
imulq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
cmpq $0x28, -0x10(%rbp)
jge 0x15eac2
movq -0x10(%rbp), %rax
addq $0x2, %rax
imulq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
cmpq $0x3c, -0x10(%rbp)
jge 0x15eadf
movq -0x10(%rbp), %rax
addq $0x5, %rax
imulq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
movq -0x10(%rbp), %rax
addq $0xa, %rax
imulq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
cvtsi2sdq -0x10(%rbp), %xmm0
callq 0x9160
cvtsi2sdl -0x14(%rbp), %xmm1
mulsd %xmm1, %xmm0
movsd 0x1057f(%rip), %xmm1    # 0x16f090
addsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
cvtsi2sdq -0x28(%rbp), %xmm1
cvtsi2sdl -0x14(%rbp), %xmm0
divsd %xmm0, %xmm1
movsd 0x10587(%rip), %xmm0    # 0x16f0c0
callq 0x9690
cvttsd2si %xmm0, %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x10(%rbp), %rax
jle 0x15eb5b
movq -0x28(%rbp), %rax
movq %rax, -0x38(%rbp)
jmp 0x15eb67
movq -0x10(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x15eb7d
movl $0x5, -0x14(%rbp)
jmp 0x15e985
movq -0x8(%rbp), %rax
addq $0x40, %rsp
popq %rbp
retq
nopw (%rax,%rax)