// File: myudelson[P]hmm-scalable/utils.cpp
// Function: doLog10Scale2D(double**, signed char, signed char)
NUMBER doLog10Scale2D(NUMBER **ar, NPAR size1, NPAR size2) {
	NPAR i,j;
	NUMBER min_10_scale = 1000, max_10_scale = 0, candidate;
	for(i=0; i<size1; i++)
		for(j=0; j<size2; j++) {
			if( fabs(ar[i][j]) < SAFETY ) // 0 gradient
				continue;
			candidate = floor( log10( fabs(ar[i][j]) ) );
			if(candidate < min_10_scale)
				min_10_scale = candidate;
			candidate = ceil( log10( fabs(ar[i][j]) ) );
			if(candidate > max_10_scale)
				max_10_scale = candidate;
		}
	min_10_scale++;
	max_10_scale++;
	if(max_10_scale >0 )
		for(i=0; i<size1; i++)
			for(j=0; j<size2; j++)
				ar[i][j] = ar[i][j] / pow(10, max_10_scale);
    //	if(min_10_scale<1000)
    //		for(i=0; i<size1; i++)
    //			for(j=0; j<size2; j++)
    //				ar[i][j] = ar[i][j] / pow(10, min_10_scale);
	return pow(10, max_10_scale);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x30, %rsp
movb %dl, %al
movb %sil, %cl
movq %rdi, -0x8(%rbp)
movb %cl, -0x9(%rbp)
movb %al, -0xa(%rbp)
movsd 0x45689(%rip), %xmm0    # 0x4fa28
movsd %xmm0, -0x18(%rbp)
xorps %xmm0, %xmm0
movsd %xmm0, -0x20(%rbp)
movb $0x0, -0xb(%rbp)
movsbl -0xb(%rbp), %eax
movsbl -0x9(%rbp), %ecx
cmpl %ecx, %eax
jge 0xa4b9
movb $0x0, -0xc(%rbp)
movsbl -0xc(%rbp), %eax
movsbl -0xa(%rbp), %ecx
cmpl %ecx, %eax
jge 0xa4aa
movq -0x8(%rbp), %rax
movsbq -0xb(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsbq -0xc(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm1
movaps 0x4569e(%rip), %xmm0    # 0x4fa90
pand %xmm0, %xmm1
movsd 0x45612(%rip), %xmm0    # 0x4fa10
ucomisd %xmm1, %xmm0
jbe 0xa409
jmp 0xa49d
movq -0x8(%rbp), %rax
movsbq -0xb(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsbq -0xc(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movaps 0x45669(%rip), %xmm1    # 0x4fa90
pand %xmm1, %xmm0
callq 0x5140
callq 0x5500
movsd %xmm0, -0x28(%rbp)
movsd -0x28(%rbp), %xmm1
movsd -0x18(%rbp), %xmm0
ucomisd %xmm1, %xmm0
jbe 0xa454
movsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x18(%rbp)
movq -0x8(%rbp), %rax
movsbq -0xb(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsbq -0xc(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movaps 0x4561e(%rip), %xmm1    # 0x4fa90
pand %xmm1, %xmm0
callq 0x5140
callq 0x50a0
movsd %xmm0, -0x28(%rbp)
movsd -0x28(%rbp), %xmm0
ucomisd -0x20(%rbp), %xmm0
jbe 0xa49b
movsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x20(%rbp)
jmp 0xa49d
movb -0xc(%rbp), %al
addb $0x1, %al
movb %al, -0xc(%rbp)
jmp 0xa3c4
jmp 0xa4ac
movb -0xb(%rbp), %al
addb $0x1, %al
movb %al, -0xb(%rbp)
jmp 0xa3b0
movsd 0x45547(%rip), %xmm0    # 0x4fa08
addsd -0x18(%rbp), %xmm0
movsd %xmm0, -0x18(%rbp)
movsd 0x45535(%rip), %xmm0    # 0x4fa08
addsd -0x20(%rbp), %xmm0
movsd %xmm0, -0x20(%rbp)
movsd -0x20(%rbp), %xmm0
xorps %xmm1, %xmm1
ucomisd %xmm1, %xmm0
jbe 0xa575
movb $0x0, -0xb(%rbp)
movsbl -0xb(%rbp), %eax
movsbl -0x9(%rbp), %ecx
cmpl %ecx, %eax
jge 0xa573
movb $0x0, -0xc(%rbp)
movsbl -0xc(%rbp), %eax
movsbl -0xa(%rbp), %ecx
cmpl %ecx, %eax
jge 0xa567
movq -0x8(%rbp), %rax
movsbq -0xb(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsbq -0xc(%rbp), %rcx
movsd (%rax,%rcx,8), %xmm0
movsd %xmm0, -0x30(%rbp)
movsd -0x20(%rbp), %xmm0
movl $0xa, %edi
callq 0xc7b0
movaps %xmm0, %xmm1
movsd -0x30(%rbp), %xmm0
divsd %xmm1, %xmm0
movq -0x8(%rbp), %rax
movsbq -0xb(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movsbq -0xc(%rbp), %rcx
movsd %xmm0, (%rax,%rcx,8)
movb -0xc(%rbp), %al
addb $0x1, %al
movb %al, -0xc(%rbp)
jmp 0xa503
jmp 0xa569
movb -0xb(%rbp), %al
addb $0x1, %al
movb %al, -0xb(%rbp)
jmp 0xa4f3
jmp 0xa575
movsd -0x20(%rbp), %xmm0
movl $0xa, %edi
callq 0xc7b0
addq $0x30, %rsp
popq %rbp
retq
nopw (%rax,%rax)