LWQ
2025-07-14 8c7705d8e69c358dcbe77354fcc02b76156e8164
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
 
; CheckPitchAsm ¼öÁ¤ - 2011.02.14
; ÇÇÄ¡ Á¤º¸¸¦ pitch16 ±â¹ÝÀ¸·Î ¼öÁ¤
; CheckPitchPixelAsm Ãß°¡ - 2011.02.14
; Ãß°¡Áß Áß´Ü.. ¼Óµµ°¡ Áö±ØÈ÷ ÇÊ¿äÇϸ頿ϼº ÇÏ´øÁö.
; CheckPitchAsmVert Ãß°¡ - 2011.02.16
 
 
.data
 
.code
 
 
ImgAddr        equ        r14
 
ByteAddr    equ        rcx
ShortAddr    equ        rdx
nByte        equ        r8
 
iByte        equ        r9
 
 
Byte_To_Short PROC
 
    pxor    xmm0, xmm0
 
    cmp        nByte, 10h
    jl        START_EXTRA
 
    mov        iByte, 10h
 
LOOP_SIMD:
 
    movdqu    xmm1, [ByteAddr]
    movdqa    xmm2, xmm1
 
    punpcklbw    xmm1, xmm0
    punpckhbw    xmm2, xmm0
 
    movntdq    [ShortAddr], xmm1
    movntdq    [ShortAddr+10h], xmm2
 
    add        ByteAddr, 10h
    add        ShortAddr, 20h
 
    add        iByte, 10h
    cmp        iByte, nByte
    jle        LOOP_SIMD
    sub        iByte, 10h
 
START_EXTRA:
    xor        rax, rax
 
    cmp        iByte, nByte
    jge        LOOP_END
 
LOOP_EXTRA:
 
    mov        al, [ByteAddr]
    mov        [ShortAddr], ax
 
 
    inc        ByteAddr
    add        ShortAddr, 2
    inc        iByte
 
    cmp        iByte, nByte
    jl        LOOP_EXTRA
 
LOOP_END:
 
RET
Byte_To_Short ENDP
 
 
 
;==========================================================
 
iPitch16    equ        rcx
rrImgAddr    equ        r8
rrBW        equ        r9
 
rrPitch        equ        r10
rrPitch1    equ        r11
rrPitch2    equ        r12
rrPitch3    equ        r13
rrInspBot    equ        r15
 
ix            equ        rsi
iy            equ        rdi
 
ConvShift            equ        1
SprShift            equ        4
ConvNSprShift        equ        5
 
InspLeft        equ        qword ptr[rbp+ 30h]
InspTop            equ        qword ptr[rbp+ 38h]
InspWidth        equ        qword ptr[rbp+ 40h]
InspHeight        equ        qword ptr[rbp+ 48h]
 
DPC_SUPP        EQU        QWORD PTR[RBP+ 50H]
 
 
xxSupp2        equ        xmm3
xxSrc        equ        xmm4
xxSrc2        equ        xmm5
xxCmp        equ        xmm6
xxCmp2        equ        xmm7
xxSpr        equ        xmm8
xxOne        equ        xmm9
xxfSpr        equ        xmm10
xxsSpr        equ        xmm11
xxMinus        equ        xmm12
xxMinus2    equ        xmm13
xxRslt        equ        xmm14
 
 
 
