Commit 3cd7d1ddbba67a79854ea258cdf3a07eb0ad5136

Authored by j_mayer
1 parent a73666f6

Allow use of SPE extension by all PowerPC targets,

adding gprh registers to store GPR MSBs when GPRs are 32 bits.
Remove not-needed-anymore ppcemb-linux-user target.
Keep ppcemb-softmmu target, which provides 1kB pages support
  and 36 bits physical address space.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3628 c046a42c-6fe2-441c-8c8c-71466251a162
configure
@@ -520,7 +520,7 @@ if test -z "$target_list" ; then @@ -520,7 +520,7 @@ if test -z "$target_list" ; then
520 fi 520 fi
521 # the following are Linux specific 521 # the following are Linux specific
522 if [ "$linux_user" = "yes" ] ; then 522 if [ "$linux_user" = "yes" ] ; then
523 - target_list="i386-linux-user arm-linux-user armeb-linux-user sparc-linux-user sparc64-linux-user sparc32plus-linux-user mips-linux-user mipsel-linux-user m68k-linux-user alpha-linux-user sh4-linux-user ppc-linux-user ppcemb-linux-user ppc64-linux-user ppc64abi32-linux-user x86_64-linux-user cris-linux-user $target_list" 523 + target_list="i386-linux-user arm-linux-user armeb-linux-user sparc-linux-user sparc64-linux-user sparc32plus-linux-user mips-linux-user mipsel-linux-user m68k-linux-user alpha-linux-user sh4-linux-user ppc-linux-user ppc64-linux-user ppc64abi32-linux-user x86_64-linux-user cris-linux-user $target_list"
524 fi 524 fi
525 # the following are Darwin specific 525 # the following are Darwin specific
526 if [ "$darwin_user" = "yes" ] ; then 526 if [ "$darwin_user" = "yes" ] ; then
darwin-user/main.c
@@ -357,7 +357,6 @@ void cpu_loop(CPUPPCState *env) @@ -357,7 +357,6 @@ void cpu_loop(CPUPPCState *env)
357 case POWERPC_EXCP_DEBUG: /* Debug interrupt */ 357 case POWERPC_EXCP_DEBUG: /* Debug interrupt */
358 gdb_handlesig (env, SIGTRAP); 358 gdb_handlesig (env, SIGTRAP);
359 break; 359 break;
360 -#if defined(TARGET_PPCEMB)  
361 case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavail. */ 360 case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavail. */
362 EXCP_DUMP(env, "No SPE/floating-point instruction allowed\n"); 361 EXCP_DUMP(env, "No SPE/floating-point instruction allowed\n");
363 info.si_signo = SIGILL; 362 info.si_signo = SIGILL;
@@ -383,7 +382,6 @@ void cpu_loop(CPUPPCState *env) @@ -383,7 +382,6 @@ void cpu_loop(CPUPPCState *env)
383 cpu_abort(env, "Doorbell critical interrupt while in user mode. " 382 cpu_abort(env, "Doorbell critical interrupt while in user mode. "
384 "Aborting\n"); 383 "Aborting\n");
385 break; 384 break;
386 -#endif /* defined(TARGET_PPCEMB) */  
387 case POWERPC_EXCP_RESET: /* System reset exception */ 385 case POWERPC_EXCP_RESET: /* System reset exception */
388 cpu_abort(env, "Reset interrupt while in user mode. " 386 cpu_abort(env, "Reset interrupt while in user mode. "
389 "Aborting\n"); 387 "Aborting\n");
linux-user/main.c
@@ -976,7 +976,6 @@ void cpu_loop(CPUPPCState *env) @@ -976,7 +976,6 @@ void cpu_loop(CPUPPCState *env)
976 } 976 }
977 } 977 }
978 break; 978 break;
979 -#if defined(TARGET_PPCEMB)  
980 case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavail. */ 979 case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavail. */
981 EXCP_DUMP(env, "No SPE/floating-point instruction allowed\n"); 980 EXCP_DUMP(env, "No SPE/floating-point instruction allowed\n");
982 info.si_signo = TARGET_SIGILL; 981 info.si_signo = TARGET_SIGILL;
@@ -1006,7 +1005,6 @@ void cpu_loop(CPUPPCState *env) @@ -1006,7 +1005,6 @@ void cpu_loop(CPUPPCState *env)
1006 cpu_abort(env, "Reset interrupt while in user mode. " 1005 cpu_abort(env, "Reset interrupt while in user mode. "
1007 "Aborting\n"); 1006 "Aborting\n");
1008 break; 1007 break;
1009 -#endif /* defined(TARGET_PPCEMB) */  
1010 #if defined(TARGET_PPC64) && !defined(TARGET_ABI32) /* PowerPC 64 */ 1008 #if defined(TARGET_PPC64) && !defined(TARGET_ABI32) /* PowerPC 64 */
1011 case POWERPC_EXCP_DSEG: /* Data segment exception */ 1009 case POWERPC_EXCP_DSEG: /* Data segment exception */
1012 cpu_abort(env, "Data segment exception while in user mode. " 1010 cpu_abort(env, "Data segment exception while in user mode. "
target-ppc/cpu.h
@@ -24,46 +24,51 @@ @@ -24,46 +24,51 @@
24 #include <inttypes.h> 24 #include <inttypes.h>
25 25
26 #if defined (TARGET_PPC64) 26 #if defined (TARGET_PPC64)
  27 +/* PowerPC 64 definitions */
27 typedef uint64_t ppc_gpr_t; 28 typedef uint64_t ppc_gpr_t;
28 #define TARGET_GPR_BITS 64 29 #define TARGET_GPR_BITS 64
29 #define TARGET_LONG_BITS 64 30 #define TARGET_LONG_BITS 64
30 #define REGX "%016" PRIx64 31 #define REGX "%016" PRIx64
31 #define TARGET_PAGE_BITS 12 32 #define TARGET_PAGE_BITS 12
32 -#elif defined(TARGET_PPCEMB)  
33 -/* BookE have 36 bits physical address space */  
34 -#define TARGET_PHYS_ADDR_BITS 64  
35 -/* GPR are 64 bits: used by vector extension */  
36 -typedef uint64_t ppc_gpr_t;  
37 -#define TARGET_GPR_BITS 64  
38 -#define TARGET_LONG_BITS 32  
39 -#define REGX "%016" PRIx64  
40 -#if defined(CONFIG_USER_ONLY)  
41 -/* It looks like a lot of Linux programs assume page size  
42 - * is 4kB long. This is evil, but we have to deal with it...  
43 - */  
44 -#define TARGET_PAGE_BITS 12  
45 -#else  
46 -/* Pages can be 1 kB small */  
47 -#define TARGET_PAGE_BITS 10  
48 -#endif  
49 -#else 33 +
  34 +#else /* defined (TARGET_PPC64) */
  35 +/* PowerPC 32 definitions */
50 #if (HOST_LONG_BITS >= 64) 36 #if (HOST_LONG_BITS >= 64)
51 /* When using 64 bits temporary registers, 37 /* When using 64 bits temporary registers,
52 * we can use 64 bits GPR with no extra cost 38 * we can use 64 bits GPR with no extra cost
53 - * It's even an optimization as it will prevent 39 + * It's even an optimization as this will prevent
54 * the compiler to do unuseful masking in the micro-ops. 40 * the compiler to do unuseful masking in the micro-ops.
55 */ 41 */
56 typedef uint64_t ppc_gpr_t; 42 typedef uint64_t ppc_gpr_t;
57 #define TARGET_GPR_BITS 64 43 #define TARGET_GPR_BITS 64
58 #define REGX "%08" PRIx64 44 #define REGX "%08" PRIx64
59 -#else 45 +#else /* (HOST_LONG_BITS >= 64) */
60 typedef uint32_t ppc_gpr_t; 46 typedef uint32_t ppc_gpr_t;
61 #define TARGET_GPR_BITS 32 47 #define TARGET_GPR_BITS 32
62 #define REGX "%08" PRIx32 48 #define REGX "%08" PRIx32
63 -#endif 49 +#endif /* (HOST_LONG_BITS >= 64) */
  50 +
64 #define TARGET_LONG_BITS 32 51 #define TARGET_LONG_BITS 32
  52 +
  53 +#if defined(TARGET_PPCEMB)
  54 +/* Specific definitions for PowerPC embedded */
  55 +/* BookE have 36 bits physical address space */
  56 +#define TARGET_PHYS_ADDR_BITS 64
  57 +#if defined(CONFIG_USER_ONLY)
  58 +/* It looks like a lot of Linux programs assume page size
  59 + * is 4kB long. This is evil, but we have to deal with it...
  60 + */
65 #define TARGET_PAGE_BITS 12 61 #define TARGET_PAGE_BITS 12
66 -#endif 62 +#else /* defined(CONFIG_USER_ONLY) */
  63 +/* Pages can be 1 kB small */
  64 +#define TARGET_PAGE_BITS 10
  65 +#endif /* defined(CONFIG_USER_ONLY) */
  66 +#else /* defined(TARGET_PPCEMB) */
  67 +/* "standard" PowerPC 32 definitions */
  68 +#define TARGET_PAGE_BITS 12
  69 +#endif /* defined(TARGET_PPCEMB) */
  70 +
  71 +#endif /* defined (TARGET_PPC64) */
67 72
68 #include "cpu-defs.h" 73 #include "cpu-defs.h"
69 74
@@ -166,14 +171,12 @@ enum { @@ -166,14 +171,12 @@ enum {
166 POWERPC_EXCP_ITLB = 14, /* Instruction TLB error */ 171 POWERPC_EXCP_ITLB = 14, /* Instruction TLB error */
167 POWERPC_EXCP_DEBUG = 15, /* Debug interrupt */ 172 POWERPC_EXCP_DEBUG = 15, /* Debug interrupt */
168 /* Vectors 16 to 31 are reserved */ 173 /* Vectors 16 to 31 are reserved */
169 -#if defined(TARGET_PPCEMB)  
170 POWERPC_EXCP_SPEU = 32, /* SPE/embedded floating-point unavailable */ 174 POWERPC_EXCP_SPEU = 32, /* SPE/embedded floating-point unavailable */
171 POWERPC_EXCP_EFPDI = 33, /* Embedded floating-point data interrupt */ 175 POWERPC_EXCP_EFPDI = 33, /* Embedded floating-point data interrupt */
172 POWERPC_EXCP_EFPRI = 34, /* Embedded floating-point round interrupt */ 176 POWERPC_EXCP_EFPRI = 34, /* Embedded floating-point round interrupt */
173 POWERPC_EXCP_EPERFM = 35, /* Embedded performance monitor interrupt */ 177 POWERPC_EXCP_EPERFM = 35, /* Embedded performance monitor interrupt */
174 POWERPC_EXCP_DOORI = 36, /* Embedded doorbell interrupt */ 178 POWERPC_EXCP_DOORI = 36, /* Embedded doorbell interrupt */
175 POWERPC_EXCP_DOORCI = 37, /* Embedded doorbell critical interrupt */ 179 POWERPC_EXCP_DOORCI = 37, /* Embedded doorbell critical interrupt */
176 -#endif /* defined(TARGET_PPCEMB) */  
177 /* Vectors 38 to 63 are reserved */ 180 /* Vectors 38 to 63 are reserved */
178 /* Exceptions defined in the PowerPC server specification */ 181 /* Exceptions defined in the PowerPC server specification */
179 POWERPC_EXCP_RESET = 64, /* System reset exception */ 182 POWERPC_EXCP_RESET = 64, /* System reset exception */
@@ -527,6 +530,10 @@ struct CPUPPCState { @@ -527,6 +530,10 @@ struct CPUPPCState {
527 530
528 /* general purpose registers */ 531 /* general purpose registers */
529 ppc_gpr_t gpr[32]; 532 ppc_gpr_t gpr[32];
  533 +#if TARGET_GPR_BITS < 64
  534 + /* Storage for GPR MSB, used by the SPE extension */
  535 + ppc_gpr_t gprh[32];
  536 +#endif
530 /* LR */ 537 /* LR */
531 target_ulong lr; 538 target_ulong lr;
532 /* CTR */ 539 /* CTR */
@@ -597,12 +604,10 @@ struct CPUPPCState { @@ -597,12 +604,10 @@ struct CPUPPCState {
597 /* Altivec registers */ 604 /* Altivec registers */
598 ppc_avr_t avr[32]; 605 ppc_avr_t avr[32];
599 uint32_t vscr; 606 uint32_t vscr;
600 -#if defined(TARGET_PPCEMB)  
601 /* SPE registers */ 607 /* SPE registers */
602 ppc_gpr_t spe_acc; 608 ppc_gpr_t spe_acc;
603 float_status spe_status; 609 float_status spe_status;
604 uint32_t spe_fscr; 610 uint32_t spe_fscr;
605 -#endif  
606 611
607 /* Internal devices resources */ 612 /* Internal devices resources */
608 /* Time base and decrementer */ 613 /* Time base and decrementer */
target-ppc/helper.c
@@ -2395,7 +2395,6 @@ static always_inline void powerpc_excp (CPUState *env, @@ -2395,7 +2395,6 @@ static always_inline void powerpc_excp (CPUState *env,
2395 /* XXX: TODO */ 2395 /* XXX: TODO */
2396 cpu_abort(env, "Debug exception is not implemented yet !\n"); 2396 cpu_abort(env, "Debug exception is not implemented yet !\n");
2397 goto store_next; 2397 goto store_next;
2398 -#if defined(TARGET_PPCEMB)  
2399 case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavailable */ 2398 case POWERPC_EXCP_SPEU: /* SPE/embedded floating-point unavailable */
2400 new_msr &= ~((target_ulong)1 << MSR_RI); /* XXX: check this */ 2399 new_msr &= ~((target_ulong)1 << MSR_RI); /* XXX: check this */
2401 goto store_current; 2400 goto store_current;
@@ -2433,7 +2432,6 @@ static always_inline void powerpc_excp (CPUState *env, @@ -2433,7 +2432,6 @@ static always_inline void powerpc_excp (CPUState *env,
2433 cpu_abort(env, "Embedded doorbell critical interrupt " 2432 cpu_abort(env, "Embedded doorbell critical interrupt "
2434 "is not implemented yet !\n"); 2433 "is not implemented yet !\n");
2435 goto store_next; 2434 goto store_next;
2436 -#endif /* defined(TARGET_PPCEMB) */  
2437 case POWERPC_EXCP_RESET: /* System reset exception */ 2435 case POWERPC_EXCP_RESET: /* System reset exception */
2438 new_msr &= ~((target_ulong)1 << MSR_RI); 2436 new_msr &= ~((target_ulong)1 << MSR_RI);
2439 #if defined(TARGET_PPC64H) 2437 #if defined(TARGET_PPC64H)
@@ -2833,26 +2831,11 @@ void ppc_hw_interrupt (CPUPPCState *env) @@ -2833,26 +2831,11 @@ void ppc_hw_interrupt (CPUPPCState *env)
2833 powerpc_excp(env, env->excp_model, POWERPC_EXCP_WDT); 2831 powerpc_excp(env, env->excp_model, POWERPC_EXCP_WDT);
2834 return; 2832 return;
2835 } 2833 }
2836 -#if defined(TARGET_PPCEMB)  
2837 if (env->pending_interrupts & (1 << PPC_INTERRUPT_CDOORBELL)) { 2834 if (env->pending_interrupts & (1 << PPC_INTERRUPT_CDOORBELL)) {
2838 env->pending_interrupts &= ~(1 << PPC_INTERRUPT_CDOORBELL); 2835 env->pending_interrupts &= ~(1 << PPC_INTERRUPT_CDOORBELL);
2839 powerpc_excp(env, env->excp_model, POWERPC_EXCP_DOORCI); 2836 powerpc_excp(env, env->excp_model, POWERPC_EXCP_DOORCI);
2840 return; 2837 return;
2841 } 2838 }
2842 -#endif  
2843 -#if defined(TARGET_PPCEMB)  
2844 - /* External interrupt */  
2845 - if (env->pending_interrupts & (1 << PPC_INTERRUPT_EXT)) {  
2846 - /* Taking an external interrupt does not clear the external  
2847 - * interrupt status  
2848 - */  
2849 -#if 0  
2850 - env->pending_interrupts &= ~(1 << PPC_INTERRUPT_EXT);  
2851 -#endif  
2852 - powerpc_excp(env, env->excp_model, POWERPC_EXCP_EXTERNAL);  
2853 - return;  
2854 - }  
2855 -#endif  
2856 /* Fixed interval timer on embedded PowerPC */ 2839 /* Fixed interval timer on embedded PowerPC */
2857 if (env->pending_interrupts & (1 << PPC_INTERRUPT_FIT)) { 2840 if (env->pending_interrupts & (1 << PPC_INTERRUPT_FIT)) {
2858 env->pending_interrupts &= ~(1 << PPC_INTERRUPT_FIT); 2841 env->pending_interrupts &= ~(1 << PPC_INTERRUPT_FIT);
@@ -2871,7 +2854,6 @@ void ppc_hw_interrupt (CPUPPCState *env) @@ -2871,7 +2854,6 @@ void ppc_hw_interrupt (CPUPPCState *env)
2871 powerpc_excp(env, env->excp_model, POWERPC_EXCP_DECR); 2854 powerpc_excp(env, env->excp_model, POWERPC_EXCP_DECR);
2872 return; 2855 return;
2873 } 2856 }
2874 -#if !defined(TARGET_PPCEMB)  
2875 /* External interrupt */ 2857 /* External interrupt */
2876 if (env->pending_interrupts & (1 << PPC_INTERRUPT_EXT)) { 2858 if (env->pending_interrupts & (1 << PPC_INTERRUPT_EXT)) {
2877 /* Taking an external interrupt does not clear the external 2859 /* Taking an external interrupt does not clear the external
@@ -2883,14 +2865,11 @@ void ppc_hw_interrupt (CPUPPCState *env) @@ -2883,14 +2865,11 @@ void ppc_hw_interrupt (CPUPPCState *env)
2883 powerpc_excp(env, env->excp_model, POWERPC_EXCP_EXTERNAL); 2865 powerpc_excp(env, env->excp_model, POWERPC_EXCP_EXTERNAL);
2884 return; 2866 return;
2885 } 2867 }
2886 -#endif  
2887 -#if defined(TARGET_PPCEMB)  
2888 if (env->pending_interrupts & (1 << PPC_INTERRUPT_DOORBELL)) { 2868 if (env->pending_interrupts & (1 << PPC_INTERRUPT_DOORBELL)) {
2889 env->pending_interrupts &= ~(1 << PPC_INTERRUPT_DOORBELL); 2869 env->pending_interrupts &= ~(1 << PPC_INTERRUPT_DOORBELL);
2890 powerpc_excp(env, env->excp_model, POWERPC_EXCP_DOORI); 2870 powerpc_excp(env, env->excp_model, POWERPC_EXCP_DOORI);
2891 return; 2871 return;
2892 } 2872 }
2893 -#endif  
2894 if (env->pending_interrupts & (1 << PPC_INTERRUPT_PERFM)) { 2873 if (env->pending_interrupts & (1 << PPC_INTERRUPT_PERFM)) {
2895 env->pending_interrupts &= ~(1 << PPC_INTERRUPT_PERFM); 2874 env->pending_interrupts &= ~(1 << PPC_INTERRUPT_PERFM);
2896 powerpc_excp(env, env->excp_model, POWERPC_EXCP_PERFM); 2875 powerpc_excp(env, env->excp_model, POWERPC_EXCP_PERFM);
target-ppc/op.c
@@ -2720,7 +2720,6 @@ void OPPROTO op_store_booke_tsr (void) @@ -2720,7 +2720,6 @@ void OPPROTO op_store_booke_tsr (void)
2720 } 2720 }
2721 #endif /* !defined(CONFIG_USER_ONLY) */ 2721 #endif /* !defined(CONFIG_USER_ONLY) */
2722 2722
2723 -#if defined(TARGET_PPCEMB)  
2724 /* SPE extension */ 2723 /* SPE extension */
2725 void OPPROTO op_splatw_T1_64 (void) 2724 void OPPROTO op_splatw_T1_64 (void)
2726 { 2725 {
@@ -3439,4 +3438,3 @@ void OPPROTO op_efdtsteq (void) @@ -3439,4 +3438,3 @@ void OPPROTO op_efdtsteq (void)
3439 T0 = _do_efdtsteq(T0_64, T1_64); 3438 T0 = _do_efdtsteq(T0_64, T1_64);
3440 RETURN(); 3439 RETURN();
3441 } 3440 }
3442 -#endif /* defined(TARGET_PPCEMB) */  
target-ppc/op_helper.c
@@ -1853,7 +1853,6 @@ void do_440_dlmzb (void) @@ -1853,7 +1853,6 @@ void do_440_dlmzb (void)
1853 T0 = i; 1853 T0 = i;
1854 } 1854 }
1855 1855
1856 -#if defined(TARGET_PPCEMB)  
1857 /* SPE extension helpers */ 1856 /* SPE extension helpers */
1858 /* Use a table to make this quicker */ 1857 /* Use a table to make this quicker */
1859 static uint8_t hbrev[16] = { 1858 static uint8_t hbrev[16] = {
@@ -1872,16 +1871,16 @@ static always_inline uint32_t word_reverse (uint32_t val) @@ -1872,16 +1871,16 @@ static always_inline uint32_t word_reverse (uint32_t val)
1872 (byte_reverse(val >> 8) << 16) | (byte_reverse(val) << 24); 1871 (byte_reverse(val >> 8) << 16) | (byte_reverse(val) << 24);
1873 } 1872 }
1874 1873
1875 -#define MASKBITS 16 // Random value - to be fixed 1874 +#define MASKBITS 16 // Random value - to be fixed (implementation dependant)
1876 void do_brinc (void) 1875 void do_brinc (void)
1877 { 1876 {
1878 uint32_t a, b, d, mask; 1877 uint32_t a, b, d, mask;
1879 1878
1880 - mask = UINT32_MAX >> MASKBITS;  
1881 - b = T1_64 & mask;  
1882 - a = T0_64 & mask;  
1883 - d = word_reverse(1 + word_reverse(a | ~mask));  
1884 - T0_64 = (T0_64 & ~mask) | (d & mask); 1879 + mask = UINT32_MAX >> (32 - MASKBITS);
  1880 + a = T0 & mask;
  1881 + b = T1 & mask;
  1882 + d = word_reverse(1 + word_reverse(a | ~b));
  1883 + T0 = (T0 & ~mask) | (d & b);
1885 } 1884 }
1886 1885
1887 #define DO_SPE_OP2(name) \ 1886 #define DO_SPE_OP2(name) \
@@ -2713,7 +2712,6 @@ DO_SPE_OP1(fsctuiz); @@ -2713,7 +2712,6 @@ DO_SPE_OP1(fsctuiz);
2713 DO_SPE_OP1(fsctsf); 2712 DO_SPE_OP1(fsctsf);
2714 /* evfsctuf */ 2713 /* evfsctuf */
2715 DO_SPE_OP1(fsctuf); 2714 DO_SPE_OP1(fsctuf);
2716 -#endif /* defined(TARGET_PPCEMB) */  
2717 2715
2718 /*****************************************************************************/ 2716 /*****************************************************************************/
2719 /* Softmmu support */ 2717 /* Softmmu support */
target-ppc/op_helper.h
@@ -205,7 +205,6 @@ void do_load_403_pb (int num); @@ -205,7 +205,6 @@ void do_load_403_pb (int num);
205 void do_store_403_pb (int num); 205 void do_store_403_pb (int num);
206 #endif 206 #endif
207 207
208 -#if defined(TARGET_PPCEMB)  
209 /* SPE extension helpers */ 208 /* SPE extension helpers */
210 void do_brinc (void); 209 void do_brinc (void);
211 /* Fixed-point vector helpers */ 210 /* Fixed-point vector helpers */
@@ -286,9 +285,7 @@ void do_evfsctsi (void); @@ -286,9 +285,7 @@ void do_evfsctsi (void);
286 void do_evfsctui (void); 285 void do_evfsctui (void);
287 void do_evfsctsiz (void); 286 void do_evfsctsiz (void);
288 void do_evfsctuiz (void); 287 void do_evfsctuiz (void);
289 -#endif /* defined(TARGET_PPCEMB) */  
290 288
291 -#if defined(TARGET_PPCEMB)  
292 /* SPE extension */ 289 /* SPE extension */
293 /* Single precision floating-point helpers */ 290 /* Single precision floating-point helpers */
294 static always_inline uint32_t _do_efsabs (uint32_t val) 291 static always_inline uint32_t _do_efsabs (uint32_t val)
@@ -409,5 +406,4 @@ static always_inline int _do_efdtsteq (uint64_t op1, uint64_t op2) @@ -409,5 +406,4 @@ static always_inline int _do_efdtsteq (uint64_t op1, uint64_t op2)
409 u2.u = op2; 406 u2.u = op2;
410 return float64_eq(u1.f, u2.f, &env->spe_status) ? 1 : 0; 407 return float64_eq(u1.f, u2.f, &env->spe_status) ? 1 : 0;
411 } 408 }
412 -#endif /* defined(TARGET_PPCEMB) */  
413 #endif 409 #endif
target-ppc/op_mem.h
@@ -37,7 +37,6 @@ static always_inline uint32_t glue(ld32r, MEMSUFFIX) (target_ulong EA) @@ -37,7 +37,6 @@ static always_inline uint32_t glue(ld32r, MEMSUFFIX) (target_ulong EA)
37 ((tmp & 0x0000FF00) << 8) | ((tmp & 0x000000FF) << 24); 37 ((tmp & 0x0000FF00) << 8) | ((tmp & 0x000000FF) << 24);
38 } 38 }
39 39
40 -#if defined(TARGET_PPC64) || defined(TARGET_PPCEMB)  
41 static always_inline uint64_t glue(ld64r, MEMSUFFIX) (target_ulong EA) 40 static always_inline uint64_t glue(ld64r, MEMSUFFIX) (target_ulong EA)
42 { 41 {
43 uint64_t tmp = glue(ldq, MEMSUFFIX)(EA); 42 uint64_t tmp = glue(ldq, MEMSUFFIX)(EA);
@@ -50,7 +49,6 @@ static always_inline uint64_t glue(ld64r, MEMSUFFIX) (target_ulong EA) @@ -50,7 +49,6 @@ static always_inline uint64_t glue(ld64r, MEMSUFFIX) (target_ulong EA)
50 ((tmp & 0x000000000000FF00ULL) << 40) | 49 ((tmp & 0x000000000000FF00ULL) << 40) |
51 ((tmp & 0x00000000000000FFULL) << 54); 50 ((tmp & 0x00000000000000FFULL) << 54);
52 } 51 }
53 -#endif  
54 52
55 #if defined(TARGET_PPC64) 53 #if defined(TARGET_PPC64)
56 static always_inline int64_t glue(ldsl, MEMSUFFIX) (target_ulong EA) 54 static always_inline int64_t glue(ldsl, MEMSUFFIX) (target_ulong EA)
@@ -81,7 +79,6 @@ static always_inline void glue(st32r, MEMSUFFIX) (target_ulong EA, @@ -81,7 +79,6 @@ static always_inline void glue(st32r, MEMSUFFIX) (target_ulong EA,
81 glue(stl, MEMSUFFIX)(EA, tmp); 79 glue(stl, MEMSUFFIX)(EA, tmp);
82 } 80 }
83 81
84 -#if defined(TARGET_PPC64) || defined(TARGET_PPCEMB)  
85 static always_inline void glue(st64r, MEMSUFFIX) (target_ulong EA, 82 static always_inline void glue(st64r, MEMSUFFIX) (target_ulong EA,
86 uint64_t data) 83 uint64_t data)
87 { 84 {
@@ -95,7 +92,6 @@ static always_inline void glue(st64r, MEMSUFFIX) (target_ulong EA, @@ -95,7 +92,6 @@ static always_inline void glue(st64r, MEMSUFFIX) (target_ulong EA,
95 ((data & 0x00000000000000FFULL) << 56); 92 ((data & 0x00000000000000FFULL) << 56);
96 glue(stq, MEMSUFFIX)(EA, tmp); 93 glue(stq, MEMSUFFIX)(EA, tmp);
97 } 94 }
98 -#endif  
99 95
100 /*** Integer load ***/ 96 /*** Integer load ***/
101 #define PPC_LD_OP(name, op) \ 97 #define PPC_LD_OP(name, op) \
@@ -1123,7 +1119,6 @@ void OPPROTO glue(op_vr_stvx_le_64, MEMSUFFIX) (void) @@ -1123,7 +1119,6 @@ void OPPROTO glue(op_vr_stvx_le_64, MEMSUFFIX) (void)
1123 #undef VR_DWORD0 1119 #undef VR_DWORD0
1124 #undef VR_DWORD1 1120 #undef VR_DWORD1
1125 1121
1126 -#if defined(TARGET_PPCEMB)  
1127 /* SPE extension */ 1122 /* SPE extension */
1128 #define _PPC_SPE_LD_OP(name, op) \ 1123 #define _PPC_SPE_LD_OP(name, op) \
1129 void OPPROTO glue(glue(op_spe_l, name), MEMSUFFIX) (void) \ 1124 void OPPROTO glue(glue(op_spe_l, name), MEMSUFFIX) (void) \
@@ -1385,6 +1380,5 @@ uint64_t glue(spe_lwhsplat_le, MEMSUFFIX) (target_ulong EA) @@ -1385,6 +1380,5 @@ uint64_t glue(spe_lwhsplat_le, MEMSUFFIX) (target_ulong EA)
1385 return ret; 1380 return ret;
1386 } 1381 }
1387 PPC_SPE_LD_OP(whsplat_le, spe_lwhsplat_le); 1382 PPC_SPE_LD_OP(whsplat_le, spe_lwhsplat_le);
1388 -#endif /* defined(TARGET_PPCEMB) */  
1389 1383
1390 #undef MEMSUFFIX 1384 #undef MEMSUFFIX
target-ppc/op_template.h
@@ -58,23 +58,23 @@ void OPPROTO glue(op_store_T2_gpr_gpr, REG) (void) @@ -58,23 +58,23 @@ void OPPROTO glue(op_store_T2_gpr_gpr, REG) (void)
58 #endif 58 #endif
59 59
60 /* General purpose registers containing vector operands moves */ 60 /* General purpose registers containing vector operands moves */
61 -#if defined(TARGET_PPCEMB) 61 +#if TARGET_GPR_BITS < 64
62 void OPPROTO glue(op_load_gpr64_T0_gpr, REG) (void) 62 void OPPROTO glue(op_load_gpr64_T0_gpr, REG) (void)
63 { 63 {
64 - T0_64 = env->gpr[REG]; 64 + T0_64 = (uint64_t)env->gpr[REG] | ((uint64_t)env->gprh[REG] << 32);
65 RETURN(); 65 RETURN();
66 } 66 }
67 67
68 void OPPROTO glue(op_load_gpr64_T1_gpr, REG) (void) 68 void OPPROTO glue(op_load_gpr64_T1_gpr, REG) (void)
69 { 69 {
70 - T1_64 = env->gpr[REG]; 70 + T1_64 = (uint64_t)env->gpr[REG] | ((uint64_t)env->gprh[REG] << 32);
71 RETURN(); 71 RETURN();
72 } 72 }
73 73
74 #if 0 // unused 74 #if 0 // unused
75 void OPPROTO glue(op_load_gpr64_T2_gpr, REG) (void) 75 void OPPROTO glue(op_load_gpr64_T2_gpr, REG) (void)
76 { 76 {
77 - T2_64 = env->gpr[REG]; 77 + T2_64 = (uint64_t)env->gpr[REG] | ((uint64_t)env->gprh[REG] << 32);
78 RETURN(); 78 RETURN();
79 } 79 }
80 #endif 80 #endif
@@ -82,12 +82,14 @@ void OPPROTO glue(op_load_gpr64_T2_gpr, REG) (void) @@ -82,12 +82,14 @@ void OPPROTO glue(op_load_gpr64_T2_gpr, REG) (void)
82 void OPPROTO glue(op_store_T0_gpr64_gpr, REG) (void) 82 void OPPROTO glue(op_store_T0_gpr64_gpr, REG) (void)
83 { 83 {
84 env->gpr[REG] = T0_64; 84 env->gpr[REG] = T0_64;
  85 + env->gprh[REG] = T0_64 >> 32;
85 RETURN(); 86 RETURN();
86 } 87 }
87 88
88 void OPPROTO glue(op_store_T1_gpr64_gpr, REG) (void) 89 void OPPROTO glue(op_store_T1_gpr64_gpr, REG) (void)
89 { 90 {
90 env->gpr[REG] = T1_64; 91 env->gpr[REG] = T1_64;
  92 + env->gprh[REG] = T1_64 >> 32;
91 RETURN(); 93 RETURN();
92 } 94 }
93 95
@@ -95,10 +97,11 @@ void OPPROTO glue(op_store_T1_gpr64_gpr, REG) (void) @@ -95,10 +97,11 @@ void OPPROTO glue(op_store_T1_gpr64_gpr, REG) (void)
95 void OPPROTO glue(op_store_T2_gpr64_gpr, REG) (void) 97 void OPPROTO glue(op_store_T2_gpr64_gpr, REG) (void)
96 { 98 {
97 env->gpr[REG] = T2_64; 99 env->gpr[REG] = T2_64;
  100 + env->gprh[REG] = T2_64 >> 32;
98 RETURN(); 101 RETURN();
99 } 102 }
100 #endif 103 #endif
101 -#endif /* defined(TARGET_PPCEMB) */ 104 +#endif /* TARGET_GPR_BITS < 64 */
102 105
103 /* Altivec registers moves */ 106 /* Altivec registers moves */
104 void OPPROTO glue(op_load_avr_A0_avr, REG) (void) 107 void OPPROTO glue(op_load_avr_A0_avr, REG) (void)
target-ppc/translate.c
@@ -162,9 +162,7 @@ typedef struct DisasContext { @@ -162,9 +162,7 @@ typedef struct DisasContext {
162 #endif 162 #endif
163 int fpu_enabled; 163 int fpu_enabled;
164 int altivec_enabled; 164 int altivec_enabled;
165 -#if defined(TARGET_PPCEMB)  
166 int spe_enabled; 165 int spe_enabled;
167 -#endif  
168 ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */ 166 ppc_spr_t *spr_cb; /* Needed to check rights for mfspr/mtspr */
169 int singlestep_enabled; 167 int singlestep_enabled;
170 int dcache_line_size; 168 int dcache_line_size;
@@ -5821,10 +5819,11 @@ GEN_VR_STX(vx, 0x07, 0x07); @@ -5821,10 +5819,11 @@ GEN_VR_STX(vx, 0x07, 0x07);
5821 #define gen_op_vr_stvxl gen_op_vr_stvx 5819 #define gen_op_vr_stvxl gen_op_vr_stvx
5822 GEN_VR_STX(vxl, 0x07, 0x0F); 5820 GEN_VR_STX(vxl, 0x07, 0x0F);
5823 5821
5824 -#if defined(TARGET_PPCEMB)  
5825 /*** SPE extension ***/ 5822 /*** SPE extension ***/
5826 5823
5827 /* Register moves */ 5824 /* Register moves */
  5825 +#if TARGET_GPR_BITS < 64
  5826 +
5828 GEN32(gen_op_load_gpr64_T0, gen_op_load_gpr64_T0_gpr); 5827 GEN32(gen_op_load_gpr64_T0, gen_op_load_gpr64_T0_gpr);
5829 GEN32(gen_op_load_gpr64_T1, gen_op_load_gpr64_T1_gpr); 5828 GEN32(gen_op_load_gpr64_T1, gen_op_load_gpr64_T1_gpr);
5830 #if 0 // unused 5829 #if 0 // unused
@@ -5837,6 +5836,23 @@ GEN32(gen_op_store_T1_gpr64, gen_op_store_T1_gpr64_gpr); @@ -5837,6 +5836,23 @@ GEN32(gen_op_store_T1_gpr64, gen_op_store_T1_gpr64_gpr);
5837 GEN32(gen_op_store_T2_gpr64, gen_op_store_T2_gpr64_gpr); 5836 GEN32(gen_op_store_T2_gpr64, gen_op_store_T2_gpr64_gpr);
5838 #endif 5837 #endif
5839 5838
  5839 +#else /* TARGET_GPR_BITS < 64 */
  5840 +
  5841 +/* No specific load/store functions: GPRs are already 64 bits */
  5842 +#define gen_op_load_gpr64_T0 gen_op_load_gpr_T0
  5843 +#define gen_op_load_gpr64_T1 gen_op_load_gpr_T1
  5844 +#if 0 // unused
  5845 +#define gen_op_load_gpr64_T2 gen_op_load_gpr_T2
  5846 +#endif
  5847 +
  5848 +#define gen_op_store_T0_gpr64 gen_op_store_T0_gpr
  5849 +#define gen_op_store_T1_gpr64 gen_op_store_T1_gpr
  5850 +#if 0 // unused
  5851 +#define gen_op_store_T2_gpr64 gen_op_store_T2_gpr
  5852 +#endif
  5853 +
  5854 +#endif /* TARGET_GPR_BITS < 64 */
  5855 +
5840 #define GEN_SPE(name0, name1, opc2, opc3, inval, type) \ 5856 #define GEN_SPE(name0, name1, opc2, opc3, inval, type) \
5841 GEN_HANDLER(name0##_##name1, 0x04, opc2, opc3, inval, type) \ 5857 GEN_HANDLER(name0##_##name1, 0x04, opc2, opc3, inval, type) \
5842 { \ 5858 { \
@@ -6105,10 +6121,10 @@ GEN_SPEOP_ARITH1(evcntlsw); @@ -6105,10 +6121,10 @@ GEN_SPEOP_ARITH1(evcntlsw);
6105 static always_inline void gen_brinc (DisasContext *ctx) 6121 static always_inline void gen_brinc (DisasContext *ctx)
6106 { 6122 {
6107 /* Note: brinc is usable even if SPE is disabled */ 6123 /* Note: brinc is usable even if SPE is disabled */
6108 - gen_op_load_gpr64_T0(rA(ctx->opcode));  
6109 - gen_op_load_gpr64_T1(rB(ctx->opcode)); 6124 + gen_op_load_gpr_T0(rA(ctx->opcode));
  6125 + gen_op_load_gpr_T1(rB(ctx->opcode));
6110 gen_op_brinc(); 6126 gen_op_brinc();
6111 - gen_op_store_T0_gpr64(rD(ctx->opcode)); 6127 + gen_op_store_T0_gpr(rD(ctx->opcode));
6112 } 6128 }
6113 6129
6114 #define GEN_SPEOP_ARITH_IMM2(name) \ 6130 #define GEN_SPEOP_ARITH_IMM2(name) \
@@ -6242,6 +6258,12 @@ GEN_HANDLER2(evsel3, &quot;evsel&quot;, 0x04, 0x1f, 0x09, 0x00000000, PPC_SPE) @@ -6242,6 +6258,12 @@ GEN_HANDLER2(evsel3, &quot;evsel&quot;, 0x04, 0x1f, 0x09, 0x00000000, PPC_SPE)
6242 #define gen_op_spe_stdd_le_raw gen_op_std_le_raw 6258 #define gen_op_spe_stdd_le_raw gen_op_std_le_raw
6243 #define gen_op_spe_stdd_le_64_raw gen_op_std_le_64_raw 6259 #define gen_op_spe_stdd_le_64_raw gen_op_std_le_64_raw
6244 #else /* defined(CONFIG_USER_ONLY) */ 6260 #else /* defined(CONFIG_USER_ONLY) */
  6261 +#if defined(TARGET_PPC64H)
  6262 +#define gen_op_spe_ldd_hypv gen_op_ld_hypv
  6263 +#define gen_op_spe_ldd_64_hypv gen_op_ld_64_hypv
  6264 +#define gen_op_spe_ldd_le_hypv gen_op_ld_hypv
  6265 +#define gen_op_spe_ldd_le_64_hypv gen_op_ld_64_hypv
  6266 +#endif
6245 #define gen_op_spe_ldd_kernel gen_op_ld_kernel 6267 #define gen_op_spe_ldd_kernel gen_op_ld_kernel
6246 #define gen_op_spe_ldd_64_kernel gen_op_ld_64_kernel 6268 #define gen_op_spe_ldd_64_kernel gen_op_ld_64_kernel
6247 #define gen_op_spe_ldd_le_kernel gen_op_ld_kernel 6269 #define gen_op_spe_ldd_le_kernel gen_op_ld_kernel
@@ -6250,6 +6272,12 @@ GEN_HANDLER2(evsel3, &quot;evsel&quot;, 0x04, 0x1f, 0x09, 0x00000000, PPC_SPE) @@ -6250,6 +6272,12 @@ GEN_HANDLER2(evsel3, &quot;evsel&quot;, 0x04, 0x1f, 0x09, 0x00000000, PPC_SPE)
6250 #define gen_op_spe_ldd_64_user gen_op_ld_64_user 6272 #define gen_op_spe_ldd_64_user gen_op_ld_64_user
6251 #define gen_op_spe_ldd_le_user gen_op_ld_le_user 6273 #define gen_op_spe_ldd_le_user gen_op_ld_le_user
6252 #define gen_op_spe_ldd_le_64_user gen_op_ld_le_64_user 6274 #define gen_op_spe_ldd_le_64_user gen_op_ld_le_64_user
  6275 +#if defined(TARGET_PPC64H)
  6276 +#define gen_op_spe_stdd_hypv gen_op_std_hypv
  6277 +#define gen_op_spe_stdd_64_hypv gen_op_std_64_hypv
  6278 +#define gen_op_spe_stdd_le_hypv gen_op_std_hypv
  6279 +#define gen_op_spe_stdd_le_64_hypv gen_op_std_64_hypv
  6280 +#endif
6253 #define gen_op_spe_stdd_kernel gen_op_std_kernel 6281 #define gen_op_spe_stdd_kernel gen_op_std_kernel
6254 #define gen_op_spe_stdd_64_kernel gen_op_std_64_kernel 6282 #define gen_op_spe_stdd_64_kernel gen_op_std_64_kernel
6255 #define gen_op_spe_stdd_le_kernel gen_op_std_kernel 6283 #define gen_op_spe_stdd_le_kernel gen_op_std_kernel
@@ -6284,6 +6312,12 @@ GEN_SPEOP_ST(who, 2); @@ -6284,6 +6312,12 @@ GEN_SPEOP_ST(who, 2);
6284 #define gen_op_spe_stwwo_le_kernel gen_op_stw_le_kernel 6312 #define gen_op_spe_stwwo_le_kernel gen_op_stw_le_kernel
6285 #define gen_op_spe_stwwo_64_kernel gen_op_stw_64_kernel 6313 #define gen_op_spe_stwwo_64_kernel gen_op_stw_64_kernel
6286 #define gen_op_spe_stwwo_le_64_kernel gen_op_stw_le_64_kernel 6314 #define gen_op_spe_stwwo_le_64_kernel gen_op_stw_le_64_kernel
  6315 +#if defined(TARGET_PPC64H)
  6316 +#define gen_op_spe_stwwo_hypv gen_op_stw_hypv
  6317 +#define gen_op_spe_stwwo_le_hypv gen_op_stw_le_hypv
  6318 +#define gen_op_spe_stwwo_64_hypv gen_op_stw_64_hypv
  6319 +#define gen_op_spe_stwwo_le_64_hypv gen_op_stw_le_64_hypv
  6320 +#endif
6287 #endif 6321 #endif
6288 #endif 6322 #endif
6289 #define _GEN_OP_SPE_STWWE(suffix) \ 6323 #define _GEN_OP_SPE_STWWE(suffix) \
@@ -6320,6 +6354,9 @@ _GEN_OP_SPE_STWWE_LE(suffix) @@ -6320,6 +6354,9 @@ _GEN_OP_SPE_STWWE_LE(suffix)
6320 #if defined(CONFIG_USER_ONLY) 6354 #if defined(CONFIG_USER_ONLY)
6321 GEN_OP_SPE_STWWE(raw); 6355 GEN_OP_SPE_STWWE(raw);
6322 #else /* defined(CONFIG_USER_ONLY) */ 6356 #else /* defined(CONFIG_USER_ONLY) */
  6357 +#if defined(TARGET_PPC64H)
  6358 +GEN_OP_SPE_STWWE(hypv);
  6359 +#endif
6323 GEN_OP_SPE_STWWE(kernel); 6360 GEN_OP_SPE_STWWE(kernel);
6324 GEN_OP_SPE_STWWE(user); 6361 GEN_OP_SPE_STWWE(user);
6325 #endif /* defined(CONFIG_USER_ONLY) */ 6362 #endif /* defined(CONFIG_USER_ONLY) */
@@ -6371,45 +6408,105 @@ GEN_OP_SPE_LHX(le_64_raw); @@ -6371,45 +6408,105 @@ GEN_OP_SPE_LHX(le_64_raw);
6371 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, le_64_raw); 6408 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, le_64_raw);
6372 #endif 6409 #endif
6373 #else 6410 #else
  6411 +#if defined(TARGET_PPC64H)
  6412 +GEN_OP_SPE_LHE(hypv);
  6413 +#endif
6374 GEN_OP_SPE_LHE(kernel); 6414 GEN_OP_SPE_LHE(kernel);
6375 GEN_OP_SPE_LHE(user); 6415 GEN_OP_SPE_LHE(user);
  6416 +#if defined(TARGET_PPC64H)
  6417 +GEN_SPE_LDSPLAT(hhesplat, spe_lhe, hypv);
  6418 +#endif
6376 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, kernel); 6419 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, kernel);
6377 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, user); 6420 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, user);
  6421 +#if defined(TARGET_PPC64H)
  6422 +GEN_OP_SPE_LHE(le_hypv);
  6423 +#endif
6378 GEN_OP_SPE_LHE(le_kernel); 6424 GEN_OP_SPE_LHE(le_kernel);
6379 GEN_OP_SPE_LHE(le_user); 6425 GEN_OP_SPE_LHE(le_user);
  6426 +#if defined(TARGET_PPC64H)
  6427 +GEN_SPE_LDSPLAT(hhesplat, spe_lhe, le_hypv);
  6428 +#endif
6380 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, le_kernel); 6429 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, le_kernel);
6381 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, le_user); 6430 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, le_user);
  6431 +#if defined(TARGET_PPC64H)
  6432 +GEN_SPE_LDSPLAT(hhousplat, spe_lh, hypv);
  6433 +#endif
6382 GEN_SPE_LDSPLAT(hhousplat, spe_lh, kernel); 6434 GEN_SPE_LDSPLAT(hhousplat, spe_lh, kernel);
6383 GEN_SPE_LDSPLAT(hhousplat, spe_lh, user); 6435 GEN_SPE_LDSPLAT(hhousplat, spe_lh, user);
  6436 +#if defined(TARGET_PPC64H)
  6437 +GEN_SPE_LDSPLAT(hhousplat, spe_lh, le_hypv);
  6438 +#endif
6384 GEN_SPE_LDSPLAT(hhousplat, spe_lh, le_kernel); 6439 GEN_SPE_LDSPLAT(hhousplat, spe_lh, le_kernel);
6385 GEN_SPE_LDSPLAT(hhousplat, spe_lh, le_user); 6440 GEN_SPE_LDSPLAT(hhousplat, spe_lh, le_user);
  6441 +#if defined(TARGET_PPC64H)
  6442 +GEN_OP_SPE_LHX(hypv);
  6443 +#endif
6386 GEN_OP_SPE_LHX(kernel); 6444 GEN_OP_SPE_LHX(kernel);
6387 GEN_OP_SPE_LHX(user); 6445 GEN_OP_SPE_LHX(user);
  6446 +#if defined(TARGET_PPC64H)
  6447 +GEN_SPE_LDSPLAT(hhossplat, spe_lhx, hypv);
  6448 +#endif
6388 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, kernel); 6449 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, kernel);
6389 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, user); 6450 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, user);
  6451 +#if defined(TARGET_PPC64H)
  6452 +GEN_OP_SPE_LHX(le_hypv);
  6453 +#endif
