checkasm-a.asm
上传用户:lctgjx
上传日期:2022-06-04
资源大小:8887k
文件大小:4k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* checkasm-a.asm
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2008 Loren Merritt <lorenm@u.washington.edu>
  5. ;*
  6. ;* This program is free software; you can redistribute it and/or modify
  7. ;* it under the terms of the GNU General Public License as published by
  8. ;* the Free Software Foundation; either version 2 of the License, or
  9. ;* (at your option) any later version.
  10. ;*
  11. ;* This program is distributed in the hope that it will be useful,
  12. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14. ;* GNU General Public License for more details.
  15. ;*
  16. ;* You should have received a copy of the GNU General Public License
  17. ;* along with this program; if not, write to the Free Software
  18. ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
  19. ;*****************************************************************************
  20. %include "x86inc.asm"
  21. SECTION_RODATA
  22. error_message: db "failed to preserve register", 0
  23. %ifdef WIN64
  24. ; just random numbers to reduce the chance of incidental match
  25. ALIGN 16
  26. n4:   dq 0xa77809bf11b239d1
  27. n5:   dq 0x2ba9bf3d2f05b389
  28. x6:  ddq 0x79445c159ce790641a1b2550a612b48c
  29. x7:  ddq 0x86b2536fcd8cf6362eed899d5a28ddcd
  30. x8:  ddq 0x3f2bf84fc0fcca4eb0856806085e7943
  31. x9:  ddq 0xd229e1f5b281303facbd382dcf5b8de2
  32. x10: ddq 0xab63e2e11fa38ed971aeaff20b095fd9
  33. x11: ddq 0x77d410d5c42c882d89b0c0765892729a
  34. x12: ddq 0x24b3c1d2a024048bc45ea11a955d8dd5
  35. x13: ddq 0xdd7b8919edd427862e8ec680de14b47c
  36. x14: ddq 0x11e53e2b2ac655ef135ce6888fa02cbf
  37. x15: ddq 0x6de8f4c914c334d5011ff554472a7a10
  38. %endif
  39. SECTION .text
  40. cextern puts
  41. ; max number of args used by any x264 asm function.
  42. ; (max_args % 4) must equal 3 for stack alignment
  43. %define max_args 11
  44. %ifdef WIN64
  45. ;-----------------------------------------------------------------------------
  46. ; intptr_t x264_checkasm_call( intptr_t (*func)(), int *ok, ... )
  47. ;-----------------------------------------------------------------------------
  48. cglobal x264_checkasm_call, 4,7,16
  49.     sub  rsp, max_args*8
  50.     %assign stack_offset stack_offset+max_args*8
  51.     mov  r6, r0
  52.     mov  [rsp+stack_offset+16], r1
  53.     mov  r0, r2
  54.     mov  r1, r3
  55.     mov r2d, r4m ; FIXME truncates pointer
  56.     mov r3d, r5m ; FIXME truncates pointer
  57. %assign i 4
  58. %rep max_args-4
  59.     mov  r4, [rsp+stack_offset+8+(i+2)*8]
  60.     mov  [rsp+i*8], r4
  61.     %assign i i+1
  62. %endrep
  63. %assign i 6
  64. %rep 16-6
  65.     movdqa xmm %+ i, [x %+ i GLOBAL]
  66.     %assign i i+1
  67. %endrep
  68.     mov  r4, [n4 GLOBAL]
  69.     mov  r5, [n5 GLOBAL]
  70.     call r6
  71.     xor  r4, [n4 GLOBAL]
  72.     xor  r5, [n5 GLOBAL]
  73.     or   r4, r5
  74.     pxor xmm5, xmm5
  75. %assign i 6
  76. %rep 16-6
  77.     pxor xmm %+ i, [x %+ i GLOBAL]
  78.     por  xmm5, xmm %+ i
  79.     %assign i i+1
  80. %endrep
  81.     packsswb xmm5, xmm5
  82.     movq r5, xmm5
  83.     or   r4, r5
  84.     jz .ok
  85.     mov  r4, rax
  86.     lea  r0, [error_message GLOBAL]
  87.     call puts
  88.     mov  r1, [rsp+stack_offset+16]
  89.     mov  dword [r1], 0
  90.     mov  rax, r4
  91. .ok:
  92.     add  rsp, max_args*8
  93.     %assign stack_offset stack_offset-max_args*8
  94.     RET
  95. %elifndef ARCH_X86_64
  96. ; just random numbers to reduce the chance of incidental match
  97. %define n3 dword 0x6549315c
  98. %define n4 dword 0xe02f3e23
  99. %define n5 dword 0xb78d0d1d
  100. %define n6 dword 0x33627ba7
  101. ;-----------------------------------------------------------------------------
  102. ; intptr_t x264_checkasm_call( intptr_t (*func)(), int *ok, ... )
  103. ;-----------------------------------------------------------------------------
  104. cglobal x264_checkasm_call, 1,7
  105.     mov  r3, n3
  106.     mov  r4, n4
  107.     mov  r5, n5
  108.     mov  r6, n6
  109. %rep max_args
  110.     push dword [esp+24+max_args*4]
  111. %endrep
  112.     call r0
  113.     add  esp, max_args*4
  114.     xor  r3, n3
  115.     xor  r4, n4
  116.     xor  r5, n5
  117.     xor  r6, n6
  118.     or   r3, r4
  119.     or   r5, r6
  120.     or   r3, r5
  121.     jz .ok
  122.     mov  r3, eax
  123.     lea  r1, [error_message GLOBAL]
  124.     push r1
  125.     call puts
  126.     add  esp, 4
  127.     mov  r1, r1m
  128.     mov  dword [r1], 0
  129.     mov  eax, r3
  130. .ok:
  131.     RET
  132. %endif ; ARCH_X86_64
  133. ;-----------------------------------------------------------------------------
  134. ; int x264_stack_pagealign( int (*func)(), int align )
  135. ;-----------------------------------------------------------------------------
  136. cglobal x264_stack_pagealign, 2,2
  137.     push rbp
  138.     mov  rbp, rsp
  139.     and  rsp, ~0xfff
  140.     sub  rsp, r1
  141.     call r0
  142.     leave
  143.     RET