CheckPitchAsm    PROC
    local ImgAddrLine            :qword
    local ImgAddrLineEnd        :qword
    local InspBottom            :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, 020h
 
 
    mov        rrPitch, rcx
    sar        rrPitch, SprShift
 
    mov        rax, 2                    ; Suppress
    mul        rdx
    sal        rax, 4
    movd    xxSupp2, rax
    movdqa    xmm0, xxSupp2
    punpcklwd    xmm0, xxSupp2
    pshufd    xxSupp2, xmm0, 0
 
    mov            rax, 10h            ; spr
    movd        xxSpr, rax
    movdqa        xmm0, xxSpr
    punpcklwd    xmm0, xxSpr
    pshufd        xxSpr, xmm0, 0
 
    mov        rax, rcx                ; sSpr
    and        rax, 0fh
    movd        xxsSpr, rax
    movdqa        xmm0, xxsSpr
    punpcklwd    xmm0, xxsSpr
    pshufd        xxsSpr, xmm0, 0
 
    movdqa    xxfSpr, xxSpr            ; fSpr
    psubw    xxfSpr, xxsSpr
 
    mov        rax, InspTop
    add        rax, InspHeight
    mov        InspBottom, rax
 
 
    mov        rrPitch2, rrPitch
    add        rrPitch2, 1h
    mov        rrPitch3, rrPitch
    add        rrPitch3, 2h
 
 
 
    mov        rax, 1
    movd        xxOne, rax        ; 1·Î Ã¤¿î´Ù.(word)
    movdqa        xmm0, xxOne
    punpcklwd    xmm0, xxOne
    pshufd        xxOne, xmm0, 0
    
 
 
; À̹ÌÁö ÁÖ¼Ò ¸¸µé±â
    mov        rax, rrBW        ; ImgAddr= ImgAddr+ BuffWidth*InspTop + InspLeft;
    mul        InspTop
    add        rax, InspLeft
    add        rrImgAddr, rax
    mov        ImgAddrLine, rrImgAddr
 
    mov        rax, ImgAddrLine
    add        rax, InspWidth
    mov        ImgAddrLineEnd, rax
 
    mov        iy, InspTop
    pxor    xxRslt, xxRslt
    pxor    xmm0, xmm0
 
Cmp_16:
                                        ; 1. Src Buffer
    movdqu    xxSrc, [rrImgAddr]            ; Load
    movdqa    xxSrc2, xxSrc
    punpcklbw    xxSrc, xmm0                ; Unpack
    punpckhbw    xxSrc2, xmm0
 
    movdqu    xxMinus, [rrImgAddr+ 1]            ; Load
    movdqa    xxMinus2, xxMinus
    punpcklbw    xxMinus, xmm0                ; Unpack
    punpckhbw    xxMinus2, xmm0
    paddw    xxSrc, xxMinus
    paddw    xxSrc2, xxMinus2
 
    pmullw    xxSrc, xxSpr                ; SPR
    pmullw    xxSrc2, xxSpr
 
 
                                        ;    2. Compare Buffer
    movdqu    xxCmp, [rrImgAddr+ rrPitch]    ; Load
    movdqa    xxCmp2, xxCmp
    punpcklbw    xxCmp, xmm0                ; Unpack
    punpckhbw    xxCmp2, xmm0
    pmullw    xxCmp, xxfSpr                ; fSpr
    pmullw    xxCmp2, xxfSpr
 
    psubw    xxSrc, xxCmp                ; SPR - fSpr
    psubw    xxSrc2, xxCmp2
 
    movdqu    xxCmp, [rrImgAddr+ rrPitch2]
    movdqa    xxCmp2, xxCmp
    punpcklbw    xxCmp, xmm0
    punpckhbw    xxCmp2, xmm0
    pmullw    xxCmp, xxSpr
    pmullw    xxCmp2, xxSpr
 
    psubw    xxSrc, xxCmp
    psubw    xxSrc2, xxCmp2
 
    movdqu    xxCmp, [rrImgAddr+ rrPitch3]        ; Load
    movdqa    xxCmp2, xxCmp
    punpcklbw    xxCmp, xmm0                ; Unpack
    punpckhbw    xxCmp2, xmm0
    pmullw    xxCmp, xxsSpr                ; sSpr
    pmullw    xxCmp2, xxsSpr
 
    psubw    xxSrc, xxCmp                ; (SPR- fSpr) - sSpr
    psubw    xxSrc2, xxCmp2
 
 
    pabsw    xxSrc, xxSrc                ; Àý´ë°ª
    psubusw    xxSrc, xxSupp2
    pmaddwd    xxSrc, xxOne                ; multiply and add ( 16 -> 32)
    pabsw    xxSrc2, xxSrc2                ; Àý´ë°ª
    psubusw    xxSrc2, xxSupp2
    pmaddwd    xxSrc2, xxOne                ; multiply and add ( 16 -> 32)
 
    movdqa    xxCmp, xxSrc
    punpckldq    xxCmp, xmm0                ; unpack 32 -> 64
    punpckhdq    xxSrc, xmm0
    
    paddq    xxRslt, xxSrc                ; add to Result(64)
    paddq    xxRslt, xxCmp                ; add to Result(64)
 
    movdqa    xxCmp, xxSrc2
    punpckldq    xxCmp, xmm0                ; unpack 32 -> 64
    punpckhdq    xxSrc2, xmm0
 
    paddq    xxRslt, xxSrc2                ; add to Result(64)
    paddq    xxRslt, xxCmp                ; add to Result(64)
 
 
    add    rrImgAddr, 10h
    cmp    rrImgAddr, ImgAddrLineEnd
    jl    Cmp_16
 
    inc    iy
    cmp    iy, InspBottom
    jge    End_Buff
 
 
    mov    rax, ImgAddrLine
    add    rax, rrBW
    mov    ImgAddrLine, rax
    mov    rrImgAddr, rax
 
    add    rax, InspWidth
    mov    ImgAddrLineEnd, rax
 
    jmp    Cmp_16
 
 
End_Buff:
 
    pextrq    rax, xxRslt, 0
    pextrq    rcx, xxRslt, 1
    add        rax, rcx
 
    pop    rbx
    pop    rsi
    pop    rdi
    pop    r15
    pop    r14
    pop    r13
    pop    r12
    pop    r11
    pop    r10
    pop        rbp
 
RET
 
CheckPitchAsm    ENDP
 
 
 
CheckPitchPixelAsm PROC
    local ImgAddrLine            :qword
    local ImgAddrLineEnd        :qword
    local InspBottom            :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, 020h
 
    mov        rax, InspTop
    add        rax, InspHeight
    mov        InspBottom, rax
 
    mov        rax, rrBW
    mul        InspTop
    add        rax, InspLeft
    add        rrImgAddr, rax
    mov        ImgAddrLine, rrImgAddr
 
 
    add        rax, rrImgAddr
    mov        ImgAddrLineEnd, rax
 
    mov        iy, InspTop
    pxor    xxRslt, xxRslt
    pxor    xmm0, xmm0
 
Cmp_16:
    movdqu        xxSrc, [rrImgAddr]
    movdqa        xxSrc2, xxSrc
    punpcklbw    xxSrc, xmm0
    punpckhbw    xxSrc2, xmm0
 
    movdqu        xxCmp, [rrImgAddr+ rrPitch]
    movdqa        xxCmp2, xxCmp
    punpcklbw    xxCmp, xmm0
    punpckhbw    xxCmp2, xmm0
 
    psubw        xxSrc, xxCmp
    pabsw        xxSrc, xxSrc
    psubusw    xxSrc, xxSupp2
 
    pmaddwd    xxSrc, xxOne            ; multiply and add ( 16bit -> 32bit)
    movdqa        xxCmp, xxSrc
    punpckldq    xxSrc, xmm0            ; unpack (32bit -> 64bit)
    punpckhdq    xxCmp, xmm0
    paddq        xxRslt, xxSrc
    paddq        xxRslt, xxCmp
 
    psubw        xxSrc2, xxCmp2
    pabsw        xxSrc2, xxSrc2
    psubusw    xxSrc2, xxSupp2
    pmaddwd    xxSrc2, xxOne
    movdqa        xxCmp, xxSrc2
    punpckldq    xxSrc2, xmm0
    punpckhdq    xxCmp, xmm0
    paddq        xxRslt, xxSrc2
    paddq        xxRslt, xxCmp
 
    add        rrImgAddr, 10h
    cmp        rrImgAddr, ImgAddrLineEnd
    jl        Cmp_16
 
    inc        iy
    cmp        iy, InspBottom
    jge        End_Buff
 
    mov        rax, ImgAddrLine
    add        rax, rrBW
    mov        ImgAddrLine, rax
    mov        rrImgAddr, rax
 
    add        rax, InspWidth
    mov        ImgAddrLineEnd, rax
 
    jmp        Cmp_16
 
