target-ppc: Model SPE floating-point instructions more accurately
Single-precision and double-precision floating-point instructions should be separated into their own categories, since some chips only support single-precision instructions. Signed-off-by: Nathan Froyd <froydnj@codesourcery.com> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6575 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
		
							parent
							
								
									071fc3b1cd
								
							
						
					
					
						commit
						40569b7edc
					
				| @ -509,8 +509,10 @@ enum { | ||||
|     PPC_ALTIVEC        = 0x0000000001000000ULL, | ||||
|     /*   PowerPC 2.03 SPE extension                                          */ | ||||
|     PPC_SPE            = 0x0000000002000000ULL, | ||||
|     /*   PowerPC 2.03 SPE floating-point extension                           */ | ||||
|     PPC_SPEFPU         = 0x0000000004000000ULL, | ||||
|     /*   PowerPC 2.03 SPE single-precision floating-point extension          */ | ||||
|     PPC_SPE_SINGLE     = 0x0000000004000000ULL, | ||||
|     /*   PowerPC 2.03 SPE double-precision floating-point extension          */ | ||||
|     PPC_SPE_DOUBLE     = 0x0000000008000000ULL, | ||||
| 
 | ||||
|     /* Optional memory control instructions                                  */ | ||||
|     PPC_MEM_TLBIA      = 0x0000000010000000ULL, | ||||
| @ -7886,20 +7888,20 @@ GEN_SPEFPUOP_COMP_64(evfststlt); | ||||
| GEN_SPEFPUOP_COMP_64(evfststeq); | ||||
| 
 | ||||
| /* Opcodes definitions */ | ||||
| GEN_SPE(evfsadd,        evfssub,       0x00, 0x0A, 0x00000000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfsabs,        evfsnabs,      0x02, 0x0A, 0x0000F800, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfsneg,        speundef,      0x03, 0x0A, 0x0000F800, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfsmul,        evfsdiv,       0x04, 0x0A, 0x00000000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfscmpgt,      evfscmplt,     0x06, 0x0A, 0x00600000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfscmpeq,      speundef,      0x07, 0x0A, 0x00600000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfscfui,       evfscfsi,      0x08, 0x0A, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfscfuf,       evfscfsf,      0x09, 0x0A, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfsctui,       evfsctsi,      0x0A, 0x0A, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfsctuf,       evfsctsf,      0x0B, 0x0A, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfsctuiz,      speundef,      0x0C, 0x0A, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfsctsiz,      speundef,      0x0D, 0x0A, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfststgt,      evfststlt,     0x0E, 0x0A, 0x00600000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfststeq,      speundef,      0x0F, 0x0A, 0x00600000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(evfsadd,        evfssub,       0x00, 0x0A, 0x00000000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfsabs,        evfsnabs,      0x02, 0x0A, 0x0000F800, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfsneg,        speundef,      0x03, 0x0A, 0x0000F800, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfsmul,        evfsdiv,       0x04, 0x0A, 0x00000000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfscmpgt,      evfscmplt,     0x06, 0x0A, 0x00600000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfscmpeq,      speundef,      0x07, 0x0A, 0x00600000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfscfui,       evfscfsi,      0x08, 0x0A, 0x00180000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfscfuf,       evfscfsf,      0x09, 0x0A, 0x00180000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfsctui,       evfsctsi,      0x0A, 0x0A, 0x00180000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfsctuf,       evfsctsf,      0x0B, 0x0A, 0x00180000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfsctuiz,      speundef,      0x0C, 0x0A, 0x00180000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfsctsiz,      speundef,      0x0D, 0x0A, 0x00180000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfststgt,      evfststlt,     0x0E, 0x0A, 0x00600000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(evfststeq,      speundef,      0x0F, 0x0A, 0x00600000, PPC_SPE_SINGLE); //
 | ||||
| 
 | ||||
| /* Single precision floating-point operations */ | ||||
| /* Arithmetic */ | ||||
| @ -7954,20 +7956,20 @@ GEN_SPEFPUOP_COMP_32(efststlt); | ||||
| GEN_SPEFPUOP_COMP_32(efststeq); | ||||
| 
 | ||||
| /* Opcodes definitions */ | ||||
| GEN_SPE(efsadd,         efssub,        0x00, 0x0B, 0x00000000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efsabs,         efsnabs,       0x02, 0x0B, 0x0000F800, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efsneg,         speundef,      0x03, 0x0B, 0x0000F800, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efsmul,         efsdiv,        0x04, 0x0B, 0x00000000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efscmpgt,       efscmplt,      0x06, 0x0B, 0x00600000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efscmpeq,       efscfd,        0x07, 0x0B, 0x00600000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efscfui,        efscfsi,       0x08, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efscfuf,        efscfsf,       0x09, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efsctui,        efsctsi,       0x0A, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efsctuf,        efsctsf,       0x0B, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efsctuiz,       speundef,      0x0C, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efsctsiz,       speundef,      0x0D, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efststgt,       efststlt,      0x0E, 0x0B, 0x00600000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efststeq,       speundef,      0x0F, 0x0B, 0x00600000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efsadd,         efssub,        0x00, 0x0B, 0x00000000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efsabs,         efsnabs,       0x02, 0x0B, 0x0000F800, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efsneg,         speundef,      0x03, 0x0B, 0x0000F800, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efsmul,         efsdiv,        0x04, 0x0B, 0x00000000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efscmpgt,       efscmplt,      0x06, 0x0B, 0x00600000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efscmpeq,       efscfd,        0x07, 0x0B, 0x00600000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efscfui,        efscfsi,       0x08, 0x0B, 0x00180000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efscfuf,        efscfsf,       0x09, 0x0B, 0x00180000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efsctui,        efsctsi,       0x0A, 0x0B, 0x00180000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efsctuf,        efsctsf,       0x0B, 0x0B, 0x00180000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efsctuiz,       speundef,      0x0C, 0x0B, 0x00180000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efsctsiz,       speundef,      0x0D, 0x0B, 0x00180000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efststgt,       efststlt,      0x0E, 0x0B, 0x00600000, PPC_SPE_SINGLE); //
 | ||||
| GEN_SPE(efststeq,       speundef,      0x0F, 0x0B, 0x00600000, PPC_SPE_SINGLE); //
 | ||||
| 
 | ||||
| /* Double precision floating-point operations */ | ||||
| /* Arithmetic */ | ||||
| @ -8038,22 +8040,22 @@ GEN_SPEFPUOP_COMP_64(efdtstlt); | ||||
| GEN_SPEFPUOP_COMP_64(efdtsteq); | ||||
| 
 | ||||
| /* Opcodes definitions */ | ||||
| GEN_SPE(efdadd,         efdsub,        0x10, 0x0B, 0x00000000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdcfuid,       efdcfsid,      0x11, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdabs,         efdnabs,       0x12, 0x0B, 0x0000F800, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdneg,         speundef,      0x13, 0x0B, 0x0000F800, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdmul,         efddiv,        0x14, 0x0B, 0x00000000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdctuidz,      efdctsidz,     0x15, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdcmpgt,       efdcmplt,      0x16, 0x0B, 0x00600000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdcmpeq,       efdcfs,        0x17, 0x0B, 0x00600000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdcfui,        efdcfsi,       0x18, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdcfuf,        efdcfsf,       0x19, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdctui,        efdctsi,       0x1A, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdctuf,        efdctsf,       0x1B, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdctuiz,       speundef,      0x1C, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdctsiz,       speundef,      0x1D, 0x0B, 0x00180000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdtstgt,       efdtstlt,      0x1E, 0x0B, 0x00600000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdtsteq,       speundef,      0x1F, 0x0B, 0x00600000, PPC_SPEFPU); //
 | ||||
| GEN_SPE(efdadd,         efdsub,        0x10, 0x0B, 0x00000000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdcfuid,       efdcfsid,      0x11, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdabs,         efdnabs,       0x12, 0x0B, 0x0000F800, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdneg,         speundef,      0x13, 0x0B, 0x0000F800, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdmul,         efddiv,        0x14, 0x0B, 0x00000000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdctuidz,      efdctsidz,     0x15, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdcmpgt,       efdcmplt,      0x16, 0x0B, 0x00600000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdcmpeq,       efdcfs,        0x17, 0x0B, 0x00600000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdcfui,        efdcfsi,       0x18, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdcfuf,        efdcfsf,       0x19, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdctui,        efdctsi,       0x1A, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdctuf,        efdctsf,       0x1B, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdctuiz,       speundef,      0x1C, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdctsiz,       speundef,      0x1D, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdtstgt,       efdtstlt,      0x1E, 0x0B, 0x00600000, PPC_SPE_DOUBLE); //
 | ||||
| GEN_SPE(efdtsteq,       speundef,      0x1F, 0x0B, 0x00600000, PPC_SPE_DOUBLE); //
 | ||||
| 
 | ||||
| /* End opcode list */ | ||||
| GEN_OPCODE_MARK(end); | ||||
|  | ||||
| @ -3984,7 +3984,7 @@ static void init_proc_G2LE (CPUPPCState *env) | ||||
|  * all SPE multiply-accumulate instructions | ||||
|  */ | ||||
| #define POWERPC_INSNS_e200   (PPC_INSNS_BASE | PPC_ISEL |                     \ | ||||
|                               PPC_SPE | PPC_SPEFPU |                          \ | ||||
|                               PPC_SPE | PPC_SPE_SINGLE |                      \ | ||||
|                               PPC_WRTEE | PPC_RFDI |                          \ | ||||
|                               PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |   \ | ||||
|                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \ | ||||
| @ -4147,13 +4147,13 @@ static void init_proc_e300 (CPUPPCState *env) | ||||
|     ppc6xx_irq_init(env); | ||||
| } | ||||
| 
 | ||||
| /* e500 core                                                                 */ | ||||
| #define POWERPC_INSNS_e500   (PPC_INSNS_BASE | PPC_ISEL |                     \ | ||||
|                               PPC_SPE | PPC_SPEFPU |                          \ | ||||
|                               PPC_WRTEE | PPC_RFDI |                          \ | ||||
|                               PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |   \ | ||||
|                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \ | ||||
|                               PPC_MEM_TLBSYNC | PPC_TLBIVAX |                 \ | ||||
| /* e500 core                                                               */ | ||||
| #define POWERPC_INSNS_e500   (PPC_INSNS_BASE | PPC_ISEL |             \ | ||||
|                               PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE |   \ | ||||
|                               PPC_WRTEE | PPC_RFDI |                  \ | ||||
|                               PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | \ | ||||
|                               PPC_CACHE_DCBZ | PPC_CACHE_DCBA |       \ | ||||
|                               PPC_MEM_TLBSYNC | PPC_TLBIVAX |         \ | ||||
|                               PPC_BOOKE) | ||||
| #define POWERPC_MSRM_e500    (0x000000000606FF30ULL) | ||||
| #define POWERPC_MMU_e500     (POWERPC_MMU_BOOKE_FSL) | ||||
| @ -9431,7 +9431,7 @@ int cpu_ppc_register_internal (CPUPPCState *env, const ppc_def_t *def) | ||||
|         gdb_register_coprocessor(env, gdb_get_avr_reg, gdb_set_avr_reg, | ||||
|                                  34, "power-altivec.xml", 0); | ||||
|     } | ||||
|     if ((def->insns_flags & PPC_SPE) | (def->insns_flags & PPC_SPEFPU)) { | ||||
|     if (def->insns_flags & PPC_SPE) { | ||||
|         gdb_register_coprocessor(env, gdb_get_spe_reg, gdb_set_spe_reg, | ||||
|                                  34, "power-spe.xml", 0); | ||||
|     } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 aurel32
						aurel32