6390 GEN_OP_SPE_LHX(le_kernel); 6454 GEN_OP_SPE_LHX(le_kernel);
6391 GEN_OP_SPE_LHX(le_user); 6455 GEN_OP_SPE_LHX(le_user);
  6456 +#if defined(TARGET_PPC64H)
  6457 +GEN_SPE_LDSPLAT(hhossplat, spe_lhx, le_hypv);
  6458 +#endif
6392 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, le_kernel); 6459 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, le_kernel);
6393 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, le_user); 6460 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, le_user);
6394 #if defined(TARGET_PPC64) 6461 #if defined(TARGET_PPC64)
  6462 +#if defined(TARGET_PPC64H)
  6463 +GEN_OP_SPE_LHE(64_hypv);
  6464 +#endif
6395 GEN_OP_SPE_LHE(64_kernel); 6465 GEN_OP_SPE_LHE(64_kernel);
6396 GEN_OP_SPE_LHE(64_user); 6466 GEN_OP_SPE_LHE(64_user);
  6467 +#if defined(TARGET_PPC64H)
  6468 +GEN_SPE_LDSPLAT(hhesplat, spe_lhe, 64_hypv);
  6469 +#endif
6397 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, 64_kernel); 6470 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, 64_kernel);
6398 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, 64_user); 6471 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, 64_user);
  6472 +#if defined(TARGET_PPC64H)
  6473 +GEN_OP_SPE_LHE(le_64_hypv);
  6474 +#endif
