libavutil/arm/asm.S
c72ab301
 /*
  * Copyright (c) 2008 Mans Rullgard <mans@mansr.com>
  *
  * This file is part of FFmpeg.
  *
  * FFmpeg is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation; either
  * version 2.1 of the License, or (at your option) any later version.
  *
  * FFmpeg is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  * Lesser General Public License for more details.
  *
  * You should have received a copy of the GNU Lesser General Public
  * License along with FFmpeg; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
172a39d1
 #include "config.h"
 
e21a8921
 #ifdef __ELF__
341f394f
 #   define ELF
 #else
 #   define ELF @
e21a8921
 #endif
341f394f
 
8986fddc
 #if CONFIG_THUMB
 #   define A @
 #   define T
 #else
 #   define A
 #   define T @
 #endif
 
8ee2b467
 #if   HAVE_NEON
         .arch           armv7-a
 #elif HAVE_ARMV6T2
         .arch           armv6t2
 #elif HAVE_ARMV6
         .arch           armv6
 #elif HAVE_ARMV5TE
         .arch           armv5te
 #endif
 
 #if   HAVE_NEON
         .fpu            neon
b3267559
 #elif HAVE_VFP
8ee2b467
         .fpu            vfp
 #endif
 
371266da
         .syntax unified
8986fddc
 T       .thumb
51a15ed7
 ELF     .eabi_attribute 25, 1           @ Tag_ABI_align_preserved
543156d7
 ELF     .section .note.GNU-stack,"",%progbits @ Mark stack as non-executable
c72ab301
 
5dae4872
 .macro  function name, export=0, align=2
62634158
         .set            .Lpic_idx, 0
         .set            .Lpic_gp, 0
480cb7ed
     .macro endfunc
62634158
       .if .Lpic_idx
cdb7db5a
         .align          2
62634158
         .altmacro
         put_pic         %(.Lpic_idx - 1)
         .noaltmacro
       .endif
18c31f6f
 ELF     .size   \name, . - \name
a7e7d40c
         .endfunc
         .purgem endfunc
480cb7ed
     .endm
278caa6a
         .text
5dae4872
         .align          \align
480cb7ed
     .if \export
e654b7c2
         .global EXTERN_ASM\name
e3fec3f0
 ELF     .type   EXTERN_ASM\name, %function
         .func   EXTERN_ASM\name
e654b7c2
 EXTERN_ASM\name:
e3fec3f0
     .else
341f394f
 ELF     .type   \name, %function
c72ab301
         .func   \name
 \name:
e3fec3f0
     .endif
480cb7ed
 .endm
172a39d1
 
01b75fa9
 .macro  const   name, align=2
     .macro endconst
 ELF     .size   \name, . - \name
         .purgem endconst
     .endm
         .section        .rodata
         .align          \align
 \name:
 .endm
 
a7831d50
 #if !HAVE_ARMV6T2_EXTERNAL
dac78fd1
 .macro  movw    rd, val
         mov     \rd, \val &  255
         orr     \rd, \val & ~255
 .endm
 #endif
 
a4edc5a9
 .macro  mov32   rd, val
a7831d50
 #if HAVE_ARMV6T2_EXTERNAL
a4edc5a9
         movw            \rd, #(\val) & 0xffff
     .if (\val) >> 16
         movt            \rd, #(\val) >> 16
     .endif
 #else
         ldr             \rd, =\val
 #endif
 .endm
 
62634158
 .macro  put_pic         num
         put_pic_\num
 .endm
 
 .macro  do_def_pic      num, val, label
     .macro put_pic_\num
       .if \num
         .altmacro
         put_pic         %(\num - 1)
         .noaltmacro
       .endif
 \label: .word           \val
         .purgem         put_pic_\num
     .endm
 .endm
 
 .macro  def_pic         val, label
         .altmacro
         do_def_pic      %.Lpic_idx, \val, \label
         .noaltmacro
         .set            .Lpic_idx, .Lpic_idx + 1
 .endm
 
 .macro  ldpic           rd,  val, indir=0
         ldr             \rd, .Lpicoff\@
 .Lpic\@:
     .if \indir
7bda4ed7
 A       ldr             \rd, [pc, \rd]
 T       add             \rd, pc
 T       ldr             \rd, [\rd]
62634158
     .else
8995d349
         add             \rd, pc
62634158
     .endif
         def_pic         \val - (.Lpic\@ + (8 >> CONFIG_THUMB)), .Lpicoff\@
 .endm
 
480cb7ed
 .macro  movrel rd, val
62634158
 #if CONFIG_PIC
         ldpic           \rd, \val
a7831d50
 #elif HAVE_ARMV6T2_EXTERNAL && !defined(__APPLE__)
172a39d1
         movw            \rd, #:lower16:\val
         movt            \rd, #:upper16:\val
 #else
         ldr             \rd, =\val
 #endif
480cb7ed
 .endm
ce742de2
 
62634158
 .macro  movrelx         rd,  val, gp
 #if CONFIG_PIC && defined(__ELF__)
     .ifnb \gp
       .if .Lpic_gp
         .unreq          gp
       .endif
         gp      .req    \gp
         ldpic           gp,  _GLOBAL_OFFSET_TABLE_
     .elseif !.Lpic_gp
         gp      .req    r12
         ldpic           gp,  _GLOBAL_OFFSET_TABLE_
     .endif
         .set            .Lpic_gp, 1
         ldr             \rd, .Lpicoff\@
         ldr             \rd, [gp, \rd]
         def_pic         \val(GOT), .Lpicoff\@
 #elif CONFIG_PIC && defined(__APPLE__)
         ldpic           \rd, .Lpic\@, indir=1
         .non_lazy_symbol_pointer
 .Lpic\@:
         .indirect_symbol \val
         .word           0
         .text
 #else
         movrel          \rd, \val
 #endif
 .endm
 
7689eea4
 .macro  add_sh          rd,  rn,  rm,  sh:vararg
 A       add             \rd, \rn, \rm, \sh
 T       mov             \rm, \rm, \sh
 T       add             \rd, \rn, \rm
 .endm
 
8986fddc
 .macro  ldr_pre         rt,  rn,  rm:vararg
 A       ldr             \rt, [\rn, \rm]!
 T       add             \rn, \rn, \rm
 T       ldr             \rt, [\rn]
 .endm
 
71ce7602
 .macro  ldr_dpre        rt,  rn,  rm:vararg
 A       ldr             \rt, [\rn, -\rm]!
 T       sub             \rn, \rn, \rm
 T       ldr             \rt, [\rn]
a5dfeb61
 .endm
 
dac78fd1
 .macro  ldr_nreg        rt,  rn,  rm:vararg
62b5197f
 A       ldr             \rt, [\rn, -\rm]
 T       sub             \rt, \rn, \rm
 T       ldr             \rt, [\rt]
 .endm
 
8986fddc
 .macro  ldr_post        rt,  rn,  rm:vararg
 A       ldr             \rt, [\rn], \rm
 T       ldr             \rt, [\rn]
 T       add             \rn, \rn, \rm
 .endm
 
a1ab3300
 .macro  ldrc_pre        cc,  rt,  rn,  rm:vararg
 A       ldr\cc          \rt, [\rn, \rm]!
 T       itt             \cc
 T       add\cc          \rn, \rn, \rm
 T       ldr\cc          \rt, [\rn]
 .endm
 
8986fddc
 .macro  ldrd_reg        rt,  rt2, rn,  rm
 A       ldrd            \rt, \rt2, [\rn, \rm]
 T       add             \rt, \rn, \rm
 T       ldrd            \rt, \rt2, [\rt]
 .endm
 
 .macro  ldrd_post       rt,  rt2, rn,  rm
 A       ldrd            \rt, \rt2, [\rn], \rm
 T       ldrd            \rt, \rt2, [\rn]
 T       add             \rn, \rn, \rm
 .endm
 
 .macro  ldrh_pre        rt,  rn,  rm
 A       ldrh            \rt, [\rn, \rm]!
 T       add             \rn, \rn, \rm
 T       ldrh            \rt, [\rn]
 .endm
 
 .macro  ldrh_dpre       rt,  rn,  rm
 A       ldrh            \rt, [\rn, -\rm]!
 T       sub             \rn, \rn, \rm
 T       ldrh            \rt, [\rn]
 .endm
 
 .macro  ldrh_post       rt,  rn,  rm
 A       ldrh            \rt, [\rn], \rm
 T       ldrh            \rt, [\rn]
 T       add             \rn, \rn, \rm
 .endm
 
a5dfeb61
 .macro  ldrb_post       rt,  rn,  rm
 A       ldrb            \rt, [\rn], \rm
 T       ldrb            \rt, [\rn]
 T       add             \rn, \rn, \rm
 .endm
 
8986fddc
 .macro  str_post       rt,  rn,  rm:vararg
 A       str             \rt, [\rn], \rm
 T       str             \rt, [\rn]
 T       add             \rn, \rn, \rm
 .endm
 
 .macro  strb_post       rt,  rn,  rm:vararg
 A       strb            \rt, [\rn], \rm
 T       strb            \rt, [\rn]
 T       add             \rn, \rn, \rm
 .endm
 
 .macro  strd_post       rt,  rt2, rn,  rm
 A       strd            \rt, \rt2, [\rn], \rm
 T       strd            \rt, \rt2, [\rn]
 T       add             \rn, \rn, \rm
 .endm
 
 .macro  strh_pre        rt,  rn,  rm
 A       strh            \rt, [\rn, \rm]!
 T       add             \rn, \rn, \rm
 T       strh            \rt, [\rn]
 .endm
 
 .macro  strh_dpre       rt,  rn,  rm
 A       strh            \rt, [\rn, -\rm]!
 T       sub             \rn, \rn, \rm
 T       strh            \rt, [\rn]
 .endm
 
 .macro  strh_post       rt,  rn,  rm
 A       strh            \rt, [\rn], \rm
 T       strh            \rt, [\rn]
 T       add             \rn, \rn, \rm
 .endm
 
 .macro  strh_dpost       rt,  rn,  rm
 A       strh            \rt, [\rn], -\rm
 T       strh            \rt, [\rn]
 T       sub             \rn, \rn, \rm
 .endm
 
ce742de2
 #if HAVE_VFP_ARGS
be7952b5
 ELF     .eabi_attribute 28, 1
ce742de2
 #   define VFP
 #   define NOVFP @
 #else
 #   define VFP   @
 #   define NOVFP
 #endif
e654b7c2
 
 #define GLUE(a, b) a ## b
 #define JOIN(a, b) GLUE(a, b)
 #define X(s) JOIN(EXTERN_ASM, s)