.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 SprMulti equ 16 SprShift equ 4 ConvMulti equ 6 ConvNSprMulti equ 96 DReverseShift equ 7 ; 1/9ÀÌ ´ë½Å 1/8 ¸¦ Àû¿ëÇÑ´Ù. 1/16 * 1/8 => 4 + 3 = >>7 .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] bRFilter equ qword ptr[rbp+ 0b0h] pPitch equ qword ptr[rbp+ 0b8h] pfSpr equ qword ptr[rbp+ 0c0h] psSpr equ qword ptr[rbp+ 0c8h] GraySrc equ qword ptr[rbp+ 0d0h] GrayCmp equ qword ptr[rbp+ 0d8h] ZoneId equ qword ptr[rbp+ 0e0h] ZoneTh equ qword ptr[rbp+ 0e8h] DThSlide equ qword ptr[rbp+ 0f0h] endLine equ qword ptr[rbp+ 0f8h] ix equ rsi ix32 equ esi iy equ rdi iy32 equ edi rrBW equ r8 rdBW equ r8d 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 xxTemp equ xmm1 xxSrc equ xmm4 xxCmp equ xmm5 xxMinus equ xmm6 xxPlus equ xmm7 xxThres equ xmm8 xxSupp equ xmm9 xxfSPR equ xmm10 xxsSPR equ xmm11 xxPeak equ xmm12 xxPeak2 equ xmm13 xxDSlide equ xmm14 xxDStart equ xmm15 xxDConvMulti equ xmm3 ConvFloatDPC6 PROC C local ImgAddr : qword ; ÆÄ¶ó¹ÌÅÍ·Î ³Ñ¾î¿Â °ª local ConAddr : qword local ConAddrLine : qword local InspLength : qword local ImgConLine : qword ; Conv Buffer ¸¸µé¶§ ½ÃÀÛ ÁÖ¼Ò local ConConLine : qword local ConLength : qword local ConConLineEnd : qword local BlackNWhite : qword local maxDefect : qword local iPitch2 : qword local pairLeft : qword local pairRight : qword local iPitchHUp : 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, 078h ; ÆÄ¶ó¹ÌÅÍ·Î ³Ñ¾î¿Â register°ª ¿Å±â±â mov ImgAddr , rcx mov ConAddr , rdx mov maxDefect , r8 mov rrNoD , r9 mov rrBW , BuffWidth ; mmx °ª ¸¸µé±â mov rax, Suppress mov rcx, ConvNSprMulti mul rcx movd xxSupp, rax ; supress movdqa xmm0, xxSupp punpcklwd xmm0, xxSupp pshufd xxSupp, xmm0, 0 mov rax, Threshold sal rax, SprShift movd xxThres, rax ; Threshold movdqa xmm0, xxThres punpcklwd xmm0, xxThres pshufd xxThres, xmm0, 0 mov rax, Threshold mov rcx, ConvMulti cdq div ecx movd xxDStart, rax movdqa xxTemp, xxDStart punpcklwd xxTemp, xxDStart pshufd xxDStart, xxTemp, 0 mov rax, 6 movd xxDConvMulti, rax movdqa xxTemp, xxDConvMulti punpcklwd xxTemp, xxDConvMulti pshufd xxDConvMulti, xxTemp, 0 movd xxDSlide, DThSlide movdqa xxTemp, xxDSlide punpcklwd xxTemp, xxDSlide pshufd xxDSlide, xxTemp, 0 mov rcx, iPitch16 and rcx, 0fh movd xxsSpr, ecx ; sSPR movdqa xxTemp, xxsSpr punpcklwd xxTemp, xxsSpr pshufd xxsSpr, xxTemp, 0 mov rax, SprMulti ; fSpr sub rax, rcx movd xxfSpr, eax movdqa xxTemp, xxfSpr punpcklwd xxTemp, xxfSpr pshufd xxfSpr, xxTemp, 0 mov rax, iPitch16 ; iPitch16 sar rax, SprShift mov iPitch16, rax mov iPitchHUp, rax cmp rcx, 8 jl PITCH_H_UP_PASS inc iPitchHUp PITCH_H_UP_PASS: mov rax, iPitch16 add rax, rax mov iPitch2, rax ; conv buff´Â 2byte ´ÜÀ§À̹ǷÎ.. ; register ÇÒ´ç. mov ix, InspLeft mov iy, InspTop mov rrXoD, DefectX mov rrYoD, DefectY mov rrToD, DefectType mov rrPoD, DefectVal mov rrBW, BuffWidth ; °Ë»ç ¿µ¿ª ¼³Á¤(width¸¦ pitch¸¸Å­ Àß¶ó¾ß ºñ±³ÇÑ´Ù) ; ÁÖ¼Ò°ª ¼³Á¤ mov rax, InspRight sub rax, InspLeft ; add rax, 15 sar rax, 4 sal rax, 4 add rax, InspLeft mov InspRight, rax mov rax, ConAddr mov ConConLine, rax mov ConAddrLine, rax mov rax, InspRight sub rax, InspLeft sal rax, 1 add rax, ConAddr mov ConConLineEnd, rax mov rax, InspRight sub rax, InspLeft sub rax, iPitch16 sub rax, 1 sar rax, 3 sal rax, 3 add rax, InspLeft mov InspRight, rax ; ½ÇÁ¦ °Ë»ç ¿µ¿ª ³¡ÁöÁ¡ º¯°æ(8 byte align) ; À̹ÌÁö ½ÃÀÛ ÁÖ¼Ò ¸¸µé±â. mov rax, rrBw ; rrImgAddr= rrImgAddr+ BuffWidth*InspTop + InspLeft; mul InspTop add rax, InspLeft add rax, ImgAddr mov ImgConLine, rax mov rrConAddr, ConConLine mov rrImgAddr, ImgConLine pxor xmm0, xmm0 mov rax, ix add rax, iPitch16 mov pairLeft, rax mov rax, InspRight sub rax, iPitch16 mov pairRight, rax mov ix, InspLeft mov iy, InspTop jmp MAKE_CON_BUFF NEXT_LINE: ; ¸Å ¶óÀθ¶´Ù ÁÖ¼Ò ÀçÁöÁ¤ jmp PAIRING_HORI PAIRING_HORI_RETURN: inc iy ; Loop Y add ImgConLine , rrBW mov rrConAddr, ConConLine mov rrImgAddr, ImgConLine MAKE_CON_BUFF: ; ÇÑ ¶óÀÎ Àüü ¼¼·Î ÇÕ¹öÆÛ ¸¸µé±â movdqu xxSrc, [rrImgAddr] movdqa xxCmp, xxSrc punpcklbw xxSrc, xmm0 punpckhbw xxCmp, xmm0 movdqu xxPlus, [rrImgAddr+ rrBW] movdqa xxMinus, xxPlus punpcklbw xxPlus, xmm0 punpckhbw xxMinus, xmm0 paddw xxSrc, xxPlus paddw xxCmp, xxMinus movdqu [rrConAddr], xxSrc movdqu [rrConAddr+ 10h], xxCmp add rrImgAddr, 10h add rrConAddr, 20h cmp rrConAddr, ConConLineEnd jle MAKE_CON_BUFF mov rrConAddr, ConAddrLine mov ix, InspLeft ; inc iy Conv_8: ; °Ë»ç ·çƾ (16°³ ´ÜÀ§°¡ ¾Æ´Ï¶ó 8°Ô ´ÜÀ§·Î ¿¬»ê °¡´É) ;JMP JUMP_DPC MAKE_DPC: mov rax, ix sar rax, 4 sal rax, 5 ;mov ix2, rax mov rcx, pPitch add rcx, rax movsx rdx, word ptr[rcx] sal rdx, 1 mov iPitch2, rdx mov rcx, pfSpr add rcx, rax movdqu xxfSpr, [rcx] mov rcx, psSpr add rcx, rax movdqu xxsSpr, [rcx] JUMP_DPC: mov rax, iPitch2 add rax, rrConAddr movdqu xxCmp, [rax] ; ºñ±³ ¹öÆÛ °¡·ÎÇÕ ¸¸µé±â pmullw xxCmp, xxfSPR movdqu xmm1, [rax+ 2] psllw xmm1, SprShift paddw xxCmp, xmm1 movdqu xmm1, [rax+ 4] psllw xmm1, SprShift paddw xxCmp, xmm1 movdqu xmm1, [rax+ 6] pmullw xmm1, xxsSPR paddw xxCmp, xmm1 movdqa xmm1, xxCmp ; suppress (2*2*SPR ÇØÁØ suppress) psubusw xmm1, xxSupp psubusw xxCmp, xmm1 movdqu xxSrc, [rrConAddr] ; ¼Ò½º¹öÆÛ °¡·ÎÇÕ ¸¸µé±â movdqu xxTemp, [rrConAddr+ 2] paddw xxSrc, xxTemp movdqu xxTemp, [rrConAddr+ 4] paddw xxSrc, xxTemp psllw xxSrc, SprShift ; SPR movdqa xmm1, xxSrc ; suppress (2*2*SPR ÇØÁØ suppress) psubusw xmm1, xxSupp psubusw xxSrc, xmm1 ;jmp PASS_DTH movdqa xxThres, xxSrc psrlw xxThres, DReverseShift ; 1/9ÀÌ ¾Æ´Ï¶ó 1/8 ¸¦ Àû¿ëÇÑ´Ù. 1/16 * 1/8 => 4 + 3 = >>7 pmullw xxThres, xxDSlide psrlw xxThres, 8 paddw xxThres, xxDStart pmullw xxThres, xxDConvMulti psllw xxThres, SprShift PASS_DTH: movdqa xxMinus , xxCmp psubw xxMinus , xxSrc movdqa xxPlus , xxSrc psubw xxPlus , xxCmp Inspect_Black: mov BlackNWhite, 0 mov bx, 0 movdqa xxPeak, xxMinus movdqa xxPeak2, xxMinus pcmpgtw xxPeak, xxThres pmovmskb rax, xxPeak cmp rax, 0 jne DEFECT_00 Inspect_White: mov BlackNWhite, 1 mov bx, 1 movdqa xxPeak, xxPlus movdqa xxPeak2, xxPlus pcmpgtw xxPeak, xxThres pmovmskb rax, xxPeak cmp rax, 0 jne DEFECT_00 End_8_Pixel: cmp rrNoD, maxDefect jge PAIRING_HORI add ix, 8 ; Loop X add rrConAddr, 16 ; 14= 16- 2 cmp ix, InspRight jl Conv_8 cmp iy, InspBottom jl NEXT_LINE jmp END_FUNC DEFECT_00: mov rcx, ConvNSprMulti pextrw rax, xxPeak, 0h cmp rax, 0h je Defect_01 pextrw rax, xxPeak2, 0h cdq div rcx mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax pextrw rax, xxSrc, 0h mov rdx, GraySrc mov [rdx+ 4*rrNoD], eax pextrw rax, xxCmp, 0h mov rdx, GrayCmp mov [rdx+ 4*rrNoD], eax inc rrNoD DEFECT_01: inc ix pextrw rax, xxPeak, 1h cmp rax, 0h je Defect_02 pextrw rax, xxPeak2, 1h cdq div rcx mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax pextrw rax, xxSrc, 1h mov rdx, GraySrc mov [rdx+ 4*rrNoD], eax pextrw rax, xxCmp, 1h mov rdx, GrayCmp mov [rdx+ 4*rrNoD], eax inc rrNoD DEFECT_02: inc ix pextrw rax, xxPeak, 2h cmp rax, 0h je Defect_03 pextrw rax, xxPeak2, 2h cdq div rcx mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax pextrw rax, xxSrc, 2h mov rdx, GraySrc mov [rdx+ 4*rrNoD], eax pextrw rax, xxCmp, 2h mov rdx, GrayCmp mov [rdx+ 4*rrNoD], eax inc rrNoD DEFECT_03: inc ix pextrw rax, xxPeak, 3h cmp rax, 0h je Defect_04 pextrw rax, xxPeak2, 3h cdq div rcx mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax pextrw rax, xxSrc, 3h mov rdx, GraySrc mov [rdx+ 4*rrNoD], eax pextrw rax, xxCmp, 3h mov rdx, GrayCmp mov [rdx+ 4*rrNoD], eax inc rrNoD DEFECT_04: inc ix pextrw rax, xxPeak, 4h cmp rax, 0h je Defect_05 pextrw rax, xxPeak2, 4h cdq div rcx mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax pextrw rax, xxSrc, 4h mov rdx, GraySrc mov [rdx+ 4*rrNoD], eax pextrw rax, xxCmp, 4h mov rdx, GrayCmp mov [rdx+ 4*rrNoD], eax inc rrNoD DEFECT_05: inc ix pextrw rax, xxPeak, 5h cmp rax, 0h je Defect_06 pextrw rax, xxPeak2, 5h cdq div rcx mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax pextrw rax, xxSrc, 5h mov rdx, GraySrc mov [rdx+ 4*rrNoD], eax pextrw rax, xxCmp, 5h mov rdx, GrayCmp mov [rdx+ 4*rrNoD], eax inc rrNoD DEFECT_06: inc ix pextrw rax, xxPeak, 6h cmp rax, 0h je Defect_07 pextrw rax, xxPeak2, 6h cdq div rcx mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax pextrw rax, xxSrc, 6h mov rdx, GraySrc mov [rdx+ 4*rrNoD], eax pextrw rax, xxCmp, 6h mov rdx, GrayCmp mov [rdx+ 4*rrNoD], eax inc rrNoD DEFECT_07: inc ix pextrw rax, xxPeak, 7h cmp rax, 0h je Defect_End pextrw rax, xxPeak2, 7h cdq div rcx mov [rrXoD+ 4*rrNoD], ix32 mov [rrYoD+ 4*rrNoD], iy32 mov [rrToD+ 2*rrNoD], bx mov [rrPoD+ 2*rrNoD], ax pextrw rax, xxSrc, 7h mov rdx, GraySrc mov [rdx+ 4*rrNoD], eax pextrw rax, xxCmp, 7h mov rdx, GrayCmp mov [rdx+ 4*rrNoD], eax inc rrNoD Defect_End: sub ix, 7 cmp BlackNWhite, 0 je Inspect_White jmp End_8_Pixel PAIRING_HORI: mov ix, -1 LOOP_PAIR_NUM: inc ix cmp ix, rrNoD jge LOOP_PAIR_NUM_END mov rax, nPair cmp rax, MaxPair jge END_FUNC cmp word ptr [rrToD+ 2*ix], 3 ; check type DEFTYPE_NODEFECT= 3, DEFTYPE_DELETE= 4 jge LOOP_PAIR_NUM mov rbx, ix movsxd rax, dword ptr [rrXoD+ 4*ix] mov rcx, rax add rcx, iPitchHUp cmp rax, pairRight jg PAIR_RIGHT cmp rax, pairLeft jge PAIR_CENTER PAIR_LEFT: inc rbx cmp rbx, rrNoD jge PAIR_LEFT_UNPAIR movsxd rdx, dword ptr[rrXoD+ 4*rbx] ; Filter_1_Pair_YPosition cmp rdx, rcx ; cmp rdx, yPlusPitch jl PAIR_LEFT jg PAIR_LEFT_UNPAIR movzx rrConAddr, word ptr[rrToD+ 2*rbx] ; Filter_3_TYPE_DELETE cmp rrConAddr, 3 jge LOOP_PAIR_NUM ; jge PAIR_LEFT ;Filte_1_ÀÇ Á¶°ÇÀÌ (+-1)·Î ¹Ù²ð °æ¿ì ¹Ù²¸¾ß ÇÑ´Ù. mov ax, word ptr[rrToD+ 2*ix] ; Filter_4_TYPE_PAIR cmp ax, rwConAddr je LOOP_PAIR_NUM ; jge PAIR_LEFT ;Filte_1_ÀÇ Á¶°ÇÀÌ ¹Ù²ð °æ¿ì ¹Ù²¸¾ß ÇÑ´Ù. mov word ptr [rrToD+ 2*rbx], 4 mov rcx, PairAddr mov (astPair ptr [rcx]).pos, 1 mov (astPair ptr [rcx]).pair, 1 mov (astPair ptr [rcx]).x, edx mov (astPair ptr [rcx]).y, iy32 mov (astPair ptr [rcx]).dtype, rdConAddr movzx edx, word ptr[rrPoD+ 2*rbx] mov (astPair ptr [rcx]).peak, edx mov rdx, GraySrc mov eax, [rdx+ 4*rbx] mov rrConAddr, ConvNSprMulti cdq div rrConAddr mov (astPair ptr [rcx]).src, eax mov rdx, GrayCmp mov eax, [rdx+ 4*rbx] ; mov rrConAddr, ConvNSprMulti cdq div rrConAddr mov (astPair ptr [rcx]).ref, eax add rcx, PairSize mov PairAddr, rcx inc nPair jmp LOOP_PAIR_NUM PAIR_LEFT_UNPAIR: mov rcx, PairAddr mov (astPair ptr [rcx]).pos, 1 mov (astPair ptr [rcx]).pair, 5 mov (astPair ptr [rcx]).x, eax mov (astPair ptr [rcx]).y, iy32 movzx edx, word ptr[rrToD+ 2*ix] mov (astPair ptr [rcx]).dtype, edx movzx edx, word ptr[rrPoD+ 2*ix] mov (astPair ptr [rcx]).peak, edx mov rdx, GraySrc mov eax, [rdx+ 4*ix] mov rrConAddr, ConvNSprMulti cdq div rrConAddr mov (astPair ptr [rcx]).src, eax mov rdx, GrayCmp mov eax, [rdx+ 4*ix] ; mov rrConAddr, ConvNSprMulti cdq div rrConAddr mov (astPair ptr [rcx]).ref, eax 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[rrXoD+ 4*rbx] ; Filter_1_Pair_Position cmp rdx, rcx jl PAIR_CENTER jg LOOP_PAIR_NUM 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*ix] ; Filter_4_TYPE_PAIR cmp ax, rwConAddr je LOOP_PAIR_NUM ; jge PAIR_CENTER ;Filte_1_ÀÇ Á¶°ÇÀÌ ¹Ù²ð °æ¿ì ¹Ù²¸¾ß ÇÑ´Ù. mov word ptr [rrToD+ 2*rbx], 4 mov rcx, PairAddr mov (astPair ptr [rcx]).pos, 2 mov (astPair ptr [rcx]).pair, 1 mov (astPair ptr [rcx]).x, edx mov (astPair ptr [rcx]).y, iy32 mov (astPair ptr [rcx]).dtype, rdConAddr movzx edx, word ptr[rrPoD+ 2*rbx] mov (astPair ptr [rcx]).peak, edx mov rdx, GraySrc mov eax, [rdx+ 4*rbx] mov rrConAddr, ConvNSprMulti cdq div rrConAddr mov (astPair ptr [rcx]).src, eax mov rdx, GrayCmp mov eax, [rdx+ 4*rbx] ; mov rrConAddr, ConvNSprMulti cdq div rrConAddr mov (astPair ptr [rcx]).ref, eax add rcx, PairSize mov PairAddr, rcx inc nPair jmp LOOP_PAIR_NUM PAIR_RIGHT: ; ¾Õ¿¡¼­ pairingÀÌ µÇÁö ¾ÊÀ¸¸é ´õÀÌ»ó pairing ÇÒ ¼ö ¾ø´Ù. ¹«Á¶°Ç unpairÀÌ´Ù. mov rcx, PairAddr mov (astPair ptr [rcx]).pos, 3 mov (astPair ptr [rcx]).pair, 5 add rax, iPitchHUp mov (astPair ptr [rcx]).x, eax mov (astPair ptr [rcx]).y, iy32 movsx edx, word ptr[rrToD+ 2*rbx] inc edx and edx, 1 mov (astPair ptr [rcx]).dtype, edx movzx edx, word ptr[rrPoD+ 2*ix] mov (astPair ptr [rcx]).peak, edx mov rdx, GraySrc mov eax, [rdx+ 4*ix] mov rrConAddr, ConvNSprMulti cdq div rrConAddr mov (astPair ptr [rcx]).ref, eax mov rdx, GrayCmp mov eax, [rdx+ 4*ix] ; mov rrConAddr, ConvNSprMulti cdq div rrConAddr mov (astPair ptr [rcx]).src, eax add rcx, PairSize mov PairAddr, rcx inc nPair jmp LOOP_PAIR_NUM LOOP_PAIR_NUM_END: mov rrNoD, 0 jmp PAIRING_HORI_RETURN END_FUNC: add iy32, 1 mov rax, endLine mov [rax], iy32 mov rax, nPair pop rbx pop rsi pop rdi pop r15 pop r14 pop r13 pop r12 pop r11 pop r10 pop rbp RET ConvFloatDPC6 ENDP ConvZoneE PROC ret ConvZoneE endp end