End_Buff:
 
    pextrq    rax, xxRslt, 0
    pextrq    rcx, xxRslt, 1
    add        rax, rcx
 
    pop    rbx
    pop    rsi
    pop    rdi
    pop    r15
    pop    r14
    pop    r13
    pop    r12
    pop    r11
    pop    r10
    pop        rbp
ret
CheckPitchPixelAsm ENDP
 
 
 
CheckPitchAsmVert        PROC
    local ImgAddrLine            :qword
    local InspBottom            :qword
    local InspRight            :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, 020h
 
    mov        rrPitch, rcx
    sar        rrPitch, SprShift
 
    sal        rdx, ConvNSprShift        ; Suppress
    movd    xxSupp2, rdx
    movdqa    xmm0, xxSupp2
    punpcklwd    xmm0, xxSupp2
    pshufd    xxSupp2, xmm0, 0
 
    mov            rax, 10h            ; spr
    movd        xxSpr, rax
    movdqa        xmm0, xxSpr
    punpcklwd    xmm0, xxSpr
    pshufd        xxSpr, xmm0, 0
 
    mov        rax, rcx                ; sSpr
    and        rax, 0fh
    movd        xxsSpr, rax
    movdqa        xmm0, xxsSpr
    punpcklwd    xmm0, xxsSpr
    pshufd        xxsSpr, xmm0, 0
 
    movdqa    xxfSpr, xxSpr            ; fSpr
    psubw    xxfSpr, xxsSpr
 
    mov        rax, InspTop
    add        rax, InspHeight
    mov        InspBottom, rax
 
    mov        rax, InspWidth
    sar        rax, SprShift
    sal        rax, SprShift
    add        rax, InspLeft
    mov        InspRight, rax
 
    mov        rax, 1
    movd        xxOne, rax        ; 1·Î Ã¤¿î´Ù.(word)
    movdqa        xmm0, xxOne
    punpcklwd    xmm0, xxOne
    pshufd        xxOne, xmm0, 0
 
 
    mov        rax, rrBW
    mul        rrPitch
    mov        rrPitch1, rax
    add        rax, rrBW
    mov        rrPitch2, rax
    add        rax, rrBW
    mov        rrPitch3, rax
 
    mov        rax, rrBW        ; ImgAddr= ImgAddr+ BuffWidth*InspTop + InspLeft;
    mul        InspTop
    add        rax, InspLeft
    add        rrImgAddr, rax
    mov        ImgAddrLine, rrImgAddr
 
    pxor    xxRslt, xxRslt
    pxor    xmm0, xmm0
 
 
START:
 
    mov        ix, InspLeft
    mov        iy, InspTop
    jmp        LOOP_X_CHECK
 
LOOP_X_TAIL:
    add        ix, 10h
 
    mov        rrImgAddr, ImgAddrLine
    add        rrImgAddr, 10h
    mov        ImgAddrLine, rrImgAddr
 
    mov        rax, rrImgAddr
 
    mov        iy, InspTop
 
LOOP_X_CHECK:
    cmp        ix, InspRight
    jge        End_Buff
 
    jmp        LOOP_X_BODY
 
LOOP_X_BODY:
    jmp        LOOP_Y_CHECK
 
