amd64inc.asm
上传用户:hjq518
上传日期:2021-12-09
资源大小:5084k
文件大小:7k
源码类别:

Audio

开发平台:

Visual C++

  1. ;*****************************************************************************
  2. ;* amd64inc.asm: h264 encoder library
  3. ;*****************************************************************************
  4. ;* Copyright (C) 2005 x264 project
  5. ;*
  6. ;* Authors: Andrew Dunstan
  7. ;*
  8. ;* This program is free software; you can redistribute it and/or modify
  9. ;* it under the terms of the GNU General Public License as published by
  10. ;* the Free Software Foundation; either version 2 of the License, or
  11. ;* (at your option) any later version.
  12. ;*
  13. ;* This program is distributed in the hope that it will be useful,
  14. ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. ;* GNU General Public License for more details.
  17. ;*
  18. ;* You should have received a copy of the GNU General Public License
  19. ;* along with this program; if not, write to the Free Software
  20. ;* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
  21. ;*****************************************************************************
  22. BITS 64
  23. ; FIXME: All of the 64bit asm functions that take a stride as an argument
  24. ; via register, assume that the high dword of that register is filled with 0.
  25. ; This is true in practice (since we never do any 64bit arithmetic on strides),
  26. ; but is not guaranteed by the ABI.
  27. %macro cglobal 1
  28.     %ifdef PREFIX
  29.         global _%1
  30.         %define %1 _%1
  31.     %else
  32.         global %1
  33.     %endif
  34. %ifdef WIN64
  35.     %define %1 pad %1
  36. %endif
  37. %endmacro
  38. %macro pad 1
  39.     %undef %1
  40.     %ifdef PREFIX
  41.         %define %1 _%1
  42.     %endif
  43.     %ifdef WIN64
  44.         times 6 nop
  45.         align 16
  46.         %1
  47.         .startfunc
  48.         %assign unwindcount 0
  49.         %assign framereg 0
  50.     %else
  51.         align 16
  52.         %1
  53.     %endif
  54. %endmacro
  55. %ifdef WIN64
  56. %define __PIC__
  57. %define parm1q rcx
  58. %define parm2q rdx
  59. %define parm3q r8
  60. %define parm4q r9
  61. %define parm5q [rsp+40]
  62. %define parm6q [rsp+48]
  63. %define parm7q [rsp+56]
  64. %define parm8q [rsp+64]
  65. %define parm1d ecx
  66. %define parm2d edx
  67. %define parm3d r8d
  68. %define parm4d r9d
  69. %define parm5d dword parm5q
  70. %define parm6d dword parm6q
  71. %define parm7d dword parm7q
  72. %define parm8d dword parm8q
  73. %macro firstpush 1
  74.     db 0x48
  75.     push %1
  76. %endmacro
  77. %define unwindcode(count, code) .unwind %+ count EQU code
  78. %define regcoderax 0
  79. %define regcodercx 1
  80. %define regcoderdx 2
  81. %define regcoderbx 3
  82. %define regcodersp 4
  83. %define regcoderbp 5
  84. %define regcodersi 6
  85. %define regcoderdi 7
  86. %define regcoder8 8
  87. %define regcoder9 9
  88. %define regcoder10 10
  89. %define regcoder11 11
  90. %define regcoder12 12
  91. %define regcoder13 13
  92. %define regcoder14 14
  93. %define regcoder15 15
  94. %define regcodexmm0 0
  95. %define regcodexmm1 1
  96. %define regcodexmm2 2
  97. %define regcodexmm3 3
  98. %define regcodexmm4 4
  99. %define regcodexmm5 5
  100. %define regcodexmm6 6
  101. %define regcodexmm7 7
  102. %define regcodexmm8 8
  103. %define regcodexmm9 9
  104. %define regcodexmm10 10
  105. %define regcodexmm11 11
  106. %define regcodexmm12 12
  107. %define regcodexmm13 13
  108. %define regcodexmm14 14
  109. %define regcodexmm15 15
  110. %macro allocstack 1
  111.     %if %1 < 8
  112.         %error Stack Allocation must be at least 8 bytes.
  113.     %elif %1 < 129
  114.         %assign unwindcount unwindcount+1
  115.         unwindcode(unwindcount, $-.startfunc + 0x200 + (((%1-8)/8)<<12))
  116.     %elif %1 < 524288
  117.         %assign unwindcount unwindcount+1
  118.         unwindcode(unwindcount, %1/8)
  119.         %assign unwindcount unwindcount+1
  120.         unwindcode(unwindcount, $-.startfunc + 0x100)
  121.     %else
  122.         %assign unwindcount unwindcount+1
  123.         unwindcode(unwindcount, %1>>16)
  124.         %assign unwindcount unwindcount+1
  125.         unwindcode(unwindcount, %1 & 0x0000FFFF)
  126.         %assign unwindcount unwindcount+1
  127.         unwindcode(unwindcount, $-.startfunc + 0x1100)
  128.     %endif
  129. %endmacro
  130. %macro pushreg 1
  131.     %assign unwindcount unwindcount+1
  132.     unwindcode(unwindcount, $-.startfunc + 0 + (regcode%1 << 12))
  133. %endmacro
  134. %macro setframe 2
  135.     %if ((%2 % 16) | (%2 > 240) | (%2 < 0))
  136.         %error Frame offset must be a multiple of 16 between 0 and 240.
  137.     %endif
  138.     %assign unwindcount unwindcount+1
  139.     unwindcode(unwindcount, $-.startfunc + (3 << 8 )+ (regcode%1 << 12))
  140.     %assign framereg regcode%1 + %2
  141. %endmacro
  142. %macro savereg 2
  143.     %if ((%2 % 8) | (%2 < 0))
  144.         %error Offset must be a positive multiple of 8.
  145.     %endif
  146.     %if (%2 < 64504)
  147.         %assign unwindcount unwindcount+1
  148.         unwindcode(unwindcount, %2/8)
  149.         %assign unwindcount unwindcount +1
  150.         unwindcode(unwindcount, $-.startfunc + (4 << 8) + (regcode%1 << 12))
  151.     %else
  152.         %assign unwindcount unwindcount+1
  153.         unwindcode(unwindcount, %2 >> 16)
  154.         %assign unwindcount unwindcount+1
  155.         unwindcode(unwindcount, %2 & 0x0000FFFF)
  156.         %assign unwindcount unwindcount+1
  157.         unwindcode(unwindcount, $-.startfunc + (5 << 8) + (regcode%1 << 12))
  158.     %endif
  159. %endmacro
  160. %macro savexmm128 2
  161.     %if ((%2 % 16) | (%2 < 0))
  162.         %error Offset must be a positive multiple of 16.
  163.     %endif
  164.     %if (%2 < 64512)
  165.         %assign unwindcount unwindcount+1
  166.         unwindcode(unwindcount, %2/16)
  167.         %assign unwindcount unwindcount +1
  168.         unwindcode(unwindcount, $-.startfunc + (8 << 8) + (regcode%1 << 12))
  169.     %else
  170.         %assign unwindcount unwindcount+1
  171.         unwindcode(unwindcount, %2 >> 16)
  172.         %assign unwindcount unwindcount+1
  173.         unwindcode(unwindcount, %2 & 0x0000FFFF)
  174.         %assign unwindcount unwindcount+1
  175.         unwindcode(unwindcount, $-.startfunc + (9 << 8) + (regcode%1 << 12))
  176.     %endif
  177. %endmacro
  178. %macro endprolog 0
  179. .endprolog
  180. SECTION .xdata
  181. .unwindinfo
  182.     db 0x01
  183.     db .endprolog-.startfunc
  184.     db unwindcount
  185.     db framereg
  186.     %rep unwindcount
  187.         dw .unwind %+ unwindcount
  188.         %assign unwindcount unwindcount-1
  189.     %endrep
  190. align 4,db 0
  191. SECTION .text
  192. %endmacro
  193. %macro endfunc 0
  194. .endfunc
  195. SECTION .pdata
  196.     dd .startfunc
  197.     dd .endfunc
  198.     dd .unwindinfo
  199. SECTION .text
  200. %endmacro
  201. %else ;linux
  202. %define parm1q rdi
  203. %define parm2q rsi
  204. %define parm3q rdx
  205. %define parm4q rcx
  206. %define parm5q r8
  207. %define parm6q r9
  208. %define parm7q [rsp+8]
  209. %define parm8q [rsp+16]
  210. %define parm1d edi
  211. %define parm2d esi
  212. %define parm3d edx
  213. %define parm4d ecx
  214. %define parm5d r8d
  215. %define parm6d r9d
  216. %define parm7d dword parm7q
  217. %define parm8d dword parm8q
  218. %macro allocstack 1
  219. %endmacro
  220. %macro firstpush 1
  221.     push %1
  222. %endmacro
  223. %macro pushreg 1
  224. %endmacro
  225. %macro setframe 2
  226. %endmacro
  227. %macro savereg 2
  228. %endmacro
  229. %macro savexmm128 2
  230. %endmacro
  231. %define endprolog
  232. %define endfunc
  233. %endif ;linux
  234. ; PIC support macros. On x86_64 we just use RIP-relative addressing, which is
  235. ; much simpler than the GOT handling we need to perform on x86.
  236. ;
  237. ; - GLOBAL should be used as a suffix for global addressing, eg.
  238. ;     mov eax, [foo GLOBAL]
  239. ;   instead of
  240. ;     mov eax, [foo]
  241. ;
  242. %ifdef __PIC__
  243.     %define GLOBAL wrt rip
  244. %else
  245.     %define GLOBAL
  246. %endif
  247. %assign FDEC_STRIDE 32