tor-browser

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

mathops.h (2922B)


      1 /*
      2 * simple math operations
      3 * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al
      4 *
      5 * This file is part of FFmpeg.
      6 *
      7 * FFmpeg is free software; you can redistribute it and/or
      8 * modify it under the terms of the GNU Lesser General Public
      9 * License as published by the Free Software Foundation; either
     10 * version 2.1 of the License, or (at your option) any later version.
     11 *
     12 * FFmpeg is distributed in the hope that it will be useful,
     13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
     14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     15 * Lesser General Public License for more details.
     16 *
     17 * You should have received a copy of the GNU Lesser General Public
     18 * License along with FFmpeg; if not, write to the Free Software
     19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     20 */
     21 
     22 #ifndef AVCODEC_ARM_MATHOPS_H
     23 #define AVCODEC_ARM_MATHOPS_H
     24 
     25 #include <stdint.h>
     26 #include "config.h"
     27 #include "libavutil/common.h"
     28 
     29 #if HAVE_INLINE_ASM
     30 
     31 #if HAVE_ARMV6_INLINE
     32 #define MULH MULH
     33 static inline av_const int MULH(int a, int b)
     34 {
     35    int r;
     36    __asm__ ("smmul %0, %1, %2" : "=r"(r) : "r"(a), "r"(b));
     37    return r;
     38 }
     39 
     40 #define FASTDIV FASTDIV
     41 static av_always_inline av_const int FASTDIV(int a, int b)
     42 {
     43    int r;
     44    __asm__ ("cmp     %2, #2               \n\t"
     45             "ldr     %0, [%3, %2, lsl #2] \n\t"
     46             "ite     le                   \n\t"
     47             "lsrle   %0, %1, #1           \n\t"
     48             "smmulgt %0, %0, %1           \n\t"
     49             : "=&r"(r) : "r"(a), "r"(b), "r"(ff_inverse) : "cc");
     50    return r;
     51 }
     52 
     53 #else /* HAVE_ARMV6_INLINE */
     54 
     55 #define FASTDIV FASTDIV
     56 static av_always_inline av_const int FASTDIV(int a, int b)
     57 {
     58    int r, t;
     59    __asm__ ("umull %1, %0, %2, %3"
     60             : "=&r"(r), "=&r"(t) : "r"(a), "r"(ff_inverse[b]));
     61    return r;
     62 }
     63 #endif
     64 
     65 #define MLS64(d, a, b) MAC64(d, -(a), b)
     66 
     67 #if HAVE_ARMV5TE_INLINE
     68 
     69 /* signed 16x16 -> 32 multiply add accumulate */
     70 #   define MAC16(rt, ra, rb)                                            \
     71    __asm__ ("smlabb %0, %1, %2, %0" : "+r"(rt) : "r"(ra), "r"(rb));
     72 
     73 /* signed 16x16 -> 32 multiply */
     74 #   define MUL16 MUL16
     75 static inline av_const int MUL16(int ra, int rb)
     76 {
     77    int rt;
     78    __asm__ ("smulbb %0, %1, %2" : "=r"(rt) : "r"(ra), "r"(rb));
     79    return rt;
     80 }
     81 
     82 #endif
     83 
     84 #define mid_pred mid_pred
     85 static inline av_const int mid_pred(int a, int b, int c)
     86 {
     87    int m;
     88    __asm__ (
     89        "mov   %0, %2  \n\t"
     90        "cmp   %1, %2  \n\t"
     91        "itt   gt      \n\t"
     92        "movgt %0, %1  \n\t"
     93        "movgt %1, %2  \n\t"
     94        "cmp   %1, %3  \n\t"
     95        "it    le      \n\t"
     96        "movle %1, %3  \n\t"
     97        "cmp   %0, %1  \n\t"
     98        "it    gt      \n\t"
     99        "movgt %0, %1  \n\t"
    100        : "=&r"(m), "+r"(a)
    101        : "r"(b), "r"(c)
    102        : "cc");
    103    return m;
    104 }
    105 
    106 #endif /* HAVE_INLINE_ASM */
    107 
    108 #endif /* AVCODEC_ARM_MATHOPS_H */