6399 GEN_OP_SPE_LHE(le_64_kernel); 6475 GEN_OP_SPE_LHE(le_64_kernel);
6400 GEN_OP_SPE_LHE(le_64_user); 6476 GEN_OP_SPE_LHE(le_64_user);
  6477 +#if defined(TARGET_PPC64H)
  6478 +GEN_SPE_LDSPLAT(hhesplat, spe_lhe, le_64_hypv);
  6479 +#endif
6401 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, le_64_kernel); 6480 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, le_64_kernel);
6402 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, le_64_user); 6481 GEN_SPE_LDSPLAT(hhesplat, spe_lhe, le_64_user);
  6482 +#if defined(TARGET_PPC64H)
  6483 +GEN_SPE_LDSPLAT(hhousplat, spe_lh, 64_hypv);
  6484 +#endif
6403 GEN_SPE_LDSPLAT(hhousplat, spe_lh, 64_kernel); 6485 GEN_SPE_LDSPLAT(hhousplat, spe_lh, 64_kernel);
6404 GEN_SPE_LDSPLAT(hhousplat, spe_lh, 64_user); 6486 GEN_SPE_LDSPLAT(hhousplat, spe_lh, 64_user);
  6487 +#if defined(TARGET_PPC64H)
  6488 +GEN_SPE_LDSPLAT(hhousplat, spe_lh, le_64_hypv);
  6489 +#endif
