Advertisement
Guest User

Untitled

a guest
Apr 24th, 2018
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; rdi = char *filename, rsi = struc buffer_struc *mem
  2. ; rax = void *memory, rbx = u32 width, rcx = u32 height
  3. load_entire_farbfeld_to_memory:
  4.     ; Just allocate enough, so that it won't be an issue
  5.     mov eax, [rsi + buffer_struct.used]
  6.     mov r10d, eax ; r10 is now the previous used
  7.     mov rbp, [rsi + buffer_struct.base]
  8.     mov rbx, 0xF
  9.     add rax, 0xF
  10.     neg rbx
  11.     and rax, rbx ; align rax to 16 bit
  12.     add rbp, rax
  13.     add eax, MB(5)
  14.     mov [rsi + buffer_struct.used], eax
  15.     call load_entire_file_to_memory
  16.     ; rbx is set as size now
  17.     mov r9, rax
  18.     mov r8, [r9 + 8] ; r8 is height + width
  19.     mov r11, r8
  20.     shr r11, 32 ; r11 is height
  21.     shl r8, 32
  22.     shr r8, 32 ; r8 is width
  23.     bswap r8d
  24.     bswap r11d
  25.     sub rbx, 16 ; rbx is now size of data
  26.     mov rax, 2
  27.     mul rbx
  28.     mov rbx, rax ; We are moving from 2 byte data size, to 4
  29.     add r9, 16 ; r9 now points to beginning of data
  30.  
  31.     mov rax, 0x0E0C0A0806040200
  32.     movq mm0, rax
  33.     movq2dq xmm1, mm0
  34.     movlhps xmm1, xmm1
  35.     mov rax, 0xFFFFFFFFFFFFFFFF
  36.     movq mm0, rax
  37.     movq2dq xmm2, mm0
  38.     movsd xmm1, xmm2 ; xmm1 is now our first mask
  39.  
  40.     mov rax, 0xFFFFFFFFFFFFFFFF
  41.     movq mm0, rax
  42.     movq2dq xmm2, mm0
  43.     movlhps xmm2, xmm2
  44.     mov rax, 0x0E0C0A0806040200
  45.     movq mm0, rax
  46.     movq2dq xmm3, mm0
  47.     movsd xmm2, xmm3 ; xmm2 is now our second mask
  48.  
  49.     xor rdx, rdx
  50.     xor rcx, rcx
  51.     xor rax, rax
  52.     neg ax
  53.     movq xmm0, rax ; xmm0 is now divisor
  54.     cvtdq2ps xmm0, xmm0
  55. load_entire_farbfeld_to_memory_loop_begin:
  56.     movaps xmm4, [r9 + rdx]
  57.     add rdx, 16
  58.     movq xmm5, xmm4
  59.     pshufb xmm4, xmm1
  60.     pshufb xmm5, xmm1
  61.     cvtdq2ps xmm4, xmm4
  62.     cvtdq2ps xmm5, xmm5
  63.     divps xmm4, xmm0
  64.     divps xmm5, xmm0
  65.     movdqa [rbp + rcx], xmm4
  66.     add rcx, 16
  67.     movdqa [rbp + rcx], xmm5
  68.     add rcx, 16
  69.  
  70.     cmp rcx, rbx
  71.     jl load_entire_farbfeld_to_memory_loop_begin
  72.  
  73.     mov rbx, r8
  74.     mov rcx, r11
  75.     ; Calculate the actual used memory
  76.     mov rax, rbx
  77.     mul rcx
  78.     shl rax, 3 ; RGBA * 4
  79.     add r10, rax
  80.     mov [rsi + buffer_struct.used], r10d
  81.     mov rax, rbp
  82.  
  83.     ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement