.data astPair STRUCT pos dword ? pair dword ? dtype dword ? peak dword ? x dword ? y dword ? src dword ? ref dword ? zone dword ? Thre dword ? astPair ENDS .code InspLeft equ qword ptr[rbp+ 30h] InspRight equ qword ptr[rbp+ 38h] InspTop equ qword ptr[rbp+ 40h] InspBottom equ qword ptr[rbp+ 48h] DefectX equ qword ptr[rbp+ 50h] DefectY equ qword ptr[rbp+ 58h] DefectType equ qword ptr[rbp+ 60h] DefectVal equ qword ptr[rbp+ 68h] PairAddr equ qword ptr[rbp+ 70h] nPair equ qword ptr[rbp+ 78h] maxPair equ qword ptr[rbp+ 80h] PairSize equ qword ptr[rbp+ 88h] BuffWidth equ qword ptr[rbp+ 90h] iPitch16 equ qword ptr[rbp+ 98h] Threshold equ qword ptr[rbp+ 0a0h] Suppress equ qword ptr[rbp+ 0a8h] ConAddr2 equ qword ptr[rbp+ 0b0h] tilt16 equ qword ptr[rbp+ 0b8h] ix equ rsi iy equ rdi ix32 equ esi iy32 equ edi rrNoD equ r9 rrXoD equ r10 rrYoD equ r11 rrToD equ r12 rrPoD equ r13 rrImgAddr equ r14 rrConAddr equ r15 rdConAddr equ r15d rwConAddr equ r15w rrConAddr2 equ r8 rdConAddr2 equ r8d xxZero equ xmm0 xxTemp equ xmm1 xxSrc equ xmm2 xxCmp equ xmm3 xxPeak equ xmm4 xxPeakEx equ xmm5 xxfSPR equ xmm6 xxsSPR equ xmm7 xxThres equ xmm8 xxSupp equ xmm9 xxMinus equ xmm10 xxPlus equ xmm11 xxSrc1 equ xmm10 xxSrc2 equ xmm11 xxSrc3 equ xmm12 xxCmp1 equ xmm13 xxCmp2 equ xmm14 xxCmp3 equ xmm15 xxfSprc equ xmm14 xxsSprc equ xmm15 ConvSprShift equ 6 ; shift 2 & shift 4 ConvShift equ 2 ConvMulti equ 4 SprShift equ 4 SprMulti equ 16 ConvFloatVTD PROC local ImgAddr : qword ; ÆÄ¶ó¹ÌÅÍ·Î ³Ñ¾î¿Â °ª local ImgAddrLeft : qword local ImgConLine : qword ; Conv Buffer ¸¸µé¶§ ½ÃÀÛ ÁÖ¼Ò local F_Y2Insp : qword local maxPixelD : qword local ConPitch : qword ; 8*iPitch local ConPitch2 : qword local ConAddr : qword local ConOrigin : qword local pairTop : qword local pairBottom : qword local iPitchHUp : qword local iPitch : qword local i2Pitch : qword local yPlusPitch : qword local ConBottom : qword push rbp mov rbp, rsp push r10 push r11 push r12 push r13 push r14 push r15 push rdi push rsi push rbx ADD rbp, 088h ; ÆÄ¶ó¹ÌÅÍ·Î ³Ñ¾î¿Â register°ª ¿Å±â±â mov ImgAddr , rcx mov ConAddr , rdx add ConAddr, 20h add ConAddr2, 20h mov maxPixelD , r8 ; register ÇÒ´ç. mov ix, InspLeft mov iy, InspTop mov rrXoD, DefectX mov rrYoD, DefectY mov rrToD, DefectType mov rrPoD, DefectVal ; mmx °ª ¸¸µé±â mov rax, Threshold ; Threshold movd xxThres, rax movdqa xmm0, xxThres punpcklwd xmm0, xxThres pshufd xxThres, xmm0, 0 mov rax, Suppress ; supress sal rax, ConvSprShift movd xxSupp, rax movdqa xmm0, xxSupp punpcklwd xmm0, xxSupp pshufd xxSupp, xmm0, 0 mov rcx, tilt16 ; tilt setting and rcx, 0fh movd xxsSprC, rcx movdqa xmm0, xxsSprC punpcklwd xmm0, xxsSprC pshufd xxsSprC, xmm0, 0 mov rax, SprMulti sub rax, rcx movd xxfSPRC, rax movdqa xmm0, xxfSPRC punpcklwd xmm0, xxfSPRC pshufd xxfSPRC, xmm0, 0 mov rax, tilt16 sar rax, SprShift mov tilt16, rax mov rax, iPitch16 ; iPitch Setting sar rax, SprShift mov iPitch, rax mov rcx, iPitch16 and rcx, 0fh cmp rcx, 8 jl PITCH_H_UP_PASS inc rax PITCH_H_UP_PASS: mov iPitchHUp, rax movd xxsSPR, rcx ; sSpr movdqa xmm0, xxsSPR punpcklwd xmm0, xxsSPR pshufd xxsSPR, xmm0, 0 mov rax, SprMulti ; fSpr sub rax, rcx movd xxfSPR, rax movdqa xmm0, xxfSPR punpcklwd xmm0, xxfSPr pshufd xxfSPr, xmm0, 0 ; °Ë»ç ¿µ¿ª ¼³Á¤(width¸¦ pitch¸¸Å­ Àß¶ó¾ß ºñ±³ÇÑ´Ù) ; ÁÖ¼Ò°ª ¼³Á¤ mov rax, InspBottom mov ConBottom, rax mov rax, InspRight sub rax, InspLeft sar rax, 4 sal rax, 4 add rax, InspLeft mov InspRight, rax ; ½ÇÁ¦ °Ë»ç ¿µ¿ª ³¡ÁöÁ¡ º¯°æ(16 byte align) mov rax, BuffWidth mul InspTop add rax, ImgAddr add rax, ix mov ImgAddrLeft, rax mov rax, 20h mul iPitch mov ConPitch, rax mov rax, 20h mul i2Pitch mov ConPitch2, rax mov rax, InspTop add rax, iPitch mov pairTop, rax mov rax, InspBottom sub rax, iPitch sub rax, 2 mov InspBottom, rax sub rax, iPitch mov pairBottom, rax pxor xmm0, xmm0 mov rrImgAddr, ImgAddrLeft mov rrConAddr, ConAddr mov rrConAddr2, ConAddr2 jmp LOOP_X_CHECK LOOP_X_TAIL: jmp PAIRING_VERT PAIRING_VERT_RETURN: add ImgAddrLeft, 10h mov rrImgAddr, ImgAddrLeft mov rrConAddr, ConAddr mov rrConAddr2, ConAddr2 mov iy, InspTop LOOP_X_CHECK: cmp ix, InspRight jge END_FUNC LOOP_X_BODY: ; dec iy ; Reverse Filter¸¦ À§ÇØ ConBuff¸¦ ÇÑÁÙ ´õ ¸¸µç´Ù. ; sub rrImgAddr, BuffWidth ; sub rrConAddr, 20h ; sub rrConAddr2, 20h mov iy, InspTop mov rrImgAddr, ImgAddrLeft mov rrConAddr, ConAddr mov rrConAddr2, ConAddr2 jmp LOOP_CONBUFF_BODY_TAIL_CHECK LOOP_CONBUFF_RETURN: mov iy, InspTop mov rrImgAddr, ImgAddrLeft mov rrConAddr, ConAddr mov rrConAddr2, ConAddr2 jmp LOOP_CONBUFF2_HEAD LOOP_CONBUFF2_RETURN: mov iy, InspTop mov rrImgAddr, ImgAddrLeft mov rrConAddr, ConAddr mov rrConAddr2, ConAddr2 mov F_Y2Insp, 0 jmp LOOP_Y_CHECK LOOP_Y_TAIL: inc iy add rrImgAddr, BuffWidth add rrConAddr, 20h add rrConAddr2, 20h LOOP_Y_CHECK: cmp rrNoD, maxPixelD jge PAIRING_VERT cmp iy, InspBottom jl LOOP_Y_BODY ; Y Double Check, YÃà Conv¸¦ 16 ¹ÙÀÌÆ® ´ÜÀ§·Î ¸¸µå´Âµ¥. °Ë»ç´Â 8¹ÙÀÌÆ®¾¿ ÇϹǷΠ2¹ø y·çÇÁ µ¹¸®±â. add ix, 8 cmp F_Y2Insp, 1 jge LOOP_X_TAIL ; y_end & goto x_tail mov F_Y2Insp, 1 mov iy, InspTop mov rrConAddr, ConAddr mov rrConAddr2, ConAddr2 add rrConAddr, 10h add rrConAddr2, 10h jmp LOOP_Y_BODY ; Con ¹öÆÛ ¸¸µé±â LOOP_CONBUFF_BODY_TAIL_CHECK: movdqu xxSrc, [rrImgAddr] movdqa xxSrc1, xxSrc punpcklbw xxSrc, xmm0 punpckhbw xxSrc1, xmm0 movdqu xxCmp, [rrImgAddr+ 1] movdqa xxCmp1, xxCmp punpcklbw xxCmp, xmm0 punpckhbw xxCmp1, xmm0 paddw xxSrc, xxCmp paddw xxSrc1, xxCmp1 movdqu [rrConAddr], xxSrc movdqu [rrConAddr+ 10h], xxSrc1 add rrImgAddr, BuffWidth add rrConAddr, 20h inc iy cmp iy, ConBottom jle LOOP_CONBUFF_BODY_TAIL_CHECK jmp LOOP_CONBUFF_RETURN LOOP_CONBUFF2_HEAD: mov rax, rrImgAddr add rax, tilt16 mov rrConAddr2, ConAddr2 LOOP_CONBUFF2_BODY: movdqu xxSrc, [rax] movdqa xxSrc1, xxSrc punpcklbw xxSrc, xmm0 punpckhbw xxSrc1, xmm0 pmullw xxSrc, xxfSprc pmullw xxSrc1, xxfSprc movdqu xxCmp, [rax+ 2] movdqa xxCmp1, xxCmp punpcklbw xxCmp, xmm0 punpckhbw xxCmp1, xmm0 pmullw xxCmp, xxsSprc pmullw xxCmp1, xxsSprc paddw xxSrc, xxCmp paddw xxSrc1, xxcmp1 psraw xxSrc, SprShift psraw xxSrc1, SprShift movdqu xxCmp, [rax+ 1] movdqa xxCmp1, xxCmp punpcklbw xxCmp, xmm0 punpckhbw xxCmp1, xmm0 paddw xxSrc, xxCmp paddw xxSrc1, xxCmp1 movdqu [rrConAddr2], xxSrc movdqu [rrConAddr2+ 10h], xxSrc1 add rax, BuffWidth add rrConAddr2, 20h inc iy cmp iy, ConBottom jle LOOP_CONBUFF2_BODY jmp LOOP_CONBUFF2_RETURN LOOP_Y_BODY: movdqu xxSrc1, [rrConAddr] ; ¼Ò½º ¹öÆÛ movdqu xxSrc2, [rrConAddr+ 20h] movdqa xxSrc, xxSrc1 paddw xxSrc, xxSrc2 psllw xxSrc, SprShift movdqa xxTemp, xxSrc ; suppress (2*2*SPR ÇØÁØ suppress) psubusw xxTemp, xxSupp psubusw xxSrc, xxTemp mov rax, rrConAddr2 ; ºñ±³ ¹öÆÛ ÇÕ ¸¸µé±â add rax, ConPitch movdqu xxCmp1, [rax] movdqa xxCmp, xxCmp1 pmullw xxCmp, xxfSPR movdqu xxCmp1, [rax+ 20h] movdqa xxTemp, xxCmp1 psllw xxTemp, SprShift paddw xxCmp, xxTemp movdqu xxTemp, [rax+ 40h] pmullw xxTemp, xxsSPR paddw xxCmp, xxTemp movdqa xxTemp, xxCmp ; suppress (2*2*SPR ÇØÁØ suppress) psubusw xxTemp, xxSupp psubusw xxCmp, xxTemp ; JMP REINSPECT_PRE REINSPECT_RETURN: ; JMP ReReINSPECT_PRE ReReINSPECT_RETURN: INSPECT_BLACK: movdqa xxPeakEx, xxCmp psubusw xxPeakEx, xxSrc movdqa xxPeak, xxPeakEx pcmpgtw xxPeak, xxThres pmovmskb rax, xxPeak cmp rax, 0 je INSPECT_WHITE mov rbx, 0 ; Èæ°áÇÔ flag jmp DEFECT_00 INSPECT_WHITE: movdqa xxPeakEx , xxSrc psubusw xxPeakEx , xxCmp movdqa xxPeak, xxPeakEx pcmpgtw xxPeak, xxThres pmovmskb rax, xxPeak cmp rax, 0 je LOOP_Y_TAIL mov rbx, 1 ; ¹é°áÇÔ flag jmp DEFECT_00 REINSPECT_PRE: ;JMP REINSPECT_RETURN paddw xxCmp1, xxCmp2 ; ºñ±³ ¹öÆÛ 1+2 psllw xxCmp1, SprShift movdqu xxSrc3, [rrConAddr- 20h] ; »ó´ë ¹öÆÛ 1+ 2+ 3 pmullw xxSrc3, xxSSPR psllw xxSrc1, SprShift paddw xxSrc3, xxSrc1 pmullw xxSrc2, xxFSpr paddw xxSrc3, xxSrc2 JMP REINSPECT_RETURN REINSPECT_BLACK: movdqa xxTemp, xxCmp1 psubusw xxTemp, xxSrc3 ;psubusw xxPlus , xxCmp pcmpgtw xxTemp, xxThres pand xxPeak, xxTemp pmovmskb rcx, xxPeak cmp rcx, 0 je INSPECT_WHITE mov rbx, 0 jmp DEFECT_00 ;ReReINSPECT_BLACK REINSPECT_WHITE: movdqa xxTemp, xxSrc3 psubusw xxTemp, xxCmp1 ;psubusw xxMinus , xxSrc pcmpgtw xxTemp, xxThres pand xxPeak, xxTemp pmovmskb rcx, xxPeak cmp rcx, 0 je LOOP_Y_TAIL mov rbx, 1 jmp DEFECT_00 ;ReReINSPECT_WHITE DEFECT_00: pextrw rax, xxPeak, 0 cmp rax, 0h je Defect_01 pextrw rax, xxPeakEx, 0 sar rax, ConvSprShift mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_01: inc ix pextrw rax, xxPeak, 1 cmp rax, 0h je Defect_02 pextrw rax, xxPeakEx, 1 sar rax, ConvSprShift mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_02: inc ix pextrw rax, xxPeak, 2 cmp rax, 0h je Defect_03 pextrw rax, xxPeakEx, 2 sar rax, ConvSprShift mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_03: inc ix pextrw rax, xxPeak, 3 cmp rax, 0h je Defect_04 pextrw rax, xxPeakEx, 3 sar rax, ConvSprShift mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_04: inc ix pextrw rax, xxPeak, 4 cmp rax, 0h je Defect_05 pextrw rax, xxPeakEx, 4 sar rax, ConvSprShift mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_05: inc ix pextrw rax, xxPeak, 5 cmp rax, 0h je Defect_06 pextrw rax, xxPeakEx, 5 sar rax, ConvSprShift mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_06: inc ix pextrw rax, xxPeak, 6 cmp rax, 0h je Defect_07 pextrw rax, xxPeakEx, 6 sar rax, ConvSprShift mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_07: inc ix pextrw rax, xxPeak, 7 cmp rax, 0h je DEFECT_END pextrw rax, xxPeakEx, 7 sar rax, ConvSprShift mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax inc rrNoD DEFECT_END: sub ix, 7 cmp bx, 0 je INSPECT_WHITE jmp LOOP_Y_TAIL PAIRING_VERT: mov iy, -1 LOOP_PAIR_NUM: inc iy cmp iy, rrNoD jge LOOP_PAIR_NUM_END mov rax, nPair cmp rax, MaxPair jge END_FUNC cmp word ptr [rrToD+ 2*iy], 3 ; check type DEFTYPE_NODEFECT= 3, DEFTYPE_DELETE= 4 jge LOOP_PAIR_NUM mov rbx, iy movsxd rcx, dword ptr [rrYoD+ 4*iy] mov rax, rcx add rax, iPitchHUp ; mov yPlusPitch, rax movsxd rrConAddr2, dword ptr[rrXoD+ 4*iy] cmp rcx, pairBottom jg PAIR_BOTTOM cmp rcx, pairTop jge PAIR_CENTER PAIR_TOP: inc rbx cmp rbx, rrNoD jge PAIR_TOP_UNPAIR movsxd rdx, dword ptr[rrYoD+ 4*rbx] ; Filter_1_Pair_YPosition cmp rdx, rax ; cmp rdx, yPlusPitch jl PAIR_TOP jg PAIR_TOP_UNPAIR movsxd rcx, dword ptr[rrXoD+ 4*rbx] ; Filter_2_Pair_XPosition cmp rrConAddr2, rcx jne PAIR_TOP movzx rrConAddr, word ptr[rrToD+ 2*rbx] ; Filter_3_TYPE_DELETE cmp rrConAddr, 3 jge LOOP_PAIR_NUM ; jge PAIR_TOP ;Filte_1_ÀÇ Á¶°ÇÀÌ (+-1)·Î ¹Ù²ð °æ¿ì ¹Ù²¸¾ß ÇÑ´Ù. mov ax, word ptr[rrToD+ 2*iy] ; Filter_4_TYPE_PAIR cmp ax, rwConAddr je LOOP_PAIR_NUM ; jge PAIR_TOP ;Filte_1_ÀÇ Á¶°ÇÀÌ ¹Ù²ð °æ¿ì ¹Ù²¸¾ß ÇÑ´Ù. mov word ptr [rrToD+ 2*rbx], 4 mov rax, PairAddr mov (astPair ptr [rax]).pos, 1 mov (astPair ptr [rax]).pair, 1 mov (astPair ptr [rax]).x, ecx mov (astPair ptr [rax]).y, edx mov (astPair ptr [rax]).dtype, rdConAddr movzx edx, word ptr[rrPoD+ 2*rbx] mov (astPair ptr [rax]).peak, edx add rax, PairSize mov PairAddr, rax inc nPair jmp LOOP_PAIR_NUM PAIR_TOP_UNPAIR: mov rcx, PairAddr mov (astPair ptr [rcx]).pos, 1 mov (astPair ptr [rcx]).pair, 5 mov (astPair ptr [rcx]).x, rdConAddr2 sub rax, iPitchHUp mov (astPair ptr [rcx]).y, eax movzx edx, word ptr[rrToD+ 2*iy] mov (astPair ptr [rcx]).dtype, edx movzx edx, word ptr[rrPoD+ 2*iy] mov (astPair ptr [rcx]).peak, edx add rcx, PairSize mov PairAddr, rcx inc nPair jmp LOOP_PAIR_NUM PAIR_CENTER: inc rbx cmp rbx, rrNoD jge LOOP_PAIR_NUM movsxd rdx, dword ptr[rrYoD+ 4*rbx] ; Filter_1_Pair_YPosition cmp rdx, rax ; cmp rdx, yPlusPitch jl PAIR_CENTER jg LOOP_PAIR_NUM movsxd rcx, dword ptr[rrXoD+ 4*rbx] ; Filter_2_Pair_XPosition cmp rrConAddr2, rcx jne PAIR_CENTER movzx rrConAddr, word ptr[rrToD+ 2*rbx] ; Filter_3_TYPE_DELETE cmp rrConAddr, 3 jge LOOP_PAIR_NUM ; jge PAIR_CENTER ;Filte_1_ÀÇ Á¶°ÇÀÌ (+-1)·Î ¹Ù²ð °æ¿ì ¹Ù²¸¾ß ÇÑ´Ù. mov ax, word ptr[rrToD+ 2*iy] ; Filter_4_TYPE_PAIR cmp ax, rwConAddr je LOOP_PAIR_NUM ; jge PAIR_CENTER ;Filte_1_ÀÇ Á¶°ÇÀÌ ¹Ù²ð °æ¿ì ¹Ù²¸¾ß ÇÑ´Ù. mov word ptr [rrToD+ 2*rbx], 4 mov rax, PairAddr mov (astPair ptr [rax]).pos, 2 mov (astPair ptr [rax]).pair, 1 mov (astPair ptr [rax]).x, ecx mov (astPair ptr [rax]).y, edx mov (astPair ptr [rax]).dtype, rdConAddr movzx edx, word ptr[rrPoD+ 2*rbx] mov (astPair ptr [rax]).peak, edx add rax, PairSize mov PairAddr, rax inc nPair jmp LOOP_PAIR_NUM PAIR_BOTTOM: ; ¾Õ¿¡¼­ pairingÀÌ µÇÁö ¾ÊÀ¸¸é ´õÀÌ»ó pairing ÇÒ ¼ö ¾ø´Ù. ¹«Á¶°Ç unpairÀÌ´Ù. mov rcx, PairAddr mov (astPair ptr [rcx]).pos, 3 mov (astPair ptr [rcx]).pair, 5 mov (astPair ptr [rcx]).x, rdConAddr2 mov (astPair ptr [rcx]).y, eax cmp edx, 0 je TYPE_1 mov (astPair ptr [rcx]).dtype, 0 jmp TYPE_END TYPE_1: mov (astPair ptr [rcx]).dtype, 1 TYPE_END: movzx edx, word ptr[rrPoD+ 2*iy] mov (astPair ptr [rcx]).peak, edx add rcx, PairSize mov PairAddr, rcx inc nPair jmp LOOP_PAIR_NUM LOOP_PAIR_NUM_END: mov rrNoD, 0 jmp PAIRING_VERT_RETURN END_FUNC: mov rax, nPair ; return rrNoD pop rbx pop rsi pop rdi pop r15 pop r14 pop r13 pop r12 pop r11 pop r10 pop rbp RET ConvFloatVTD ENDP end