LOOP_Y_TAIL:
    inc        iy
    add        rrImgAddr, rrBW
LOOP_Y_CHECK:
    cmp        iy, InspBottom
    jge        LOOP_X_TAIL    
 
 
 
LOOP_Y_BODY:
    movdqu        xxSrc, [rrImgAddr]
    movdqa        xxSrc2, xxSrc
    punpcklbw    xxSrc, xmm0
    punpckhbw    xxSrc2, xmm0
 
    movdqu        xxCmp, [rrImgAddr+ rrBW]
    movdqa        xxCmp2, xxCmp
    punpcklbw    xxCmp, xmm0
    punpckhbw    xxCmp2, xmm0
 
    paddw        xxSrc, xxCmp
    paddw        xxSrc2, xxCmp2
 
    psllw        xxSrc, SprShift        ; spr Shift
    psllw        xxSrc2, SprShift
 
 
    movdqu        xxCmp, [rrImgAddr+ rrPitch1]
    movdqa        xxCmp2, xxCmp
    punpcklbw    xxCmp, xmm0
    punpckhbw    xxCmp2, xmm0
    pmullw        xxCmp, xxfSpr                ; fSpr
    pmullw        xxCmp2, xxfSpr
 
    psubw    xxSrc, xxCmp                ; SPR - fSpr
    psubw    xxSrc2, xxCmp2
 
 
    movdqu        xxCmp, [rrImgAddr+ rrPitch2]
    movdqa        xxCmp2, xxCmp
    punpcklbw    xxCmp, xmm0
    punpckhbw    xxCmp2, xmm0
    psllw        xxCmp, SprShift
    psllw        xxCmp2, SprShift
 
    psubw    xxSrc, xxCmp
    psubw    xxSrc2, xxCmp2
 
    movdqu        xxCmp, [rrImgAddr+ rrPitch3]        ; Load
    movdqa        xxCmp2, xxCmp
    punpcklbw    xxCmp, xmm0                ; Unpack
    punpckhbw    xxCmp2, xmm0
    pmullw        xxCmp, xxsSpr                ; sSpr
    pmullw        xxCmp2, xxsSpr
 
    psubw    xxSrc, xxCmp                ; (SPR- fSpr) - sSpr
    psubw    xxSrc2, xxCmp2
 
    pabsw        xxSrc, xxSrc                ; Àý´ë°ª
    pabsw        xxSrc2, xxSrc2                ; Àý´ë°ª
    psubusw    xxSrc, xxSupp2
    psubusw    xxSrc2, xxSupp2
    pmaddwd    xxSrc, xxOne                ; multiply and add ( 16 -> 32)
    pmaddwd    xxSrc2, xxOne                ; multiply and add ( 16 -> 32)
 
    movdqa        xxCmp, xxSrc
    punpckldq    xxCmp, xmm0                ; unpack 32 -> 64
    punpckhdq    xxSrc, xmm0
 
    paddq    xxRslt, xxSrc                ; add to Result(64)
    paddq    xxRslt, xxCmp                ; add to Result(64)
 
    movdqa        xxCmp, xxSrc2
    punpckldq    xxCmp, xmm0                ; unpack 32 -> 64
    punpckhdq    xxSrc2, xmm0
 
    paddq    xxRslt, xxSrc2                ; add to Result(64)
    paddq    xxRslt, xxCmp                ; add to Result(64)
 
    jmp        LOOP_Y_TAIL
 
 
End_Buff:
 
 
    
    pextrq    rax, xxRslt, 0
    pextrq    rcx, xxRslt, 1
    add        rax, rcx
 
 
    pop        rbx
    pop        rsi
    pop        rdi
    pop        r15
    pop        r14
    pop        r13
    pop        r12
    pop        r11
    pop        r10
    pop        rbp
ret
CheckPitchAsmVert        ENDP
 
 
 
 
 
end