Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

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