--- a/configure +++ b/configure @@ -1274,7 +1274,9 @@ echo "yes" if test -z "$_target" && x86 ; then cat > $TMPC << EOF int main(void) { +#ifndef __x86_64__ int test[(int)sizeof(char *)-7]; +#endif return 0; } EOF @@ -1393,7 +1395,7 @@ fi def_fast_64bit='#define HAVE_FAST_64BIT 0' def_fast_unaligned='#define HAVE_FAST_UNALIGNED 0' arch_all='X86 IA64 SPARC ARM AVR32 SH4 PPC ALPHA MIPS PA_RISC S390 S390X VAX BFIN XTENSA TOMI GENERIC' -subarch_all='X86_32 X86_64 PPC64' +subarch_all='X86_32 X86_64 X86_64_X64 X86_64_X32 PPC64' case "$host_arch" in i[3-9]86|x86|x86pc|k5|k6|k6-2|k6-3|pentium*|athlon*|i586-i686) arch='x86' @@ -1644,6 +1646,14 @@ case "$host_arch" in x86_64|amd64) arch='x86' subarch='x86_64' + cat > $TMPC << EOF +int main(void) { + int test[(int)sizeof(char *)-7]; + return 0; +} +EOF + cc_check && subarch="$subarch x86_64_x64" || subarch="$subarch x86_64_x32" CFLAGS="$CFLAGS -DMPG123_NO_LARGENAME" + def_fast_unaligned='#define HAVE_FAST_UNALIGNED 1' def_fast_64bit='#define HAVE_FAST_64BIT 1' iproc='x86_64' diff --git a/cpudetect.c b/cpudetect.c index fb93116..edf4f0a 100644 --- a/cpudetect.c +++ b/cpudetect.c @@ -233,9 +233,9 @@ do_cpuid(unsigned int ax, unsigned int *p) { // code from libavcodec: __asm__ volatile - ("mov %%"REG_b", %%"REG_S"\n\t" + ("mov %%"REG_rb", %%"REG_rS"\n\t" "cpuid\n\t" - "xchg %%"REG_b", %%"REG_S + "xchg %%"REG_rb", %%"REG_rS : "=a" (p[0]), "=S" (p[1]), "=c" (p[2]), "=d" (p[3]) : "0" (ax)); diff --git a/ffmpeg_files/x86_cpu.h b/ffmpeg_files/x86_cpu.h index 49a5b28..46ca592 100644 --- a/ffmpeg_files/x86_cpu.h +++ b/ffmpeg_files/x86_cpu.h @@ -24,13 +24,15 @@ #include #include "config.h" -#if ARCH_X86_64 +#if ARCH_X86_64_X64 +# define REG_PTR_MOD "q" # define REG_a "rax" # define REG_b "rbx" # define REG_c "rcx" # define REG_d "rdx" # define REG_D "rdi" # define REG_S "rsi" +# define REG_8 "r8" # define PTR_SIZE "8" typedef int64_t x86_reg; @@ -42,9 +44,11 @@ typedef int64_t x86_reg; # define REGc rcx # define REGd rdx # define REGSP rsp +# define REG8 r8 -#elif ARCH_X86_32 +#elif ARCH_X86_64_X32 || ARCH_X86_32 +# define REG_PTR_MOD "k" # define REG_a "eax" # define REG_b "ebx" # define REG_c "ecx" @@ -62,10 +66,31 @@ typedef int32_t x86_reg; # define REGc ecx # define REGd edx # define REGSP esp +# define REG8 r8d #else typedef int x86_reg; #endif +#if ARCH_X86_64 +# define REG_ra "rax" +# define REG_rb "rbx" +# define REG_rc "rcx" +# define REG_rd "rdx" +# define REG_rD "rdi" +# define REG_rS "rsi" +# define REG_rBP "rbp" +typedef int64_t x86_native_reg; +#elif ARCH_X86_32 +# define REG_ra "eax" +# define REG_rb "ebx" +# define REG_rc "ecx" +# define REG_rd "edx" +# define REG_rD "edi" +# define REG_rS "esi" +# define REG_rBP "ebp" +typedef int32_t x86_native_reg; +#endif + #define HAVE_7REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE && HAVE_EBP_AVAILABLE)) #define HAVE_6REGS (ARCH_X86_64 || (HAVE_EBX_AVAILABLE || HAVE_EBP_AVAILABLE)) diff --git a/libmpcodecs/vf_ilpack.c b/libmpcodecs/vf_ilpack.c index db4a849..4bdc7c6 100644 --- a/libmpcodecs/vf_ilpack.c +++ b/libmpcodecs/vf_ilpack.c @@ -114,7 +114,7 @@ static void pack_li_0_MMX(unsigned char *dst, unsigned char *y, unsigned char *u, unsigned char *v, int w, int us, int vs) { __asm__ volatile ("" - "push %%"REG_BP" \n\t" + "push %%"REG_rBP" \n\t" #if ARCH_X86_64 "mov %6, %%"REG_BP" \n\t" #else @@ -205,7 +205,7 @@ static void pack_li_0_MMX(unsigned char *dst, unsigned char *y, "decl %%ecx \n\t" "jnz .Lli0 \n\t" "emms \n\t" - "pop %%"REG_BP" \n\t" + "pop %%"REG_rBP" \n\t" : : "S" (y), "D" (dst), "a" (u), "b" (v), "c" (w/16), #if ARCH_X86_64 @@ -222,7 +222,7 @@ static void pack_li_1_MMX(unsigned char *dst, unsigned char *y, unsigned char *u, unsigned char *v, int w, int us, int vs) { __asm__ volatile ("" - "push %%"REG_BP" \n\t" + "push %%"REG_rBP" \n\t" #if ARCH_X86_64 "mov %6, %%"REG_BP" \n\t" #else @@ -317,7 +317,7 @@ static void pack_li_1_MMX(unsigned char *dst, unsigned char *y, "decl %%ecx \n\t" "jnz .Lli1 \n\t" "emms \n\t" - "pop %%"REG_BP" \n\t" + "pop %%"REG_rBP" \n\t" : : "S" (y), "D" (dst), "a" (u), "b" (v), "c" (w/16), #if ARCH_X86_64