satpro

FillColor.asm

Feb 16th, 2026
3,578
0
Never
2
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 4.04 KB | Source Code | 0 0
  1.  
  2.  
  3.  
  4.  
  5. ; ========================================================================================
  6. ; FillColor(x,y,w,h,c)
  7. ; p1: r8d  = x
  8. ; p2: r9d  = y
  9. ; p3: r10d = width
  10. ; p4: r11d = height
  11. ; p5: r12d = rgb color
  12. ;
  13. ; Dispatches to AVX2 or SSE based on cpuSupport.
  14. ; ========================================================================================
  15.  
  16. MEMORY$             equ 20000000h                 ; base of emulator RAM
  17. VIDEO$              equ 24000000h             ; 2048x1080x4 = $87:0000 bytes
  18. SPRITE$             equ VIDEO$+880000h            ; 2048x64x4 = 80000h (512k)
  19. REU$                equ 25000000h        ; 16 mb reu
  20.  
  21. global FillColor
  22. export FillColor
  23.  
  24. align 16
  25. FillColor:
  26.  
  27.   sub rsp, 28h
  28.   mov [rsp+00h], rsi
  29.   mov [rsp+08h], rdi
  30.   mov [rsp+10h], rbx
  31.   mov [rsp+18h], rbp
  32.   mov [rsp+20h], r15
  33.  
  34. ; ----- Enter -----
  35.  
  36.  
  37. ; Compute starting dst: base + y*pitch + x*4
  38.   mov edi, VIDEO$             ;base
  39.  
  40.   shl r8d, 2                  ; x * 4
  41.   shl r9d, 13                 ; y * 2000h
  42.  
  43.   add edi, r8d
  44.   add edi, r9d                ; dst ptr
  45.  
  46.   mov ebp, edi                ; 1st row ptr = dst ptr
  47.  
  48. ; --------------------------------------
  49. ;   CPU feature detection (AVX yes/no)
  50. ; --------------------------------------
  51.   xor r15d, r15d                        ; default = 0 (no avx)
  52.  
  53.   mov eax, 1
  54.   cpuid
  55.   shr ecx, 28                           ; shift AVX feature bit into bit 0
  56.   and ecx, 1                            ; isolate the bit (will be 0 or 1)
  57.   add r15d, ecx                         ; add 0 (no AVX) or 1 (AVX)
  58.   test r15d, r15d
  59.   jz .use_sse
  60.  
  61. ; --------
  62. ; AVX path
  63. ; --------
  64.   call FillColorAVX
  65.   jmp .Exit
  66.  
  67. ; --------
  68. ; SSE path
  69. ; --------
  70. .use_sse:
  71.   call FillColorSSE
  72.  
  73.  
  74. ; ----- Exit -----
  75.  
  76. .Exit:
  77.   mov rsi, [rsp+00h]
  78.   mov rdi, [rsp+08h]
  79.   mov rbx, [rsp+10h]
  80.   mov rbp, [rsp+18h]
  81.   mov r15, [rsp+20h]
  82.   add rsp, 28h
  83.   ret
  84.  
  85. ; ========================================================================================
  86.  
  87.  
  88. ; ========================================================================================
  89. ; FillColorAVX2:  (x,w) must be multiples of 8 pixels
  90. ; ========================================================================================
  91. ; r8d = x, r9d = y, r10d = w, r11d = h, r12d = color
  92. ; ========================================================================================
  93.  
  94. global FillColorAVX
  95. ;export FillColorAVX
  96.  
  97. align 16
  98. FillColorAVX:
  99.  
  100.  
  101. ; Broadcast color to ymm0
  102.   movd xmm1, r12d             ; color
  103.   vbroadcastss ymm0, xmm1
  104.  
  105.   shr r10d, 3                 ; 8 pixels per ymm0
  106.  
  107. ; ----- The Loop -----
  108.  
  109.   mov edx, r11d               ; height
  110.  
  111. .fc0:
  112.   mov ecx, r10d               ; width
  113. ;  shr ecx, 3                  ; 8 pixels per ymm0
  114.  
  115. .fc1:
  116.   vmovdqa [edi], ymm0
  117.   add edi, 32                 ; 8 * 4 bytes
  118.   dec ecx
  119.   jnz .fc1
  120.  
  121. ; next row
  122.   add ebp, 2000h              ; next row ptr
  123.   mov edi, ebp                ; next dst ptr
  124.   dec edx
  125.   jnz .fc0
  126.  
  127.  
  128.   ret
  129.  
  130. ; ========================================================================================
  131.  
  132.  
  133. ; ========================================================================================
  134. ; FillColorSSE:  (x,w) must be multiples of 4 pixels
  135. ; ========================================================================================
  136. ; r8d = x, r9d = y, r10d = w, r11d = h, r12d = color
  137. ; ========================================================================================
  138.  
  139. global FillColorSSE
  140. ;export FillColorSSE
  141.  
  142. align 16
  143. FillColorSSE:
  144.  
  145.  
  146.   movd xmm0, r12d
  147.   pshufd xmm0, xmm0, 0        ; replicate color to 4 dwords
  148.  
  149.   shr r10d, 2                 ; 4 pixels per xmm0
  150.  
  151.  
  152. ; ----- The Loop -----
  153.  
  154.   mov edx, r11d               ; height
  155.  
  156. .fc0:
  157.   mov ecx, r10d               ; width
  158. ;  shr ecx, 2                  ; 4 pixels per xmm0
  159.  
  160. .fc1:
  161.   movdqa [edi], xmm0
  162.   add edi, 16
  163.   dec ecx
  164.   jnz .fc1
  165.  
  166.   add ebp, 2000h
  167.   mov edi, ebp
  168.   dec edx
  169.   jnz .fc0
  170.  
  171.  
  172.   ret
  173.  
  174. ; ========================================================================================
  175.  
Tags: SSE avx
Advertisement