// File: lucaong[P]elixir_mlx90640/src/MLX90640_API.cpp
// Function: MLX90640_BadPixelsCorrection(unsigned short*, float*, int, paramsMLX90640*)
void MLX90640_BadPixelsCorrection(uint16_t *pixels, float *to, int mode, paramsMLX90640 *params)
{   
    float ap[4];
    uint8_t pix;
    uint8_t line;
    uint8_t column;
    
    pix = 0;
    while(pixels[pix]< 65535)
    {
        line = pixels[pix]>>5;
        column = pixels[pix] - (line<<5);
        
        if(mode == 1)
        {        
            if(line == 0)
            {
                if(column == 0)
                {        
                    to[pixels[pix]] = to[33];                    
                }
                else if(column == 31)
                {
                    to[pixels[pix]] = to[62];                      
                }
                else
                {
                    to[pixels[pix]] = (to[pixels[pix]+31] + to[pixels[pix]+33])/2.0;                    
                }        
            }
            else if(line == 23)
            {
                if(column == 0)
                {
                    to[pixels[pix]] = to[705];                    
                }
                else if(column == 31)
                {
                    to[pixels[pix]] = to[734];                       
                }
                else
                {
                    to[pixels[pix]] = (to[pixels[pix]-33] + to[pixels[pix]-31])/2.0;                       
                }                       
            } 
            else if(column == 0)
            {
                to[pixels[pix]] = (to[pixels[pix]-31] + to[pixels[pix]+33])/2.0;                
            }
            else if(column == 31)
            {
                to[pixels[pix]] = (to[pixels[pix]-33] + to[pixels[pix]+31])/2.0;                
            } 
            else
            {
                ap[0] = to[pixels[pix]-33];
                ap[1] = to[pixels[pix]-31];
                ap[2] = to[pixels[pix]+31];
                ap[3] = to[pixels[pix]+33];
                to[pixels[pix]] = GetMedian(ap,4);
            }                   
        }
        else
        {        
            if(column == 0)
            {
                to[pixels[pix]] = to[pixels[pix]+1];            
            }
            else if(column == 1 || column == 30)
            {
                to[pixels[pix]] = (to[pixels[pix]-1]+to[pixels[pix]+1])/2.0;                
            } 
            else if(column == 31)
            {
                to[pixels[pix]] = to[pixels[pix]-1];
            } 
            else
            {
                if(IsPixelBad(pixels[pix]-2,params) == 0 && IsPixelBad(pixels[pix]+2,params) == 0)
                {
                    ap[0] = to[pixels[pix]+1] - to[pixels[pix]+2];
                    ap[1] = to[pixels[pix]-1] - to[pixels[pix]-2];
                    if(fabs(ap[0]) > fabs(ap[1]))
                    {
                        to[pixels[pix]] = to[pixels[pix]-1] + ap[1];                        
                    }
                    else
                    {
                        to[pixels[pix]] = to[pixels[pix]+1] + ap[0];                        
                    }
                }
                else
                {
                    to[pixels[pix]] = (to[pixels[pix]-1]+to[pixels[pix]+1])/2.0;                    
                }            
            }                      
        } 
        pix = pix + 1;    
    }    
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x40, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movl %edx, -0x14(%rbp)
movq %rcx, -0x20(%rbp)
movb $0x0, -0x31(%rbp)
movq -0x8(%rbp), %rax
movzbl -0x31(%rbp), %ecx
movzwl (%rax,%rcx,2), %eax
cmpl $0xffff, %eax           # imm = 0xFFFF
jge 0x5674
movq -0x8(%rbp), %rax
movzbl -0x31(%rbp), %ecx
movzwl (%rax,%rcx,2), %eax
sarl $0x5, %eax
movb %al, -0x32(%rbp)
movq -0x8(%rbp), %rax
movzbl -0x31(%rbp), %ecx
movzwl (%rax,%rcx,2), %eax
movzbl -0x32(%rbp), %ecx
shll $0x5, %ecx
subl %ecx, %eax
movb %al, -0x33(%rbp)
cmpl $0x1, -0x14(%rbp)
jne 0x53ba
movzbl -0x32(%rbp), %eax
cmpl $0x0, %eax
jne 0x5164
movzbl -0x33(%rbp), %eax
cmpl $0x0, %eax
jne 0x50d2
movq -0x10(%rbp), %rax
movss 0x84(%rax), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x515f
movzbl -0x33(%rbp), %eax
cmpl $0x1f, %eax
jne 0x50fe
movq -0x10(%rbp), %rax
movss 0xf8(%rax), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x515d
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
addl $0x1f, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
addl $0x21, %ecx
movslq %ecx, %rcx
addss (%rax,%rcx,4), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0xf90(%rip), %xmm1      # 0x60d0
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x515f
jmp 0x53b5
movzbl -0x32(%rbp), %eax
cmpl $0x17, %eax
jne 0x5232
movzbl -0x33(%rbp), %eax
cmpl $0x0, %eax
jne 0x51a0
movq -0x10(%rbp), %rax
movss 0xb04(%rax), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x522d
movzbl -0x33(%rbp), %eax
cmpl $0x1f, %eax
jne 0x51cc
movq -0x10(%rbp), %rax
movss 0xb78(%rax), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x522b
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
subl $0x21, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
subl $0x1f, %ecx
movslq %ecx, %rcx
addss (%rax,%rcx,4), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0xec2(%rip), %xmm1      # 0x60d0
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x522d
jmp 0x53b3
movzbl -0x33(%rbp), %eax
cmpl $0x0, %eax
jne 0x529f
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
subl $0x1f, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
addl $0x21, %ecx
movslq %ecx, %rcx
addss (%rax,%rcx,4), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0xe53(%rip), %xmm1      # 0x60d0
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x53b1
movzbl -0x33(%rbp), %eax
cmpl $0x1f, %eax
jne 0x530c
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
subl $0x21, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
addl $0x1f, %ecx
movslq %ecx, %rcx
addss (%rax,%rcx,4), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0xde6(%rip), %xmm1      # 0x60d0
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x53af
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
subl $0x21, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movss %xmm0, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
subl $0x1f, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movss %xmm0, -0x2c(%rbp)
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
addl $0x1f, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movss %xmm0, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
addl $0x21, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movss %xmm0, -0x24(%rbp)
leaq -0x30(%rbp), %rdi
movl $0x4, %esi
callq 0x5680
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x53b1
jmp 0x53b3
jmp 0x53b5
jmp 0x5665
movzbl -0x33(%rbp), %eax
cmpl $0x0, %eax
jne 0x53f8
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x5663
movzbl -0x33(%rbp), %eax
cmpl $0x1, %eax
je 0x540a
movzbl -0x33(%rbp), %eax
cmpl $0x1e, %eax
jne 0x546e
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
addss (%rax,%rcx,4), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0xc84(%rip), %xmm1      # 0x60d0
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x5661
movzbl -0x33(%rbp), %eax
cmpl $0x1f, %eax
jne 0x54ac
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x565f
movq -0x8(%rbp), %rax
movzbl -0x31(%rbp), %ecx
movzwl (%rax,%rcx,2), %eax
subl $0x2, %eax
movq -0x20(%rbp), %rsi
movzwl %ax, %edi
callq 0x57d0
cmpl $0x0, %eax
jne 0x55fe
movq -0x8(%rbp), %rax
movzbl -0x31(%rbp), %ecx
movzwl (%rax,%rcx,2), %eax
addl $0x2, %eax
movq -0x20(%rbp), %rsi
movzwl %ax, %edi
callq 0x57d0
cmpl $0x0, %eax
jne 0x55fe
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
addl $0x2, %ecx
movslq %ecx, %rcx
subss (%rax,%rcx,4), %xmm0
movss %xmm0, -0x30(%rbp)
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
subl $0x2, %ecx
movslq %ecx, %rcx
subss (%rax,%rcx,4), %xmm0
movss %xmm0, -0x2c(%rbp)
movss -0x30(%rbp), %xmm0
callq 0x5ae0
movss %xmm0, -0x38(%rbp)
movss -0x2c(%rbp), %xmm0
callq 0x5ae0
movaps %xmm0, %xmm1
movss -0x38(%rbp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x55c7
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
addss -0x2c(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x55fc
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
addss -0x30(%rbp), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x565d
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
subl $0x1, %ecx
movslq %ecx, %rcx
movss (%rax,%rcx,4), %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
addl $0x1, %ecx
movslq %ecx, %rcx
addss (%rax,%rcx,4), %xmm0
cvtss2sd %xmm0, %xmm0
movsd 0xa90(%rip), %xmm1      # 0x60d0
divsd %xmm1, %xmm0
cvtsd2ss %xmm0, %xmm0
movq -0x10(%rbp), %rax
movq -0x8(%rbp), %rcx
movzbl -0x31(%rbp), %edx
movzwl (%rcx,%rdx,2), %ecx
movss %xmm0, (%rax,%rcx,4)
jmp 0x565f
jmp 0x5661
jmp 0x5663
jmp 0x5665
movzbl -0x31(%rbp), %eax
addl $0x1, %eax
movb %al, -0x31(%rbp)
jmp 0x504b
addq $0x40, %rsp
popq %rbp
retq
nopw (%rax,%rax)