tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

asm.S (9038B)


      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_AS_FPU_DIRECTIVE
     44 #   define FPU
     45 #else
     46 #   define FPU @
     47 #endif
     48 
     49 #if CONFIG_THUMB && defined(__APPLE__)
     50 #   define TFUNC
     51 #else
     52 #   define TFUNC @
     53 #endif
     54 
     55 #if HAVE_AS_ARCH_DIRECTIVE
     56 #if   HAVE_NEON
     57        .arch           armv7-a
     58 #elif HAVE_ARMV6T2
     59        .arch           armv6t2
     60 #elif HAVE_ARMV6
     61        .arch           armv6
     62 #elif HAVE_ARMV5TE
     63        .arch           armv5te
     64 #endif
     65 #endif
     66 #if   HAVE_AS_OBJECT_ARCH
     67 ELF     .object_arch    armv4
     68 #endif
     69 
     70 #if   HAVE_NEON
     71 FPU     .fpu            neon
     72 ELF     .eabi_attribute 10, 0           @ suppress Tag_FP_arch
     73 ELF     .eabi_attribute 12, 0           @ suppress Tag_Advanced_SIMD_arch
     74 #elif HAVE_VFP
     75 FPU     .fpu            vfp
     76 ELF     .eabi_attribute 10, 0           @ suppress Tag_FP_arch
     77 #endif
     78 
     79        .syntax unified
     80 T       .thumb
     81 ELF     .eabi_attribute 25, 1           @ Tag_ABI_align_preserved
     82 ELF     .section .note.GNU-stack,"",%progbits @ Mark stack as non-executable
     83 
     84 .macro  function name, export=0, align=2
     85        .set            .Lpic_idx, 0
     86        .set            .Lpic_gp, 0
     87    .macro endfunc
     88      .if .Lpic_idx
     89        .align          2
     90        .altmacro
     91        put_pic         %(.Lpic_idx - 1)
     92        .noaltmacro
     93      .endif
     94      .if .Lpic_gp
     95        .unreq          gp
     96      .endif
     97 ELF     .size   \name, . - \name
     98 FUNC    .endfunc
     99        .purgem endfunc
    100    .endm
    101        .text
    102        .align          \align
    103    .if \export
    104        .global EXTERN_ASM\name
    105 ELF     .type   EXTERN_ASM\name, %function
    106 FUNC    .func   EXTERN_ASM\name
    107 TFUNC   .thumb_func EXTERN_ASM\name
    108 EXTERN_ASM\name:
    109    .else
    110 ELF     .type   \name, %function
    111 FUNC    .func   \name
    112 TFUNC   .thumb_func \name
    113 \name:
    114    .endif
    115 .endm
    116 
    117 .macro  const   name, align=2, relocate=0
    118    .macro endconst
    119 ELF     .size   \name, . - \name
    120        .purgem endconst
    121    .endm
    122 #if HAVE_SECTION_DATA_REL_RO
    123 .if \relocate
    124        .section        .data.rel.ro
    125 .else
    126        .section        .rodata
    127 .endif
    128 #elif defined(_WIN32)
    129        .section        .rdata
    130 #elif !defined(__MACH__)
    131        .section        .rodata
    132 #else
    133        .const_data
    134 #endif
    135        .align          \align
    136 \name:
    137 .endm
    138 
    139 #if !HAVE_ARMV6T2_EXTERNAL
    140 .macro  movw    rd, val
    141        mov     \rd, \val &  255
    142        orr     \rd, \val & ~255
    143 .endm
    144 #endif
    145 
    146 .macro  mov32   rd, val
    147 #if HAVE_ARMV6T2_EXTERNAL
    148        movw            \rd, #(\val) & 0xffff
    149    .if (\val) >> 16
    150        movt            \rd, #(\val) >> 16
    151    .endif
    152 #else
    153        ldr             \rd, =\val
    154 #endif
    155 .endm
    156 
    157 .macro  put_pic         num
    158        put_pic_\num
    159 .endm
    160 
    161 .macro  do_def_pic      num, val, label
    162    .macro put_pic_\num
    163      .if \num
    164        .altmacro
    165        put_pic         %(\num - 1)
    166        .noaltmacro
    167      .endif
    168 \label: .word           \val
    169        .purgem         put_pic_\num
    170    .endm
    171 .endm
    172 
    173 .macro  def_pic         val, label
    174        .altmacro
    175        do_def_pic      %.Lpic_idx, \val, \label
    176        .noaltmacro
    177        .set            .Lpic_idx, .Lpic_idx + 1
    178 .endm
    179 
    180 .macro  ldpic           rd,  val, indir=0
    181        ldr             \rd, .Lpicoff\@
    182 .Lpic\@:
    183    .if \indir
    184 A       ldr             \rd, [pc, \rd]
    185 T       add             \rd, pc
    186 T       ldr             \rd, [\rd]
    187    .else
    188        add             \rd, pc
    189    .endif
    190        def_pic         \val - (.Lpic\@ + (8 >> CONFIG_THUMB)), .Lpicoff\@
    191 .endm
    192 
    193 .macro  movrel rd, val
    194 #if CONFIG_PIC
    195        ldpic           \rd, \val
    196 #elif HAVE_ARMV6T2_EXTERNAL && !defined(__APPLE__)
    197        movw            \rd, #:lower16:\val
    198        movt            \rd, #:upper16:\val
    199 #else
    200        ldr             \rd, =\val
    201 #endif
    202 .endm
    203 
    204 .macro  movrelx         rd,  val, gp
    205    .ifc \rd,\gp
    206        .error      "movrelx needs two distinct registers"
    207    .endif
    208    .ifc \rd\()_\gp,r12_
    209        .warning    "movrelx rd=\rd without explicit set gp"
    210    .endif
    211    .ifc \rd\()_\gp,ip_
    212        .warning    "movrelx rd=\rd without explicit set gp"
    213    .endif
    214 #if CONFIG_PIC && defined(__ELF__)
    215    .ifnb \gp
    216      .if .Lpic_gp
    217        .unreq          gp
    218      .endif
    219        gp      .req    \gp
    220        ldpic           gp,  _GLOBAL_OFFSET_TABLE_
    221    .elseif !.Lpic_gp
    222        gp      .req    r12
    223        ldpic           gp,  _GLOBAL_OFFSET_TABLE_
    224    .endif
    225        .set            .Lpic_gp, 1
    226        ldr             \rd, .Lpicoff\@
    227        ldr             \rd, [gp, \rd]
    228        def_pic         \val(GOT), .Lpicoff\@
    229 #elif CONFIG_PIC && defined(__APPLE__)
    230        ldpic           \rd, .Lpic\@, indir=1
    231        .non_lazy_symbol_pointer
    232 .Lpic\@:
    233        .indirect_symbol \val
    234        .word           0
    235        .text
    236 #else
    237        movrel          \rd, \val
    238 #endif
    239 .endm
    240 
    241 .macro  add_sh          rd,  rn,  rm,  sh:vararg
    242 A       add             \rd, \rn, \rm, \sh
    243 T       mov             \rm, \rm, \sh
    244 T       add             \rd, \rn, \rm
    245 .endm
    246 
    247 .macro  ldr_pre         rt,  rn,  rm:vararg
    248 A       ldr             \rt, [\rn, \rm]!
    249 T       add             \rn, \rn, \rm
    250 T       ldr             \rt, [\rn]
    251 .endm
    252 
    253 .macro  ldr_dpre        rt,  rn,  rm:vararg
    254 A       ldr             \rt, [\rn, -\rm]!
    255 T       sub             \rn, \rn, \rm
    256 T       ldr             \rt, [\rn]
    257 .endm
    258 
    259 .macro  ldr_nreg        rt,  rn,  rm:vararg
    260 A       ldr             \rt, [\rn, -\rm]
    261 T       sub             \rt, \rn, \rm
    262 T       ldr             \rt, [\rt]
    263 .endm
    264 
    265 .macro  ldr_post        rt,  rn,  rm:vararg
    266 A       ldr             \rt, [\rn], \rm
    267 T       ldr             \rt, [\rn]
    268 T       add             \rn, \rn, \rm
    269 .endm
    270 
    271 .macro  ldrc_pre        cc,  rt,  rn,  rm:vararg
    272 A       ldr\cc          \rt, [\rn, \rm]!
    273 T       itt             \cc
    274 T       add\cc          \rn, \rn, \rm
    275 T       ldr\cc          \rt, [\rn]
    276 .endm
    277 
    278 .macro  ldrd_reg        rt,  rt2, rn,  rm
    279 A       ldrd            \rt, \rt2, [\rn, \rm]
    280 T       add             \rt, \rn, \rm
    281 T       ldrd            \rt, \rt2, [\rt]
    282 .endm
    283 
    284 .macro  ldrd_post       rt,  rt2, rn,  rm
    285 A       ldrd            \rt, \rt2, [\rn], \rm
    286 T       ldrd            \rt, \rt2, [\rn]
    287 T       add             \rn, \rn, \rm
    288 .endm
    289 
    290 .macro  ldrh_pre        rt,  rn,  rm
    291 A       ldrh            \rt, [\rn, \rm]!
    292 T       add             \rn, \rn, \rm
    293 T       ldrh            \rt, [\rn]
    294 .endm
    295 
    296 .macro  ldrh_dpre       rt,  rn,  rm
    297 A       ldrh            \rt, [\rn, -\rm]!
    298 T       sub             \rn, \rn, \rm
    299 T       ldrh            \rt, [\rn]
    300 .endm
    301 
    302 .macro  ldrh_post       rt,  rn,  rm
    303 A       ldrh            \rt, [\rn], \rm
    304 T       ldrh            \rt, [\rn]
    305 T       add             \rn, \rn, \rm
    306 .endm
    307 
    308 .macro  ldrb_post       rt,  rn,  rm
    309 A       ldrb            \rt, [\rn], \rm
    310 T       ldrb            \rt, [\rn]
    311 T       add             \rn, \rn, \rm
    312 .endm
    313 
    314 .macro  str_post       rt,  rn,  rm:vararg
    315 A       str             \rt, [\rn], \rm
    316 T       str             \rt, [\rn]
    317 T       add             \rn, \rn, \rm
    318 .endm
    319 
    320 .macro  strb_post       rt,  rn,  rm:vararg
    321 A       strb            \rt, [\rn], \rm
    322 T       strb            \rt, [\rn]
    323 T       add             \rn, \rn, \rm
    324 .endm
    325 
    326 .macro  strd_post       rt,  rt2, rn,  rm
    327 A       strd            \rt, \rt2, [\rn], \rm
    328 T       strd            \rt, \rt2, [\rn]
    329 T       add             \rn, \rn, \rm
    330 .endm
    331 
    332 .macro  strh_pre        rt,  rn,  rm
    333 A       strh            \rt, [\rn, \rm]!
    334 T       add             \rn, \rn, \rm
    335 T       strh            \rt, [\rn]
    336 .endm
    337 
    338 .macro  strh_dpre       rt,  rn,  rm
    339 A       strh            \rt, [\rn, -\rm]!
    340 T       sub             \rn, \rn, \rm
    341 T       strh            \rt, [\rn]
    342 .endm
    343 
    344 .macro  strh_post       rt,  rn,  rm
    345 A       strh            \rt, [\rn], \rm
    346 T       strh            \rt, [\rn]
    347 T       add             \rn, \rn, \rm
    348 .endm
    349 
    350 .macro  strh_dpost       rt,  rn,  rm
    351 A       strh            \rt, [\rn], -\rm
    352 T       strh            \rt, [\rn]
    353 T       sub             \rn, \rn, \rm
    354 .endm
    355 
    356 #if HAVE_VFP_ARGS
    357 ELF     .eabi_attribute 28, 1
    358 #   define VFP
    359 #   define NOVFP @
    360 #else
    361 #   define VFP   @
    362 #   define NOVFP
    363 #endif
    364 
    365 #define GLUE(a, b) a ## b
    366 #define JOIN(a, b) GLUE(a, b)
    367 #define X(s) JOIN(EXTERN_ASM, s)