mmxp2_32.asm
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:9k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. ;
  2. ; pII-optimised MMX format converters for HERMES
  3. ; Copyright (c) 1998 Christian Nentwich (c.nentwich@cs.ucl.ac.uk)
  4. ;   and (c) 1999 Jonathan Matthew (jmatthew@uq.net.au)
  5. ; This source code is licensed under the GNU LGPL
  6. ; Please refer to the file COPYING.LIB contained in the distribution for
  7. ; licensing conditions
  8. ;
  9. ; COPYRIGHT NOTICE
  10. ; This file partly contains code that is (c) Intel Corporation, specifically
  11. ; the mode detection routine, and the converter to 15 bit (8 pixel
  12. ; conversion routine from the mmx programming tutorial pages).
  13. ;
  14. ;
  15. ; These routines aren't exactly pII optimised - it's just that as they
  16. ; are, they're terrible on p5 MMXs, but less so on pIIs.  Someone needs to
  17. ; optimise them for p5 MMXs..
  18. BITS 32
  19. GLOBAL _ConvertMMXpII32_24RGB888
  20. GLOBAL _ConvertMMXpII32_16RGB565
  21. GLOBAL _ConvertMMXpII32_16BGR565
  22. GLOBAL _ConvertMMXpII32_16RGB555
  23. GLOBAL _ConvertMMXpII32_16BGR555
  24. EXTERN _mmxreturn
  25.  
  26. SECTION .data
  27. ALIGN 8
  28. ;; Constants for conversion routines
  29. mmx32_rgb888_mask dd 00ffffffh,00ffffffh
  30. mmx32_rgb565_b dd 000000f8h, 000000f8h
  31. mmx32_rgb565_g dd 0000fc00h, 0000fc00h
  32. mmx32_rgb565_r dd 00f80000h, 00f80000h
  33. mmx32_rgb555_rb dd 00f800f8h,00f800f8h
  34. mmx32_rgb555_g dd 0000f800h,0000f800h
  35. mmx32_rgb555_mul dd 20000008h,20000008h
  36. mmx32_bgr555_mul dd 00082000h,00082000h
  37. SECTION .text
  38. _ConvertMMXpII32_24RGB888:
  39.         ; set up mm6 as the mask, mm7 as zero
  40.         movq mm6, qword [mmx32_rgb888_mask]
  41.         pxor mm7, mm7
  42.         mov edx, ecx                    ; save ecx
  43.         and ecx, 0fffffffch             ; clear lower two bits
  44.         jnz .L1
  45.         jmp .L2
  46. .L1:
  47.         movq mm0, [esi]                 ; A R G B a r g b
  48.         pand mm0, mm6                   ; 0 R G B 0 r g b
  49.         movq mm1, [esi+8]               ; A R G B a r g b
  50.         pand mm1, mm6                   ; 0 R G B 0 r g b
  51.         movq mm2, mm0                   ; 0 R G B 0 r g b
  52.         punpckhdq mm2, mm7              ; 0 0 0 0 0 R G B
  53.         punpckldq mm0, mm7              ; 0 0 0 0 0 r g b
  54.         psllq mm2, 24                   ; 0 0 R G B 0 0 0
  55.         por mm0, mm2                    ; 0 0 R G B r g b
  56.         movq mm3, mm1                   ; 0 R G B 0 r g b
  57.         psllq mm3, 48                   ; g b 0 0 0 0 0 0
  58.         por mm0, mm3                    ; g b R G B r g b
  59.         movq mm4, mm1                   ; 0 R G B 0 r g b
  60.         punpckhdq mm4, mm7              ; 0 0 0 0 0 R G B
  61.         punpckldq mm1, mm7              ; 0 0 0 0 0 r g b
  62.         psrlq mm1, 16                   ; 0 0 0 R G B 0 r
  63.         psllq mm4, 8                    ; 0 0 0 0 R G B 0
  64.         por mm1, mm4                    ; 0 0 0 0 R G B r
  65.         movq [edi], mm0
  66.         add esi, BYTE 16
  67.         movd [edi+8], mm1
  68.         add edi, BYTE 12
  69.         sub ecx, BYTE 4
  70.         jnz .L1
  71. .L2:
  72.         mov ecx, edx
  73.         and ecx, BYTE 3
  74.         jz .L4
  75. .L3:
  76.         mov al, [esi]
  77.         mov bl, [esi+1]
  78.         mov dl, [esi+2]
  79.         mov [edi], al
  80.         mov [edi+1], bl
  81.         mov [edi+2], dl
  82.         add esi, BYTE 4
  83.         add edi, BYTE 3
  84.         dec ecx
  85.         jnz .L3
  86. .L4:
  87.         jmp _mmxreturn
  88. _ConvertMMXpII32_16RGB565:
  89.         ; set up masks
  90.         movq mm5, [mmx32_rgb565_b]
  91.         movq mm6, [mmx32_rgb565_g]
  92.         movq mm7, [mmx32_rgb565_r]
  93.         mov edx, ecx
  94.         shr ecx, 2
  95.         jnz .L1
  96.         jmp .L2         ; not necessary at the moment, but doesn't hurt (much)
  97. .L1:
  98.         movq mm0, [esi]         ; argb
  99.         movq mm1, mm0           ; argb
  100.         pand mm0, mm6           ; 00g0
  101.         movq mm3, mm1           ; argb
  102.         pand mm1, mm5           ; 000b
  103.         pand mm3, mm7           ; 0r00
  104.         pslld mm1, 2            ; 0 0 000000bb bbb00000
  105.         por mm0, mm1            ; 0 0 ggggggbb bbb00000
  106.         psrld mm0, 5            ; 0 0 00000ggg gggbbbbb
  107.         movq mm4, [esi+8]       ; argb
  108.         movq mm2, mm4           ; argb
  109.         pand mm4, mm6           ; 00g0
  110.         movq mm1, mm2           ; argb
  111.         pand mm2, mm5           ; 000b
  112.         pand mm1, mm7           ; 0r00
  113.         pslld mm2, 2            ; 0 0 000000bb bbb00000
  114.         por mm4, mm2            ; 0 0 ggggggbb bbb00000
  115.         psrld mm4, 5            ; 0 0 00000ggg gggbbbbb
  116.         packuswb mm3, mm1       ; R 0 r 0
  117.         packssdw mm0, mm4       ; as above.. ish
  118.         por mm0, mm3            ; done.
  119.         movq [edi], mm0
  120.         add esi, 16
  121.         add edi, 8
  122.         dec ecx
  123.         jnz .L1
  124. .L2:
  125.         mov ecx, edx
  126.         and ecx, BYTE 3
  127.         jz .L4
  128. .L3:
  129.         mov al, [esi]
  130.         mov bh, [esi+1]
  131.         mov ah, [esi+2]
  132.         shr al, 3
  133.         and eax, 0F81Fh            ; BYTE?
  134.         shr ebx, 5
  135.         and ebx, 07E0h             ; BYTE?
  136.         add eax, ebx
  137.         mov [edi], al
  138.         mov [edi+1], ah
  139.         add esi, BYTE 4
  140.         add edi, BYTE 2
  141.         dec ecx
  142.         jnz .L3
  143. .L4:
  144. jmp _mmxreturn
  145. _ConvertMMXpII32_16BGR565:
  146.         movq mm5, [mmx32_rgb565_r]
  147.         movq mm6, [mmx32_rgb565_g]
  148.         movq mm7, [mmx32_rgb565_b]
  149.         mov edx, ecx
  150.         shr ecx, 2
  151.         jnz .L1
  152.         jmp .L2
  153. .L1:
  154.         movq mm0, [esi]                 ; a r g b
  155.         movq mm1, mm0                   ; a r g b
  156.         pand mm0, mm6                   ; 0 0 g 0
  157.         movq mm3, mm1                   ; a r g b
  158.         pand mm1, mm5                   ; 0 r 0 0
  159.         pand mm3, mm7                   ; 0 0 0 b
  160.         psllq mm3, 16                   ; 0 b 0 0
  161.         psrld mm1, 14                   ; 0 0 000000rr rrr00000
  162.         por mm0, mm1                    ; 0 0 ggggggrr rrr00000
  163.         psrld mm0, 5                    ; 0 0 00000ggg gggrrrrr
  164.         movq mm4, [esi+8]               ; a r g b
  165.         movq mm2, mm4                   ; a r g b
  166.         pand mm4, mm6                   ; 0 0 g 0
  167.         movq mm1, mm2                   ; a r g b
  168.         pand mm2, mm5                   ; 0 r 0 0
  169.         pand mm1, mm7                   ; 0 0 0 b
  170.         psllq mm1, 16                   ; 0 b 0 0
  171.         psrld mm2, 14                   ; 0 0 000000rr rrr00000
  172.         por mm4, mm2                    ; 0 0 ggggggrr rrr00000
  173.         psrld mm4, 5                    ; 0 0 00000ggg gggrrrrr
  174.         packuswb mm3, mm1               ; BBBBB000 00000000 bbbbb000 00000000
  175.         packssdw mm0, mm4               ; 00000GGG GGGRRRRR 00000GGG GGGRRRRR
  176.         por mm0, mm3                    ; BBBBBGGG GGGRRRRR bbbbbggg gggrrrrr
  177.         movq [edi], mm0
  178.         add esi, BYTE 16
  179.         add edi, BYTE 8
  180.         dec ecx
  181.         jnz .L1
  182. .L2:
  183.         and edx, BYTE 3
  184.         jz .L4
  185. .L3:
  186.         mov al, [esi+2]
  187.         mov bh, [esi+1]
  188.         mov ah, [esi]
  189.         shr al, 3
  190.         and eax, 0F81Fh                    ; BYTE ?
  191.         shr ebx, 5
  192.         and ebx, 07E0h                     ; BYTE ?
  193.         add eax, ebx
  194.         mov [edi], al
  195.         mov [edi+1], ah
  196.         add esi, BYTE 4
  197.         add edi, BYTE 2
  198.         dec edx
  199.         jnz .L3
  200. .L4:
  201.         jmp _mmxreturn
  202. _ConvertMMXpII32_16BGR555:
  203.         ; the 16BGR555 converter is identical to the RGB555 one,
  204.         ; except it uses a different multiplier for the pmaddwd
  205.         ; instruction.  cool huh.
  206.         movq mm7, qword [mmx32_bgr555_mul]
  207.         jmp _convert_bgr555_cheat
  208. ; This is the same as the Intel version.. they obviously went to
  209. ; much more trouble to expand/coil the loop than I did, so theirs
  210. ; would almost certainly be faster, even if only a little.
  211. ; I did rename 'mmx32_rgb555_add' to 'mmx32_rgb555_mul', which is
  212. ; (I think) a more accurate name..
  213. _ConvertMMXpII32_16RGB555:
  214.         movq mm7,qword [mmx32_rgb555_mul]
  215. _convert_bgr555_cheat:
  216.         movq mm6,qword [mmx32_rgb555_g]
  217.         
  218. mov edx,ecx            ; Save ecx 
  219.         and ecx,BYTE 0fffffff8h            ; clear lower three bits
  220. jnz .L_OK
  221.         jmp near .L2 
  222. .L_OK:
  223. movq mm2,[esi+8]
  224. movq mm0,[esi]
  225. movq mm3,mm2
  226. pand mm3,qword [mmx32_rgb555_rb]
  227. movq mm1,mm0
  228. pand mm1,qword [mmx32_rgb555_rb]
  229. pmaddwd mm3,mm7
  230. pmaddwd mm1,mm7
  231. pand mm2,mm6
  232. .L1:
  233. movq mm4,[esi+24]
  234. pand mm0,mm6
  235. movq mm5,[esi+16]
  236. por mm3,mm2
  237. psrld mm3,6
  238. por mm1,mm0
  239. movq mm0,mm4
  240. psrld mm1,6
  241. pand mm0,qword [mmx32_rgb555_rb]
  242. packssdw mm1,mm3
  243. movq mm3,mm5
  244. pmaddwd mm0,mm7
  245. pand mm3,qword [mmx32_rgb555_rb]
  246. pand mm4,mm6
  247. movq [edi],mm1
  248. pmaddwd mm3,mm7
  249.         add esi,BYTE 32
  250. por mm4,mm0
  251. pand mm5,mm6
  252. psrld mm4,6
  253. movq mm2,[esi+8]
  254. por mm5,mm3
  255. movq mm0,[esi]
  256. psrld mm5,6
  257. movq mm3,mm2
  258. movq mm1,mm0
  259. pand mm3,qword [mmx32_rgb555_rb]
  260. packssdw mm5,mm4
  261. pand mm1,qword [mmx32_rgb555_rb]
  262. pand mm2,mm6
  263. movq [edi+8],mm5
  264. pmaddwd mm3,mm7
  265. pmaddwd mm1,mm7
  266.         add edi,BYTE 16
  267.         sub ecx,BYTE 8
  268. jz .L2
  269.         jmp .L1
  270. .L2:
  271. mov ecx,edx
  272.         and ecx,BYTE 7
  273. jz .L4
  274. .L3:
  275. mov ebx,[esi]
  276.         add esi,BYTE 4
  277.         mov eax,ebx
  278.         mov edx,ebx
  279.         shr eax,3
  280.         shr edx,6
  281.         and eax,BYTE 0000000000011111b
  282.         and edx,     0000001111100000b
  283.         shr ebx,9
  284.         or eax,edx
  285.         and ebx,     0111110000000000b
  286.         or eax,ebx
  287.         mov [edi],ax
  288.         add edi,BYTE 2
  289. dec ecx
  290. jnz .L3
  291. .L4:
  292. jmp _mmxreturn