Advertisement
SilLAwNeD

ASM SIMD TP8 MI01

Dec 24th, 2018
420
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; image_simd.asm
  2. ;
  3. ; MI01 - TP Assembleur 2 à 5
  4. ;
  5. ; Réalise le traitement d'une image bitmap 32 bits par pixel.
  6.  
  7. title image_simd.asm
  8.  
  9. .data
  10.  
  11. ;rouge      dw      004ch
  12. ;vert       dw      0096h
  13. ;bleu       dw      001dh
  14. coef        dq      0000004c0096001dh
  15.  
  16. .code
  17.  
  18. ; **********************************************************************
  19. ; Sous-programme _process_image_asm
  20. ;
  21. ; Réalise le traitement d'une image 32 bits.
  22. ;
  23. ; Le passage des paramètres respecte les conventions fastcall x64 sous
  24. ; Windows. La fonction prend les paramètres suivants, dans l'ordre :
  25. ;  - biWidth : largeur d'une ligne en pixels (32 bits non signé)
  26. ;  - biHeight de l'image en lignes (32 bits non signé)
  27. ;  - img_src : adresse du premier pixel de l'image source
  28. ;  - img_temp1 : adresse du premier pixel de l'image temporaire 1
  29. ;  - img_temp2 : adresse du premier pixel de l'image temporaire 2
  30. ;  - img_dest : adresse du premier pixel de l'image finale
  31. ;
  32. ; La fonction ne retourne pas de valeur.
  33. ;
  34. ; Les registes rbx, rbp, rdi, rsi, rsp, r12, r13, r14, et r15 doivent
  35. ; être sauvegardés si vous les utilisez (sauvegarde par l'appelé). Les
  36. ; autres registres peuvent être modifiés sans risque (sauvegardés par
  37. ; l'appelant).
  38. ; **********************************************************************
  39.  
  40. public  process_image_simd
  41. process_image_simd  proc        ; Point d'entrée du sous programme
  42.  
  43.         ; *****************************
  44.         ; Ajoutez votre code ci-dessous
  45.         ; *****************************
  46.  
  47.         mov     rax, rcx                ; rcx contient la largeur
  48.         mul     rdx                     ; On multiplie la largeur (rcx) par la longueur (rdx) pour obtenir la taille de l'image dans rax
  49.         mov     rcx, rax                ; rcx reçoit la taille de l'image
  50.         mov     rax, 0FFh               ; pour placer le masque
  51.         movq    xmm3, rax               ; masque SSE dans xmm3
  52.     punpcklqdq  xmm3, xmm3              ; 2 masques de 64 bits
  53.         xor     rax, rax
  54.         xor     rbx, rbx
  55.  
  56.        
  57. niveau: movq    xmm0, qword ptr[r8 + rcx*4 - 8]         ; -8 pour ne pas sortir de l'image à la première itération
  58.         pxor    xmm2, xmm2
  59.     punpcklbw   xmm0, xmm2
  60.  
  61.         movq    xmm1, qword ptr[coef]
  62.     punpcklqdq  xmm1, xmm1
  63.  
  64.         pmullw  xmm0, xmm1
  65.         psrlw   xmm0, 8
  66.  
  67.         paddusb xmm2, xmm0
  68.         psrlq   xmm2, 16
  69.         paddusb xmm2, xmm0
  70.         psrlq   xmm2, 16
  71.         paddusb xmm2, xmm0                              ; la somme I est dans le dernier byte de chaque partie de 8 bytes
  72.         pand    xmm2, xmm3                              ; on filtre avec notre masque
  73.  
  74.         movd    dword ptr[r9 + rcx * 4 - 8], xmm2       ; on place les 4 derniers byte
  75.         psrldq  xmm2, 8                                 ; on décale les valeurs de 64 bits vers la droite
  76.         movd    dword ptr[r9 + rcx * 4 - 4], xmm2       ; 2e pixel traiter
  77.  
  78.         sub     rcx, 2                                  ; -2 car deux pixel traités
  79.         cmp     rcx, 0
  80.         jne     niveau
  81.  
  82.         ret                     ; Retour à la fonction d'appel
  83. process_image_simd  endp
  84.  
  85. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement