You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

366 lines
8.8KB

  1. /*
  2. * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
  3. *
  4. * This file is part of Libav.
  5. *
  6. * Libav is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * Libav 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 GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with Libav; if not, write to the Free Software
  18. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19. */
  20. #include "config.h"
  21. #ifdef __ELF__
  22. # define ELF
  23. #else
  24. # define ELF @
  25. #endif
  26. #if CONFIG_THUMB
  27. # define A @
  28. # define T
  29. #else
  30. # define A
  31. # define T @
  32. #endif
  33. #if HAVE_AS_FUNC
  34. # define FUNC
  35. #else
  36. # define FUNC @
  37. #endif
  38. #if HAVE_AS_FPU_DIRECTIVE
  39. # define FPU
  40. #else
  41. # define FPU @
  42. #endif
  43. #if CONFIG_THUMB && defined(__APPLE__)
  44. # define TFUNC
  45. #else
  46. # define TFUNC @
  47. #endif
  48. #if HAVE_AS_ARCH_DIRECTIVE
  49. #if HAVE_NEON
  50. .arch armv7-a
  51. #elif HAVE_ARMV6T2
  52. .arch armv6t2
  53. #elif HAVE_ARMV6
  54. .arch armv6
  55. #elif HAVE_ARMV5TE
  56. .arch armv5te
  57. #endif
  58. #endif
  59. #if HAVE_AS_OBJECT_ARCH
  60. ELF .object_arch armv4
  61. #endif
  62. #if HAVE_NEON
  63. FPU .fpu neon
  64. ELF .eabi_attribute 10, 0 @ suppress Tag_FP_arch
  65. ELF .eabi_attribute 12, 0 @ suppress Tag_Advanced_SIMD_arch
  66. #elif HAVE_VFP
  67. FPU .fpu vfp
  68. ELF .eabi_attribute 10, 0 @ suppress Tag_FP_arch
  69. #endif
  70. .syntax unified
  71. T .thumb
  72. ELF .eabi_attribute 25, 1 @ Tag_ABI_align_preserved
  73. ELF .section .note.GNU-stack,"",%progbits @ Mark stack as non-executable
  74. .macro function name, export=0, align=2
  75. .set .Lpic_idx, 0
  76. .set .Lpic_gp, 0
  77. .macro endfunc
  78. .if .Lpic_idx
  79. .align 2
  80. .altmacro
  81. put_pic %(.Lpic_idx - 1)
  82. .noaltmacro
  83. .endif
  84. .if .Lpic_gp
  85. .unreq gp
  86. .endif
  87. ELF .size \name, . - \name
  88. FUNC .endfunc
  89. .purgem endfunc
  90. .endm
  91. .text
  92. .align \align
  93. .if \export
  94. .global EXTERN_ASM\name
  95. ELF .type EXTERN_ASM\name, %function
  96. FUNC .func EXTERN_ASM\name
  97. TFUNC .thumb_func EXTERN_ASM\name
  98. EXTERN_ASM\name:
  99. .else
  100. ELF .type \name, %function
  101. FUNC .func \name
  102. TFUNC .thumb_func \name
  103. \name:
  104. .endif
  105. .endm
  106. .macro const name, align=2, relocate=0
  107. .macro endconst
  108. ELF .size \name, . - \name
  109. .purgem endconst
  110. .endm
  111. #if HAVE_SECTION_DATA_REL_RO
  112. .if \relocate
  113. .section .data.rel.ro
  114. .else
  115. .section .rodata
  116. .endif
  117. #elif !defined(__MACH__)
  118. .section .rodata
  119. #else
  120. .const_data
  121. #endif
  122. .align \align
  123. \name:
  124. .endm
  125. #if !HAVE_ARMV6T2_EXTERNAL
  126. .macro movw rd, val
  127. mov \rd, \val & 255
  128. orr \rd, \val & ~255
  129. .endm
  130. #endif
  131. .macro mov32 rd, val
  132. #if HAVE_ARMV6T2_EXTERNAL
  133. movw \rd, #(\val) & 0xffff
  134. .if (\val) >> 16
  135. movt \rd, #(\val) >> 16
  136. .endif
  137. #else
  138. ldr \rd, =\val
  139. #endif
  140. .endm
  141. .macro put_pic num
  142. put_pic_\num
  143. .endm
  144. .macro do_def_pic num, val, label
  145. .macro put_pic_\num
  146. .if \num
  147. .altmacro
  148. put_pic %(\num - 1)
  149. .noaltmacro
  150. .endif
  151. \label: .word \val
  152. .purgem put_pic_\num
  153. .endm
  154. .endm
  155. .macro def_pic val, label
  156. .altmacro
  157. do_def_pic %.Lpic_idx, \val, \label
  158. .noaltmacro
  159. .set .Lpic_idx, .Lpic_idx + 1
  160. .endm
  161. .macro ldpic rd, val, indir=0
  162. ldr \rd, .Lpicoff\@
  163. .Lpic\@:
  164. .if \indir
  165. A ldr \rd, [pc, \rd]
  166. T add \rd, pc
  167. T ldr \rd, [\rd]
  168. .else
  169. add \rd, pc
  170. .endif
  171. def_pic \val - (.Lpic\@ + (8 >> CONFIG_THUMB)), .Lpicoff\@
  172. .endm
  173. .macro movrel rd, val
  174. #if CONFIG_PIC
  175. ldpic \rd, \val
  176. #elif HAVE_ARMV6T2_EXTERNAL && !defined(__APPLE__)
  177. movw \rd, #:lower16:\val
  178. movt \rd, #:upper16:\val
  179. #else
  180. ldr \rd, =\val
  181. #endif
  182. .endm
  183. .macro movrelx rd, val, gp
  184. .ifc \rd,\gp
  185. .error "movrelx needs two distinct registers"
  186. .endif
  187. .ifc \rd\()_\gp,r12_
  188. .warning "movrelx rd=\rd without explicit set gp"
  189. .endif
  190. .ifc \rd\()_\gp,ip_
  191. .warning "movrelx rd=\rd without explicit set gp"
  192. .endif
  193. #if CONFIG_PIC && defined(__ELF__)
  194. .ifnb \gp
  195. .if .Lpic_gp
  196. .unreq gp
  197. .endif
  198. gp .req \gp
  199. ldpic gp, _GLOBAL_OFFSET_TABLE_
  200. .elseif !.Lpic_gp
  201. gp .req r12
  202. ldpic gp, _GLOBAL_OFFSET_TABLE_
  203. .endif
  204. .set .Lpic_gp, 1
  205. ldr \rd, .Lpicoff\@
  206. ldr \rd, [gp, \rd]
  207. def_pic \val(GOT), .Lpicoff\@
  208. #elif CONFIG_PIC && defined(__APPLE__)
  209. ldpic \rd, .Lpic\@, indir=1
  210. .non_lazy_symbol_pointer
  211. .Lpic\@:
  212. .indirect_symbol \val
  213. .word 0
  214. .text
  215. #else
  216. movrel \rd, \val
  217. #endif
  218. .endm
  219. .macro add_sh rd, rn, rm, sh:vararg
  220. A add \rd, \rn, \rm, \sh
  221. T mov \rm, \rm, \sh
  222. T add \rd, \rn, \rm
  223. .endm
  224. .macro ldr_pre rt, rn, rm:vararg
  225. A ldr \rt, [\rn, \rm]!
  226. T add \rn, \rn, \rm
  227. T ldr \rt, [\rn]
  228. .endm
  229. .macro ldr_dpre rt, rn, rm:vararg
  230. A ldr \rt, [\rn, -\rm]!
  231. T sub \rn, \rn, \rm
  232. T ldr \rt, [\rn]
  233. .endm
  234. .macro ldr_nreg rt, rn, rm:vararg
  235. A ldr \rt, [\rn, -\rm]
  236. T sub \rt, \rn, \rm
  237. T ldr \rt, [\rt]
  238. .endm
  239. .macro ldr_post rt, rn, rm:vararg
  240. A ldr \rt, [\rn], \rm
  241. T ldr \rt, [\rn]
  242. T add \rn, \rn, \rm
  243. .endm
  244. .macro ldrc_pre cc, rt, rn, rm:vararg
  245. A ldr\cc \rt, [\rn, \rm]!
  246. T itt \cc
  247. T add\cc \rn, \rn, \rm
  248. T ldr\cc \rt, [\rn]
  249. .endm
  250. .macro ldrd_reg rt, rt2, rn, rm
  251. A ldrd \rt, \rt2, [\rn, \rm]
  252. T add \rt, \rn, \rm
  253. T ldrd \rt, \rt2, [\rt]
  254. .endm
  255. .macro ldrd_post rt, rt2, rn, rm
  256. A ldrd \rt, \rt2, [\rn], \rm
  257. T ldrd \rt, \rt2, [\rn]
  258. T add \rn, \rn, \rm
  259. .endm
  260. .macro ldrh_pre rt, rn, rm
  261. A ldrh \rt, [\rn, \rm]!
  262. T add \rn, \rn, \rm
  263. T ldrh \rt, [\rn]
  264. .endm
  265. .macro ldrh_dpre rt, rn, rm
  266. A ldrh \rt, [\rn, -\rm]!
  267. T sub \rn, \rn, \rm
  268. T ldrh \rt, [\rn]
  269. .endm
  270. .macro ldrh_post rt, rn, rm
  271. A ldrh \rt, [\rn], \rm
  272. T ldrh \rt, [\rn]
  273. T add \rn, \rn, \rm
  274. .endm
  275. .macro ldrb_post rt, rn, rm
  276. A ldrb \rt, [\rn], \rm
  277. T ldrb \rt, [\rn]
  278. T add \rn, \rn, \rm
  279. .endm
  280. .macro str_post rt, rn, rm:vararg
  281. A str \rt, [\rn], \rm
  282. T str \rt, [\rn]
  283. T add \rn, \rn, \rm
  284. .endm
  285. .macro strb_post rt, rn, rm:vararg
  286. A strb \rt, [\rn], \rm
  287. T strb \rt, [\rn]
  288. T add \rn, \rn, \rm
  289. .endm
  290. .macro strd_post rt, rt2, rn, rm
  291. A strd \rt, \rt2, [\rn], \rm
  292. T strd \rt, \rt2, [\rn]
  293. T add \rn, \rn, \rm
  294. .endm
  295. .macro strh_pre rt, rn, rm
  296. A strh \rt, [\rn, \rm]!
  297. T add \rn, \rn, \rm
  298. T strh \rt, [\rn]
  299. .endm
  300. .macro strh_dpre rt, rn, rm
  301. A strh \rt, [\rn, -\rm]!
  302. T sub \rn, \rn, \rm
  303. T strh \rt, [\rn]
  304. .endm
  305. .macro strh_post rt, rn, rm
  306. A strh \rt, [\rn], \rm
  307. T strh \rt, [\rn]
  308. T add \rn, \rn, \rm
  309. .endm
  310. .macro strh_dpost rt, rn, rm
  311. A strh \rt, [\rn], -\rm
  312. T strh \rt, [\rn]
  313. T sub \rn, \rn, \rm
  314. .endm
  315. #if HAVE_VFP_ARGS
  316. ELF .eabi_attribute 28, 1
  317. # define VFP
  318. # define NOVFP @
  319. #else
  320. # define VFP @
  321. # define NOVFP
  322. #endif
  323. #define GLUE(a, b) a ## b
  324. #define JOIN(a, b) GLUE(a, b)
  325. #define X(s) JOIN(EXTERN_ASM, s)