6405 GEN_SPE_LDSPLAT(hhousplat, spe_lh, le_64_kernel); 6490 GEN_SPE_LDSPLAT(hhousplat, spe_lh, le_64_kernel);
6406 GEN_SPE_LDSPLAT(hhousplat, spe_lh, le_64_user); 6491 GEN_SPE_LDSPLAT(hhousplat, spe_lh, le_64_user);
  6492 +#if defined(TARGET_PPC64H)
  6493 +GEN_OP_SPE_LHX(64_hypv);
  6494 +#endif
6407 GEN_OP_SPE_LHX(64_kernel); 6495 GEN_OP_SPE_LHX(64_kernel);
6408 GEN_OP_SPE_LHX(64_user); 6496 GEN_OP_SPE_LHX(64_user);
  6497 +#if defined(TARGET_PPC64H)
  6498 +GEN_SPE_LDSPLAT(hhossplat, spe_lhx, 64_hypv);
  6499 +#endif
6409 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, 64_kernel); 6500 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, 64_kernel);
6410 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, 64_user); 6501 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, 64_user);
  6502 +#if defined(TARGET_PPC64H)
  6503 +GEN_OP_SPE_LHX(le_64_hypv);
  6504 +#endif
6411 GEN_OP_SPE_LHX(le_64_kernel); 6505 GEN_OP_SPE_LHX(le_64_kernel);
6412 GEN_OP_SPE_LHX(le_64_user); 6506 GEN_OP_SPE_LHX(le_64_user);
  6507 +#if defined(TARGET_PPC64H)
  6508 +GEN_SPE_LDSPLAT(hhossplat, spe_lhx, le_64_hypv);
  6509 +#endif
6413 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, le_64_kernel); 6510 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, le_64_kernel);
6414 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, le_64_user); 6511 GEN_SPE_LDSPLAT(hhossplat, spe_lhx, le_64_user);
6415 #endif 6512 #endif
@@ -6663,7 +6760,6 @@ GEN_SPE(efdctuiz, speundef, 0x1C, 0x0B, 0x00180000, PPC_SPEFPU); // @@ -6663,7 +6760,6 @@ GEN_SPE(efdctuiz, speundef, 0x1C, 0x0B, 0x00180000, PPC_SPEFPU); //
6663 GEN_SPE(efdctsiz, speundef, 0x1D, 0x0B, 0x00180000, PPC_SPEFPU); // 6760 GEN_SPE(efdctsiz, speundef, 0x1D, 0x0B, 0x00180000, PPC_SPEFPU); //
6664 GEN_SPE(efdtstgt, efdtstlt, 0x1E, 0x0B, 0x00600000, PPC_SPEFPU); // 6761 GEN_SPE(efdtstgt, efdtstlt, 0x1E, 0x0B, 0x00600000, PPC_SPEFPU); //
6665 GEN_SPE(efdtsteq, speundef, 0x1F, 0x0B, 0x00600000, PPC_SPEFPU); // 6762 GEN_SPE(efdtsteq, speundef, 0x1F, 0x0B, 0x00600000, PPC_SPEFPU); //
6666 -#endif  
6667 6763
6668 /* End opcode list */ 6764 /* End opcode list */
6669 GEN_OPCODE_MARK(end); 6765 GEN_OPCODE_MARK(end);
@@ -6830,12 +6926,10 @@ static always_inline int gen_intermediate_code_internal (CPUState *env, @@ -6830,12 +6926,10 @@ static always_inline int gen_intermediate_code_internal (CPUState *env,
6830 #endif 6926 #endif
6831 ctx.dcache_line_size = env->dcache_line_size; 6927 ctx.dcache_line_size = env->dcache_line_size;
6832 ctx.fpu_enabled = msr_fp; 6928 ctx.fpu_enabled = msr_fp;
6833 -#if defined(TARGET_PPCEMB)  
6834 if ((env->flags & POWERPC_FLAG_SPE) && msr_spe) 6929 if ((env->flags & POWERPC_FLAG_SPE) && msr_spe)
6835 ctx.spe_enabled = msr_spe; 6930 ctx.spe_enabled = msr_spe;
6836 else 6931 else
6837 ctx.spe_enabled = 0; 6932 ctx.spe_enabled = 0;
6838 -#endif  
6839 if ((env->flags & POWERPC_FLAG_VRE) && msr_vr) 6933 if ((env->flags & POWERPC_FLAG_VRE) && msr_vr)
6840 ctx.altivec_enabled = msr_vr; 6934 ctx.altivec_enabled = msr_vr;
6841 else 6935 else