tor-browser

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

intmath.h (3884B)


      1 /*
      2 * Copyright (c) 2010 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 #ifndef AVUTIL_ARM_INTMATH_H
     22 #define AVUTIL_ARM_INTMATH_H
     23 
     24 #include <stdint.h>
     25 
     26 #include "config.h"
     27 #include "libavutil/attributes.h"
     28 
     29 #if HAVE_INLINE_ASM
     30 
     31 #if HAVE_ARMV6_INLINE
     32 
     33 #define av_clip_uint8 av_clip_uint8_arm
     34 static av_always_inline av_const int av_clip_uint8_arm(int a)
     35 {
     36    int x;
     37    __asm__ ("usat %0, #8,  %1" : "=r"(x) : "r"(a));
     38    return x;
     39 }
     40 
     41 #define av_clip_int8 av_clip_int8_arm
     42 static av_always_inline av_const int av_clip_int8_arm(int a)
     43 {
     44    int x;
     45    __asm__ ("ssat %0, #8,  %1" : "=r"(x) : "r"(a));
     46    return x;
     47 }
     48 
     49 #define av_clip_uint16 av_clip_uint16_arm
     50 static av_always_inline av_const int av_clip_uint16_arm(int a)
     51 {
     52    int x;
     53    __asm__ ("usat %0, #16, %1" : "=r"(x) : "r"(a));
     54    return x;
     55 }
     56 
     57 #define av_clip_int16 av_clip_int16_arm
     58 static av_always_inline av_const int av_clip_int16_arm(int a)
     59 {
     60    int x;
     61    __asm__ ("ssat %0, #16, %1" : "=r"(x) : "r"(a));
     62    return x;
     63 }
     64 
     65 #define av_clip_intp2 av_clip_intp2_arm
     66 static av_always_inline av_const int av_clip_intp2_arm(int a, int p)
     67 {
     68    if (av_builtin_constant_p(p)) {
     69        unsigned x;
     70        __asm__ ("ssat %0, %2, %1" : "=r"(x) : "r"(a), "i"(p+1));
     71        return x;
     72    } else {
     73        if (((unsigned)a + (1 << p)) & ~((2 << p) - 1))
     74            return (a >> 31) ^ ((1 << p) - 1);
     75        else
     76            return a;
     77    }
     78 }
     79 
     80 #define av_clip_uintp2 av_clip_uintp2_arm
     81 static av_always_inline av_const unsigned av_clip_uintp2_arm(int a, int p)
     82 {
     83    if (av_builtin_constant_p(p)) {
     84        unsigned x;
     85        __asm__ ("usat %0, %2, %1" : "=r"(x) : "r"(a), "i"(p));
     86        return x;
     87    } else {
     88        if (a & ~((1<<p) - 1)) return (~a) >> 31 & ((1<<p) - 1);
     89        else                   return  a;
     90    }
     91 }
     92 
     93 #define av_sat_add32 av_sat_add32_arm
     94 static av_always_inline int av_sat_add32_arm(int a, int b)
     95 {
     96    int r;
     97    __asm__ ("qadd %0, %1, %2" : "=r"(r) : "r"(a), "r"(b));
     98    return r;
     99 }
    100 
    101 #define av_sat_dadd32 av_sat_dadd32_arm
    102 static av_always_inline int av_sat_dadd32_arm(int a, int b)
    103 {
    104    int r;
    105    __asm__ ("qdadd %0, %1, %2" : "=r"(r) : "r"(a), "r"(b));
    106    return r;
    107 }
    108 
    109 #define av_sat_sub32 av_sat_sub32_arm
    110 static av_always_inline int av_sat_sub32_arm(int a, int b)
    111 {
    112    int r;
    113    __asm__ ("qsub %0, %1, %2" : "=r"(r) : "r"(a), "r"(b));
    114    return r;
    115 }
    116 
    117 #define av_sat_dsub32 av_sat_dsub32_arm
    118 static av_always_inline int av_sat_dsub32_arm(int a, int b)
    119 {
    120    int r;
    121    __asm__ ("qdsub %0, %1, %2" : "=r"(r) : "r"(a), "r"(b));
    122    return r;
    123 }
    124 
    125 #endif /* HAVE_ARMV6_INLINE */
    126 
    127 #if HAVE_ASM_MOD_Q
    128 
    129 #define av_clipl_int32 av_clipl_int32_arm
    130 static av_always_inline av_const int32_t av_clipl_int32_arm(int64_t a)
    131 {
    132    int x, y;
    133    __asm__ ("adds   %1, %R2, %Q2, lsr #31  \n\t"
    134             "itet   ne                     \n\t"
    135             "mvnne  %1, #1<<31             \n\t"
    136             "moveq  %0, %Q2                \n\t"
    137             "eorne  %0, %1,  %R2, asr #31  \n\t"
    138             : "=r"(x), "=&r"(y) : "r"(a) : "cc");
    139    return x;
    140 }
    141 
    142 #endif /* HAVE_ASM_MOD_Q */
    143 
    144 #endif /* HAVE_INLINE_ASM */
    145 
    146 #endif /* AVUTIL_ARM_INTMATH_H */