mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-26 19:01:44 +02:00
21c6512542
Current GCC versions know how to generate these instructions properly and avoiding inline asm gives better code. The MULH function for ARMv5 uses the same instruction and is also not needed any more. The MLS64 macro remains since negating an input would normally not be allowed as it would fail for INT_MIN. In our uses, the inputs never have this value and thus negating is safe. Signed-off-by: Mans Rullgard <mans@mansr.com>
82 lines
2.1 KiB
C
82 lines
2.1 KiB
C
/*
|
|
* simple math operations
|
|
* Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al
|
|
*
|
|
* This file is part of Libav.
|
|
*
|
|
* Libav 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.
|
|
*
|
|
* Libav 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 Libav; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef AVCODEC_ARM_MATHOPS_H
|
|
#define AVCODEC_ARM_MATHOPS_H
|
|
|
|
#include <stdint.h>
|
|
#include "config.h"
|
|
#include "libavutil/common.h"
|
|
|
|
#if HAVE_INLINE_ASM
|
|
|
|
#if HAVE_ARMV6
|
|
#define MULH MULH
|
|
static inline av_const int MULH(int a, int b)
|
|
{
|
|
int r;
|
|
__asm__ ("smmul %0, %1, %2" : "=r"(r) : "r"(a), "r"(b));
|
|
return r;
|
|
}
|
|
#endif
|
|
|
|
#define MLS64(d, a, b) MAC64(d, -(a), b)
|
|
|
|
#if HAVE_ARMV5TE
|
|
|
|
/* signed 16x16 -> 32 multiply add accumulate */
|
|
# define MAC16(rt, ra, rb) \
|
|
__asm__ ("smlabb %0, %1, %2, %0" : "+r"(rt) : "r"(ra), "r"(rb));
|
|
|
|
/* signed 16x16 -> 32 multiply */
|
|
# define MUL16 MUL16
|
|
static inline av_const int MUL16(int ra, int rb)
|
|
{
|
|
int rt;
|
|
__asm__ ("smulbb %0, %1, %2" : "=r"(rt) : "r"(ra), "r"(rb));
|
|
return rt;
|
|
}
|
|
|
|
#endif
|
|
|
|
#define mid_pred mid_pred
|
|
static inline av_const int mid_pred(int a, int b, int c)
|
|
{
|
|
int m;
|
|
__asm__ (
|
|
"mov %0, %2 \n\t"
|
|
"cmp %1, %2 \n\t"
|
|
"movgt %0, %1 \n\t"
|
|
"movgt %1, %2 \n\t"
|
|
"cmp %1, %3 \n\t"
|
|
"movle %1, %3 \n\t"
|
|
"cmp %0, %1 \n\t"
|
|
"movgt %0, %1 \n\t"
|
|
: "=&r"(m), "+r"(a)
|
|
: "r"(b), "r"(c)
|
|
: "cc");
|
|
return m;
|
|
}
|
|
|
|
#endif /* HAVE_INLINE_ASM */
|
|
|
|
#endif /* AVCODEC_ARM_MATHOPS_H */
|