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