From e073786abec950cd30ec95defff59ca372db886a Mon Sep 17 00:00:00 2001 From: Randy Heit Date: Wed, 11 Mar 2015 13:19:17 -0500 Subject: [PATCH] Move MULSC stuff into a separate include file --- dumb/include/internal/mulsc.h | 36 +++++++++++++++++++++++++ dumb/src/helpers/resample.c | 31 +-------------------- dumb/src/it/itrender.c | 2 +- dumb/vc6/dumb_static/dumb_static.vcproj | 4 +++ 4 files changed, 42 insertions(+), 31 deletions(-) create mode 100644 dumb/include/internal/mulsc.h diff --git a/dumb/include/internal/mulsc.h b/dumb/include/internal/mulsc.h new file mode 100644 index 000000000..57d6ec291 --- /dev/null +++ b/dumb/include/internal/mulsc.h @@ -0,0 +1,36 @@ +#ifndef INTERNAL_MULSC_H +#define INTERNAL_MULSC_H + +#if !defined(_MSC_VER) || !defined(_M_IX86) || _MSC_VER >= 1800 +//#define MULSC(a, b) ((int)((LONG_LONG)(a) * (b) >> 16)) +//#define MULSC(a, b) ((a) * ((b) >> 2) >> 14) +#define MULSCV(a, b) ((int)((LONG_LONG)(a) * (b) >> 32)) +#define MULSCA(a, b) ((int)((LONG_LONG)((a) << 4) * (b) >> 32)) +#define MULSC(a, b) ((int)((LONG_LONG)((a) << 4) * ((b) << 12) >> 32)) +#define MULSC16(a, b) ((int)((LONG_LONG)((a) << 12) * ((b) << 12) >> 32)) +#else +/* VC++ calls __allmull and __allshr for the above math. I don't know why. + * [Need to check if this still applies to recent versions of the compiler.] */ +static __forceinline unsigned long long MULLL(int a, int b) +{ + __asm mov eax,a + __asm imul b +} +static __forceinline int MULSCV (int a, int b) +{ +#ifndef _DEBUG + union { unsigned long long q; struct { int l, h; }; } val; + val.q = MULLL(a,b); + return val.h; +#else + __asm mov eax,a + __asm imul b + __asm mov eax,edx +#endif +} +#define MULSCA(a, b) MULSCV((a) << 4, b) +#define MULSC(a, b) MULSCV((a) << 4, (b) << 12) +#define MULSC16(a, b) MULSCV((a) << 12, (b) << 12) +#endif + +#endif /* INTERNAL_MULSC_H */ \ No newline at end of file diff --git a/dumb/src/helpers/resample.c b/dumb/src/helpers/resample.c index 52b8e0f5d..a042775a0 100644 --- a/dumb/src/helpers/resample.c +++ b/dumb/src/helpers/resample.c @@ -46,6 +46,7 @@ #include "dumb.h" #include "internal/resampler.h" +#include "internal/mulsc.h" @@ -85,36 +86,6 @@ int dumb_resampling_quality = DUMB_RQ_CUBIC; -#if !defined(_MSC_VER) || !defined(_M_IX86) || _MSC_VER >= 1800 -//#define MULSC(a, b) ((int)((LONG_LONG)(a) * (b) >> 16)) -//#define MULSC(a, b) ((a) * ((b) >> 2) >> 14) -#define MULSCV(a, b) ((int)((LONG_LONG)(a) * (b) >> 32)) -#define MULSC(a, b) ((int)((LONG_LONG)((a) << 4) * ((b) << 12) >> 32)) -#define MULSC16(a, b) ((int)((LONG_LONG)((a) << 12) * ((b) << 12) >> 32)) -#else -/* VC++ calls __allmull and __allshr for the above math. I don't know why. - * [Need to check if this still applies to recent versions of the compiler.] */ -static __forceinline unsigned long long MULLL(int a, int b) -{ - __asm mov eax,a - __asm imul b -} -static __forceinline int MULSCV (int a, int b) -{ -#ifndef _DEBUG - union { unsigned long long q; struct { int l, h; }; } val; - val.q = MULLL(a,b); - return val.h; -#else - __asm mov eax,a - __asm imul b - __asm mov eax,edx -#endif -} -#define MULSC(a, b) MULSCV((a) << 4, (b) << 12) -#define MULSC16(a, b) MULSCV((a) << 12, ((b) << 12)) -#endif - /* From xs_Float.h ==============================================*/ #if __BIG_ENDIAN__ #define _xs_iman_ 1 diff --git a/dumb/src/it/itrender.c b/dumb/src/it/itrender.c index df97c4991..0491e7e59 100644 --- a/dumb/src/it/itrender.c +++ b/dumb/src/it/itrender.c @@ -27,6 +27,7 @@ #include "internal/lpc.h" #include "internal/resampler.h" +#include "internal/mulsc.h" // #define BIT_ARRAY_BULLSHIT @@ -601,7 +602,6 @@ static void it_filter_int(DUMB_CLICK_REMOVER *cr, IT_FILTER_STATE *state, sample #define INT_FILTERS #ifdef INT_FILTERS -#define MULSCA(a, b) ((int)((LONG_LONG)((a) << 4) * (b) >> 32)) #define SCALEB 12 { int ai = (int)(a * (1 << (16+SCALEB))); diff --git a/dumb/vc6/dumb_static/dumb_static.vcproj b/dumb/vc6/dumb_static/dumb_static.vcproj index 40844c488..497fe4a99 100644 --- a/dumb/vc6/dumb_static/dumb_static.vcproj +++ b/dumb/vc6/dumb_static/dumb_static.vcproj @@ -2041,6 +2041,10 @@ RelativePath="..\..\include\internal\lpc.h" > + +