00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "config.h"
00025
00026 #include <stdlib.h>
00027 #include <inttypes.h>
00028
00029 #include "mpeg2.h"
00030 #include "attributes.h"
00031 #include "mpeg2_internal.h"
00032 #ifdef ARCH_X86
00033 #include "i386/mmx.h"
00034 #endif
00035
00036 void (* mpeg2_cpu_state_save) (cpu_state_t * state) = NULL;
00037 void (* mpeg2_cpu_state_restore) (cpu_state_t * state) = NULL;
00038
00039 #ifdef ARCH_X86
00040 static void state_restore_mmx (cpu_state_t * state)
00041 {
00042 emms ();
00043 }
00044 #endif
00045
00046 #ifdef HAVE_ALTIVEC
00047 #if defined(HAVE_ALTIVEC_H) && !defined(CONFIG_DARWIN)
00048 #define LI(a,b) "li " #a "," #b "\n\t"
00049 #define STVX0(a,b,c) "stvx " #a ",0," #c "\n\t"
00050 #define STVX(a,b,c) "stvx " #a "," #b "," #c "\n\t"
00051 #define LVX0(a,b,c) "lvx " #a ",0," #c "\n\t"
00052 #define LVX(a,b,c) "lvx " #a "," #b "," #c "\n\t"
00053 #else
00054 #define LI(a,b) "li r" #a "," #b "\n\t"
00055 #define STVX0(a,b,c) "stvx v" #a ",0,r" #c "\n\t"
00056 #define STVX(a,b,c) "stvx v" #a ",r" #b ",r" #c "\n\t"
00057 #define LVX0(a,b,c) "lvx v" #a ",0,r" #c "\n\t"
00058 #define LVX(a,b,c) "lvx v" #a ",r" #b ",r" #c "\n\t"
00059 #endif
00060
00061 static void state_save_altivec (cpu_state_t * state)
00062 {
00063 asm (LI (9, 16)
00064 STVX0 (20, 0, 3)
00065 LI (11, 32)
00066 STVX (21, 9, 3)
00067 LI (9, 48)
00068 STVX (22, 11, 3)
00069 LI (11, 64)
00070 STVX (23, 9, 3)
00071 LI (9, 80)
00072 STVX (24, 11, 3)
00073 LI (11, 96)
00074 STVX (25, 9, 3)
00075 LI (9, 112)
00076 STVX (26, 11, 3)
00077 LI (11, 128)
00078 STVX (27, 9, 3)
00079 LI (9, 144)
00080 STVX (28, 11, 3)
00081 LI (11, 160)
00082 STVX (29, 9, 3)
00083 LI (9, 176)
00084 STVX (30, 11, 3)
00085 STVX (31, 9, 3));
00086 }
00087
00088 static void state_restore_altivec (cpu_state_t * state)
00089 {
00090 asm (LI (9, 16)
00091 LVX0 (20, 0, 3)
00092 LI (11, 32)
00093 LVX (21, 9, 3)
00094 LI (9, 48)
00095 LVX (22, 11, 3)
00096 LI (11, 64)
00097 LVX (23, 9, 3)
00098 LI (9, 80)
00099 LVX (24, 11, 3)
00100 LI (11, 96)
00101 LVX (25, 9, 3)
00102 LI (9, 112)
00103 LVX (26, 11, 3)
00104 LI (11, 128)
00105 LVX (27, 9, 3)
00106 LI (9, 144)
00107 LVX (28, 11, 3)
00108 LI (11, 160)
00109 LVX (29, 9, 3)
00110 LI (9, 176)
00111 LVX (30, 11, 3)
00112 LVX (31, 9, 3));
00113 }
00114 #endif
00115
00116 void mpeg2_cpu_state_init (uint32_t accel)
00117 {
00118 #ifdef ARCH_X86
00119 if (accel & MPEG2_ACCEL_X86_MMX) {
00120 mpeg2_cpu_state_restore = state_restore_mmx;
00121 }
00122 #endif
00123 #ifdef HAVE_ALTIVEC
00124 if (accel & MPEG2_ACCEL_PPC_ALTIVEC) {
00125 mpeg2_cpu_state_save = state_save_altivec;
00126 mpeg2_cpu_state_restore = state_restore_altivec;
00127 }
00128 #endif
00129 }