1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * simple math operations 3cabdff1aSopenharmony_ci * Copyright (c) 2001, 2002 Fabrice Bellard 4cabdff1aSopenharmony_ci * Copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> et al 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * This file is part of FFmpeg. 7cabdff1aSopenharmony_ci * 8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16cabdff1aSopenharmony_ci * Lesser General Public License for more details. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 21cabdff1aSopenharmony_ci */ 22cabdff1aSopenharmony_ci 23cabdff1aSopenharmony_ci#ifndef AVCODEC_PPC_MATHOPS_H 24cabdff1aSopenharmony_ci#define AVCODEC_PPC_MATHOPS_H 25cabdff1aSopenharmony_ci 26cabdff1aSopenharmony_ci#include <stdint.h> 27cabdff1aSopenharmony_ci#include "config.h" 28cabdff1aSopenharmony_ci#include "libavutil/common.h" 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#if HAVE_PPC4XX 31cabdff1aSopenharmony_ci/* signed 16x16 -> 32 multiply add accumulate */ 32cabdff1aSopenharmony_ci#define MAC16(rt, ra, rb) \ 33cabdff1aSopenharmony_ci __asm__ ("maclhw %0, %2, %3" : "=r" (rt) : "0" (rt), "r" (ra), "r" (rb)); 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci/* signed 16x16 -> 32 multiply */ 36cabdff1aSopenharmony_ci#define MUL16(ra, rb) \ 37cabdff1aSopenharmony_ci ({ int __rt; \ 38cabdff1aSopenharmony_ci __asm__ ("mullhw %0, %1, %2" : "=r" (__rt) : "r" (ra), "r" (rb)); \ 39cabdff1aSopenharmony_ci __rt; }) 40cabdff1aSopenharmony_ci#endif 41cabdff1aSopenharmony_ci 42cabdff1aSopenharmony_ci#define MULH MULH 43cabdff1aSopenharmony_cistatic inline av_const int MULH(int a, int b){ 44cabdff1aSopenharmony_ci int r; 45cabdff1aSopenharmony_ci __asm__ ("mulhw %0, %1, %2" : "=r"(r) : "r"(a), "r"(b)); 46cabdff1aSopenharmony_ci return r; 47cabdff1aSopenharmony_ci} 48cabdff1aSopenharmony_ci 49cabdff1aSopenharmony_ci#if !ARCH_PPC64 50cabdff1aSopenharmony_cistatic inline av_const int64_t MAC64(int64_t d, int a, int b) 51cabdff1aSopenharmony_ci{ 52cabdff1aSopenharmony_ci union { uint64_t x; unsigned hl[2]; } x = { d }; 53cabdff1aSopenharmony_ci int h, l; 54cabdff1aSopenharmony_ci __asm__ ("mullw %3, %4, %5 \n\t" 55cabdff1aSopenharmony_ci "mulhw %2, %4, %5 \n\t" 56cabdff1aSopenharmony_ci "addc %1, %1, %3 \n\t" 57cabdff1aSopenharmony_ci "adde %0, %0, %2 \n\t" 58cabdff1aSopenharmony_ci : "+r"(x.hl[0]), "+r"(x.hl[1]), "=&r"(h), "=&r"(l) 59cabdff1aSopenharmony_ci : "r"(a), "r"(b)); 60cabdff1aSopenharmony_ci return x.x; 61cabdff1aSopenharmony_ci} 62cabdff1aSopenharmony_ci#define MAC64(d, a, b) ((d) = MAC64(d, a, b)) 63cabdff1aSopenharmony_ci 64cabdff1aSopenharmony_cistatic inline av_const int64_t MLS64(int64_t d, int a, int b) 65cabdff1aSopenharmony_ci{ 66cabdff1aSopenharmony_ci union { uint64_t x; unsigned hl[2]; } x = { d }; 67cabdff1aSopenharmony_ci int h, l; 68cabdff1aSopenharmony_ci __asm__ ("mullw %3, %4, %5 \n\t" 69cabdff1aSopenharmony_ci "mulhw %2, %4, %5 \n\t" 70cabdff1aSopenharmony_ci "subfc %1, %3, %1 \n\t" 71cabdff1aSopenharmony_ci "subfe %0, %2, %0 \n\t" 72cabdff1aSopenharmony_ci : "+r"(x.hl[0]), "+r"(x.hl[1]), "=&r"(h), "=&r"(l) 73cabdff1aSopenharmony_ci : "r"(a), "r"(b)); 74cabdff1aSopenharmony_ci return x.x; 75cabdff1aSopenharmony_ci} 76cabdff1aSopenharmony_ci#define MLS64(d, a, b) ((d) = MLS64(d, a, b)) 77cabdff1aSopenharmony_ci#endif 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci#endif /* AVCODEC_PPC_MATHOPS_H */ 80