.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 ConvNSprShift equ 6 ; shift 2 & shift 4 SprShift equ 4 ConvShift equ 2 SprMulti equ 16 ConvMulti equ 4 .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] GraySrc equ qword ptr[rbp+ 0b0h] GrayCmp equ qword ptr[rbp+ 0b8h] ZoneId equ qword ptr[rbp+ 0c0h] ZoneTh equ qword ptr[rbp+ 0c8h] bReverseFilter equ qword ptr[rbp+ 0d0h] DThSlide equ qword ptr[rbp+ 0d8h] endLine equ qword ptr[rbp+ 0e0h] 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 ConvFloat_BOE 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 sal rax, ConvNSprShift movd xxSupp, rax ; supress movdqa xmm0, xxSupp ;punpcklbw xxSupp, xmm0 ;movdqa xmm0, xxSupp ;punpcklbw 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 movdqa xxDStart, xxThres psrlw xxDStart, ConvNSprShift movd xxDSlide, DThSlide movdqa xmm0, xxDSlide punpcklwd xmm0, xxDSlide pshufd xxDSlide, xmm0, 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) ; ¼­Å§·¯¹öÆÛ ±³Ã¼½Ã Á׾ ROI º¯°æ(BOE) mov rax, InspBottom sub rax, 2 mov InspBottom, rax ; À̹ÌÁö ½ÃÀÛ ÁÖ¼Ò ¸¸µé±â. 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 xmm2, [rrImgAddr] movdqa xmm3, xmm2 punpcklbw xmm2, xmm0 punpckhbw xmm3, xmm0 movdqu xmm4, [rrImgAddr+ rrBW] movdqa xmm5, xmm4 punpcklbw xmm4, xmm0 punpckhbw xmm5, xmm0 paddw xmm2, xmm4 paddw xmm3, xmm5 movdqu [rrConAddr], xmm2 movdqu [rrConAddr+ 10h], xmm3 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°Ô ´ÜÀ§·Î ¿¬»ê °¡´É) 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] pmullw xmm1, xxsSPR paddw xxCmp, xmm1 movdqa xmm1, xxCmp ; suppress (2*2*SPR ÇØÁØ suppress) psubusw xmm1, xxSupp psubusw xxCmp, xmm1 movdqu xxSrc, [rrConAddr] ; ¼Ò½º¹öÆÛ °¡·ÎÇÕ ¸¸µé±â movdqu xmm1, [rrConAddr+ 2] paddw xxSrc, xmm1 psllw xxSrc, SprShift ; SPR movdqa xmm1, xxSrc ; suppress (2*2*SPR ÇØÁØ suppress) psubusw xmm1, xxSupp psubusw xxSrc, xmm1 ; jmp DTH_PASS movdqa xxThres, xxSrc pmaxuw xxThres, xxCmp psrlw xxThres, ConvNSprShift pmullw xxThres, xxDSlide psrlw xxThres, 8 paddw xxThres, xxDStart psllw xxThres, ConvNSprShift ; DTH_PASS: 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: pextrw rax, xxPeak, 0h cmp rax, 0h je Defect_01 pextrw rax, xxPeak2, 0h sar rax, ConvNSprShift call PixelAddF_BOE pextrw rax, xxSrc, 0h mov rcx, GraySrc mov [rcx+ 4*rrNoD], eax pextrw rax, xxCmp, 0h mov rcx, GrayCmp mov [rcx+ 4*rrNoD], eax ;Threshold ÃßÃâ(BOE) pextrw rax, xxThres, 0h mov rcx, ZoneTh mov [rcx+ 4*rrNoD], eax inc rrNoD DEFECT_01: inc ix pextrw rax, xxPeak, 1h cmp rax, 0h je Defect_02 pextrw rax, xxPeak2, 1h sar rax, ConvNSprShift call PixelAddF_BOE pextrw rax, xxSrc, 1h mov rcx, GraySrc mov [rcx+ 4*rrNoD], eax pextrw rax, xxCmp, 1h mov rcx, GrayCmp mov [rcx+ 4*rrNoD], eax ;Threshold ÃßÃâ(BOE) pextrw rax, xxThres, 1h mov rcx, ZoneTh mov [rcx+ 4*rrNoD], eax inc rrNoD DEFECT_02: inc ix pextrw rax, xxPeak, 2h cmp rax, 0h je Defect_03 pextrw rax, xxPeak2, 2h sar rax, ConvNSprShift call PixelAddF_BOE pextrw rax, xxSrc, 2h mov rcx, GraySrc mov [rcx+ 4*rrNoD], eax pextrw rax, xxCmp, 2h mov rcx, GrayCmp mov [rcx+ 4*rrNoD], eax ;Threshold ÃßÃâ(BOE) pextrw rax, xxThres, 2h mov rcx, ZoneTh mov [rcx+ 4*rrNoD], eax inc rrNoD DEFECT_03: inc ix pextrw rax, xxPeak, 3h cmp rax, 0h je Defect_04 pextrw rax, xxPeak2, 3h sar rax, ConvNSprShift call PixelAddF_BOE pextrw rax, xxSrc, 3h mov rcx, GraySrc mov [rcx+ 4*rrNoD], eax pextrw rax, xxCmp, 3h mov rcx, GrayCmp mov [rcx+ 4*rrNoD], eax ;Threshold ÃßÃâ(BOE) pextrw rax, xxThres, 3h mov rcx, ZoneTh mov [rcx+ 4*rrNoD], eax inc rrNoD DEFECT_04: inc ix pextrw rax, xxPeak, 4h cmp rax, 0h je Defect_05 pextrw rax, xxPeak2, 4h sar rax, ConvNSprShift call PixelAddF_BOE pextrw rax, xxSrc, 4h mov rcx, GraySrc mov [rcx+ 4*rrNoD], eax pextrw rax, xxCmp, 4h mov rcx, GrayCmp mov [rcx+ 4*rrNoD], eax ;Threshold ÃßÃâ(BOE) pextrw rax, xxThres, 4h mov rcx, ZoneTh mov [rcx+ 4*rrNoD], eax inc rrNoD DEFECT_05: inc ix pextrw rax, xxPeak, 5h cmp rax, 0h je Defect_06 pextrw rax, xxPeak2, 5h sar rax, ConvNSprShift call PixelAddF_BOE pextrw rax, xxSrc, 5h mov rcx, GraySrc mov [rcx+ 4*rrNoD], eax pextrw rax, xxCmp, 5h mov rcx, GrayCmp mov [rcx+ 4*rrNoD], eax ;Threshold ÃßÃâ(BOE) pextrw rax, xxThres, 5h mov rcx, ZoneTh mov [rcx+ 4*rrNoD], eax inc rrNoD DEFECT_06: inc ix pextrw rax, xxPeak, 6h cmp rax, 0h je Defect_07 pextrw rax, xxPeak2, 6h sar rax, ConvNSprShift call PixelAddF_BOE pextrw rax, xxSrc, 6h mov rcx, GraySrc mov [rcx+ 4*rrNoD], eax pextrw rax, xxCmp, 6h mov rcx, GrayCmp mov [rcx+ 4*rrNoD], eax ;Threshold ÃßÃâ(BOE) pextrw rax, xxThres, 6h mov rcx, ZoneTh mov [rcx+ 4*rrNoD], eax inc rrNoD DEFECT_07: inc ix pextrw rax, xxPeak, 7h cmp rax, 0h je Defect_End pextrw rax, xxPeak2, 7h sar rax, ConvNSprShift call PixelAddF_BOE pextrw rax, xxSrc, 7h mov rcx, GraySrc mov [rcx+ 4*rrNoD], eax pextrw rax, xxCmp, 7h mov rcx, GrayCmp mov [rcx+ 4*rrNoD], eax ;Threshold ÃßÃâ(BOE) pextrw rax, xxThres, 7h mov rcx, ZoneTh mov [rcx+ 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 mov rrXoD, DefectX mov rrYoD, DefectY mov rrToD, DefectType mov rrPoD, DefectVal 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 rcx, dword ptr [rrXoD+ 4*ix] mov rax, rcx add rax, iPitchHUp cmp rcx, pairRight jg PAIR_RIGHT cmp rcx, 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, rax ; 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 rax, PairAddr mov (astPair ptr [rax]).pos, 1 mov (astPair ptr [rax]).pair, 1 mov (astPair ptr [rax]).x, edx mov (astPair ptr [rax]).y, iy32 mov (astPair ptr [rax]).dtype, rdConAddr movzx edx, word ptr[rrPoD+ 2*rbx] mov (astPair ptr [rax]).peak, edx mov rdx, GraySrc mov ecx, [rdx+ 4*rbx] sar ecx, ConvNSprShift mov (astPair ptr [rax]).src, ecx mov rdx, GrayCmp mov ecx, [rdx+ 4*rbx] sar ecx, ConvNSprShift mov (astPair ptr [rax]).ref, ecx ;Threshold ÃßÃâ(BOE) mov rdx, ZoneTh mov ecx, [rdx+ 4*rbx] sar ecx, ConvNSprShift mov (astPair ptr [rax]).thre, ecx add rax, PairSize mov PairAddr, rax inc nPair jmp LOOP_PAIR_NUM PAIR_LEFT_UNPAIR: mov rax, PairAddr mov (astPair ptr [rax]).pos, 1 mov (astPair ptr [rax]).pair, 5 mov (astPair ptr [rax]).x, ecx mov (astPair ptr [rax]).y, iy32 movzx edx, word ptr[rrToD+ 2*ix] mov (astPair ptr [rax]).dtype, edx movzx edx, word ptr[rrPoD+ 2*ix] mov (astPair ptr [rax]).peak, edx mov rdx, GraySrc mov ecx, [rdx+ 4*ix] sar ecx, ConvNSprShift mov (astPair ptr [rax]).src, ecx mov rdx, GrayCmp mov ecx, [rdx+ 4*ix] sar ecx, ConvNSprShift mov (astPair ptr [rax]).ref, ecx ;Threshold ÃßÃâ(BOE) mov rdx, ZoneTh mov ecx, [rdx+ 4*ix] sar ecx, ConvNSprShift mov (astPair ptr [rax]).thre, ecx add rax, PairSize mov PairAddr, rax 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, rax 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 rax, PairAddr mov (astPair ptr [rax]).pos, 2 mov (astPair ptr [rax]).pair, 1 mov (astPair ptr [rax]).x, edx mov (astPair ptr [rax]).y, iy32 mov (astPair ptr [rax]).dtype, rdConAddr movzx edx, word ptr[rrPoD+ 2*rbx] mov (astPair ptr [rax]).peak, edx mov rdx, GraySrc mov ecx, [rdx+ 4*rbx] sar ecx, ConvNSprShift mov (astPair ptr [rax]).src, ecx mov rdx, GrayCmp mov ecx, [rdx+ 4*rbx] sar ecx, ConvNSprShift mov (astPair ptr [rax]).ref, ecx ;Threshold ÃßÃâ(BOE) mov rdx, ZoneTh mov ecx, [rdx+ 4*rbx] sar ecx, ConvNSprShift mov (astPair ptr [rax]).thre, ecx add rax, PairSize mov PairAddr, rax 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 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] sar eax, ConvNSprShift mov (astPair ptr [rcx]).ref, eax mov rdx, GrayCmp mov eax, [rdx+ 4*ix] sar eax, ConvNSprShift mov (astPair ptr [rcx]).src, eax ;Threshold ÃßÃâ(BOE) mov rdx, ZoneTh mov eax, [rdx+ 4*ix] sar eax, ConvNSprShift mov (astPair ptr [rcx]).thre, 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 ConvFloat_BOE ENDP PixelAddF_BOE PROC mov [rrXoD], ix32 mov [rrYoD], iy32 mov [rrToD], bx mov [rrPoD], ax add rrXoD, 4 add rrYoD, 4 add rrToD, 2 add rrPoD, 2 RET PixelAddF_BOE ENDP end