From b19f4636d92ba0ab44eef7f7a1d47b11c58ace60 Mon Sep 17 00:00:00 2001 From: Mattias Wadman Date: Thu, 12 Nov 2009 22:09:52 +0000 Subject: [PATCH] Make it compile on PPC Added generic ffdesca code Added atomic ops for ppc --- Makefile | 2 ++ configure | 7 ++++- src/atomic.h | 20 ++++++++++++- src/ffdecsa/parallel_032_int.h | 55 ++++++++++++++++++++++++++++++++++ src/ffdecsa/parallel_std_def.h | 29 ++++++++++++++++++ 5 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 src/ffdecsa/parallel_032_int.h create mode 100644 src/ffdecsa/parallel_std_def.h diff --git a/Makefile b/Makefile index 83aea39a..3f92cf4c 100644 --- a/Makefile +++ b/Makefile @@ -92,7 +92,9 @@ SRCS += src/cwc.c \ src/krypt.c \ src/ffdecsa/FFdecsa.c +ifneq ($(ARCH), ppc) ${BUILDDIR}/src/ffdecsa/FFdecsa.o : CFLAGS = -mmmx +endif LDFLAGS += -lcrypt # diff --git a/configure b/configure index ab6222c0..c66e2f70 100755 --- a/configure +++ b/configure @@ -19,7 +19,11 @@ CPU=generic ARCH=`uname -m` OSENV="posix" PREFIX=/usr/local -PARALLEL_MODE=PARALLEL_64_MMX +if [ "$ARCH" = "ppc" ] ; then + PARALLEL_MODE=PARALLEL_32_INT +else + PARALLEL_MODE=PARALLEL_64_MMX +fi show_help(){ echo "Usage: configure [options]" @@ -151,6 +155,7 @@ fi # Finalize # cat >> ${CONFIG_MAK} << EOF +ARCH=$ARCH INSTALLPREFIX=$PREFIX LDFLAGS_cfg += -lpthread EOF diff --git a/src/atomic.h b/src/atomic.h index 9492a68f..ce414999 100644 --- a/src/atomic.h +++ b/src/atomic.h @@ -31,6 +31,24 @@ atomic_add(volatile int *ptr, int incr) "=r"(r), "=m"(*ptr) : "0" (incr), "m" (*ptr) : "memory"); return r; } -#endif +#elif defined(__ppc__) || defined(__PPC__) + +/* somewhat based on code from darwin gcc */ +static inline int +atomic_add (volatile int *ptr, int incr) +{ + int tmp, res; + asm volatile("0:\n" + "lwarx %1,0,%2\n" + "add%I3 %0,%1,%3\n" + "stwcx. %0,0,%2\n" + "bne- 0b\n" + : "=&r"(tmp), "=&b"(res) + : "r" (ptr), "Ir"(incr) + : "cr0", "memory"); + + return res; +} +#endif #endif /* HTSATOMIC_H__ */ diff --git a/src/ffdecsa/parallel_032_int.h b/src/ffdecsa/parallel_032_int.h new file mode 100644 index 00000000..a21fe31b --- /dev/null +++ b/src/ffdecsa/parallel_032_int.h @@ -0,0 +1,55 @@ +/* FFdecsa -- fast decsa algorithm + * + * Copyright (C) 2003-2004 fatih89r + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#include "parallel_std_def.h" + +typedef unsigned int group; +#define GROUP_PARALLELISM 32 +#define FF0() 0x0 +#define FF1() 0xffffffff + +/* 64 rows of 32 bits */ + +void static inline FFTABLEIN(unsigned char *tab, int g, unsigned char *data){ + *(((int *)tab)+g)=*((int *)data); + *(((int *)tab)+32+g)=*(((int *)data)+1); +} + +void static inline FFTABLEOUT(unsigned char *data, unsigned char *tab, int g){ + *((int *)data)=*(((int *)tab)+g); + *(((int *)data)+1)=*(((int *)tab)+32+g); +} + +void static inline FFTABLEOUTXORNBY(int n, unsigned char *data, unsigned char *tab, int g){ + int j; + for(j=0;j=4?32-1:0))+j); + } +} + +typedef unsigned int batch; +#define BYTES_PER_BATCH 4 +#define B_FFN_ALL_29() 0x29292929 +#define B_FFN_ALL_02() 0x02020202 +#define B_FFN_ALL_04() 0x04040404 +#define B_FFN_ALL_10() 0x10101010 +#define B_FFN_ALL_40() 0x40404040 +#define B_FFN_ALL_80() 0x80808080 + +#define M_EMPTY() diff --git a/src/ffdecsa/parallel_std_def.h b/src/ffdecsa/parallel_std_def.h new file mode 100644 index 00000000..10517d48 --- /dev/null +++ b/src/ffdecsa/parallel_std_def.h @@ -0,0 +1,29 @@ +/* FFdecsa -- fast decsa algorithm + * + * Copyright (C) 2003-2004 fatih89r + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program 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 General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + */ + +#define FFXOR(a,b) ((a)^(b)) +#define FFAND(a,b) ((a)&(b)) +#define FFOR(a,b) ((a)|(b)) +#define FFNOT(a) (~(a)) + +#define B_FFAND(a,b) ((a)&(b)) +#define B_FFOR(a,b) ((a)|(b)) +#define B_FFXOR(a,b) ((a)^(b)) +#define B_FFSH8L(a,n) ((a)<<(n)) +#define B_FFSH8R(a,n) ((a)>>(n))