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,
 | 
					    PPC_ALTIVEC        = 0x0000000001000000ULL,
 | 
				
			||||||
    /*   PowerPC 2.03 SPE extension                                          */
 | 
					    /*   PowerPC 2.03 SPE extension                                          */
 | 
				
			||||||
    PPC_SPE            = 0x0000000002000000ULL,
 | 
					    PPC_SPE            = 0x0000000002000000ULL,
 | 
				
			||||||
    /*   PowerPC 2.03 SPE floating-point extension                           */
 | 
					    /*   PowerPC 2.03 SPE single-precision floating-point extension          */
 | 
				
			||||||
    PPC_SPEFPU         = 0x0000000004000000ULL,
 | 
					    PPC_SPE_SINGLE     = 0x0000000004000000ULL,
 | 
				
			||||||
 | 
					    /*   PowerPC 2.03 SPE double-precision floating-point extension          */
 | 
				
			||||||
 | 
					    PPC_SPE_DOUBLE     = 0x0000000008000000ULL,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Optional memory control instructions                                  */
 | 
					    /* Optional memory control instructions                                  */
 | 
				
			||||||
    PPC_MEM_TLBIA      = 0x0000000010000000ULL,
 | 
					    PPC_MEM_TLBIA      = 0x0000000010000000ULL,
 | 
				
			||||||
@ -7886,20 +7888,20 @@ GEN_SPEFPUOP_COMP_64(evfststlt);
 | 
				
			|||||||
GEN_SPEFPUOP_COMP_64(evfststeq);
 | 
					GEN_SPEFPUOP_COMP_64(evfststeq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Opcodes definitions */
 | 
					/* Opcodes definitions */
 | 
				
			||||||
GEN_SPE(evfsadd,        evfssub,       0x00, 0x0A, 0x00000000, PPC_SPEFPU); //
 | 
					GEN_SPE(evfsadd,        evfssub,       0x00, 0x0A, 0x00000000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfsabs,        evfsnabs,      0x02, 0x0A, 0x0000F800, PPC_SPEFPU); //
 | 
					GEN_SPE(evfsabs,        evfsnabs,      0x02, 0x0A, 0x0000F800, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfsneg,        speundef,      0x03, 0x0A, 0x0000F800, PPC_SPEFPU); //
 | 
					GEN_SPE(evfsneg,        speundef,      0x03, 0x0A, 0x0000F800, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfsmul,        evfsdiv,       0x04, 0x0A, 0x00000000, PPC_SPEFPU); //
 | 
					GEN_SPE(evfsmul,        evfsdiv,       0x04, 0x0A, 0x00000000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfscmpgt,      evfscmplt,     0x06, 0x0A, 0x00600000, PPC_SPEFPU); //
 | 
					GEN_SPE(evfscmpgt,      evfscmplt,     0x06, 0x0A, 0x00600000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfscmpeq,      speundef,      0x07, 0x0A, 0x00600000, PPC_SPEFPU); //
 | 
					GEN_SPE(evfscmpeq,      speundef,      0x07, 0x0A, 0x00600000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfscfui,       evfscfsi,      0x08, 0x0A, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(evfscfui,       evfscfsi,      0x08, 0x0A, 0x00180000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfscfuf,       evfscfsf,      0x09, 0x0A, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(evfscfuf,       evfscfsf,      0x09, 0x0A, 0x00180000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfsctui,       evfsctsi,      0x0A, 0x0A, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(evfsctui,       evfsctsi,      0x0A, 0x0A, 0x00180000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfsctuf,       evfsctsf,      0x0B, 0x0A, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(evfsctuf,       evfsctsf,      0x0B, 0x0A, 0x00180000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfsctuiz,      speundef,      0x0C, 0x0A, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(evfsctuiz,      speundef,      0x0C, 0x0A, 0x00180000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfsctsiz,      speundef,      0x0D, 0x0A, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(evfsctsiz,      speundef,      0x0D, 0x0A, 0x00180000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfststgt,      evfststlt,     0x0E, 0x0A, 0x00600000, PPC_SPEFPU); //
 | 
					GEN_SPE(evfststgt,      evfststlt,     0x0E, 0x0A, 0x00600000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(evfststeq,      speundef,      0x0F, 0x0A, 0x00600000, PPC_SPEFPU); //
 | 
					GEN_SPE(evfststeq,      speundef,      0x0F, 0x0A, 0x00600000, PPC_SPE_SINGLE); //
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Single precision floating-point operations */
 | 
					/* Single precision floating-point operations */
 | 
				
			||||||
/* Arithmetic */
 | 
					/* Arithmetic */
 | 
				
			||||||
@ -7954,20 +7956,20 @@ GEN_SPEFPUOP_COMP_32(efststlt);
 | 
				
			|||||||
GEN_SPEFPUOP_COMP_32(efststeq);
 | 
					GEN_SPEFPUOP_COMP_32(efststeq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Opcodes definitions */
 | 
					/* Opcodes definitions */
 | 
				
			||||||
GEN_SPE(efsadd,         efssub,        0x00, 0x0B, 0x00000000, PPC_SPEFPU); //
 | 
					GEN_SPE(efsadd,         efssub,        0x00, 0x0B, 0x00000000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efsabs,         efsnabs,       0x02, 0x0B, 0x0000F800, PPC_SPEFPU); //
 | 
					GEN_SPE(efsabs,         efsnabs,       0x02, 0x0B, 0x0000F800, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efsneg,         speundef,      0x03, 0x0B, 0x0000F800, PPC_SPEFPU); //
 | 
					GEN_SPE(efsneg,         speundef,      0x03, 0x0B, 0x0000F800, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efsmul,         efsdiv,        0x04, 0x0B, 0x00000000, PPC_SPEFPU); //
 | 
					GEN_SPE(efsmul,         efsdiv,        0x04, 0x0B, 0x00000000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efscmpgt,       efscmplt,      0x06, 0x0B, 0x00600000, PPC_SPEFPU); //
 | 
					GEN_SPE(efscmpgt,       efscmplt,      0x06, 0x0B, 0x00600000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efscmpeq,       efscfd,        0x07, 0x0B, 0x00600000, PPC_SPEFPU); //
 | 
					GEN_SPE(efscmpeq,       efscfd,        0x07, 0x0B, 0x00600000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efscfui,        efscfsi,       0x08, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efscfui,        efscfsi,       0x08, 0x0B, 0x00180000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efscfuf,        efscfsf,       0x09, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efscfuf,        efscfsf,       0x09, 0x0B, 0x00180000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efsctui,        efsctsi,       0x0A, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efsctui,        efsctsi,       0x0A, 0x0B, 0x00180000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efsctuf,        efsctsf,       0x0B, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efsctuf,        efsctsf,       0x0B, 0x0B, 0x00180000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efsctuiz,       speundef,      0x0C, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efsctuiz,       speundef,      0x0C, 0x0B, 0x00180000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efsctsiz,       speundef,      0x0D, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efsctsiz,       speundef,      0x0D, 0x0B, 0x00180000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efststgt,       efststlt,      0x0E, 0x0B, 0x00600000, PPC_SPEFPU); //
 | 
					GEN_SPE(efststgt,       efststlt,      0x0E, 0x0B, 0x00600000, PPC_SPE_SINGLE); //
 | 
				
			||||||
GEN_SPE(efststeq,       speundef,      0x0F, 0x0B, 0x00600000, PPC_SPEFPU); //
 | 
					GEN_SPE(efststeq,       speundef,      0x0F, 0x0B, 0x00600000, PPC_SPE_SINGLE); //
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Double precision floating-point operations */
 | 
					/* Double precision floating-point operations */
 | 
				
			||||||
/* Arithmetic */
 | 
					/* Arithmetic */
 | 
				
			||||||
@ -8038,22 +8040,22 @@ GEN_SPEFPUOP_COMP_64(efdtstlt);
 | 
				
			|||||||
GEN_SPEFPUOP_COMP_64(efdtsteq);
 | 
					GEN_SPEFPUOP_COMP_64(efdtsteq);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* Opcodes definitions */
 | 
					/* Opcodes definitions */
 | 
				
			||||||
GEN_SPE(efdadd,         efdsub,        0x10, 0x0B, 0x00000000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdadd,         efdsub,        0x10, 0x0B, 0x00000000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdcfuid,       efdcfsid,      0x11, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdcfuid,       efdcfsid,      0x11, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdabs,         efdnabs,       0x12, 0x0B, 0x0000F800, PPC_SPEFPU); //
 | 
					GEN_SPE(efdabs,         efdnabs,       0x12, 0x0B, 0x0000F800, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdneg,         speundef,      0x13, 0x0B, 0x0000F800, PPC_SPEFPU); //
 | 
					GEN_SPE(efdneg,         speundef,      0x13, 0x0B, 0x0000F800, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdmul,         efddiv,        0x14, 0x0B, 0x00000000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdmul,         efddiv,        0x14, 0x0B, 0x00000000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdctuidz,      efdctsidz,     0x15, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdctuidz,      efdctsidz,     0x15, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdcmpgt,       efdcmplt,      0x16, 0x0B, 0x00600000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdcmpgt,       efdcmplt,      0x16, 0x0B, 0x00600000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdcmpeq,       efdcfs,        0x17, 0x0B, 0x00600000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdcmpeq,       efdcfs,        0x17, 0x0B, 0x00600000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdcfui,        efdcfsi,       0x18, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdcfui,        efdcfsi,       0x18, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdcfuf,        efdcfsf,       0x19, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdcfuf,        efdcfsf,       0x19, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdctui,        efdctsi,       0x1A, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdctui,        efdctsi,       0x1A, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdctuf,        efdctsf,       0x1B, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdctuf,        efdctsf,       0x1B, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdctuiz,       speundef,      0x1C, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdctuiz,       speundef,      0x1C, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdctsiz,       speundef,      0x1D, 0x0B, 0x00180000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdctsiz,       speundef,      0x1D, 0x0B, 0x00180000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdtstgt,       efdtstlt,      0x1E, 0x0B, 0x00600000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdtstgt,       efdtstlt,      0x1E, 0x0B, 0x00600000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
GEN_SPE(efdtsteq,       speundef,      0x1F, 0x0B, 0x00600000, PPC_SPEFPU); //
 | 
					GEN_SPE(efdtsteq,       speundef,      0x1F, 0x0B, 0x00600000, PPC_SPE_DOUBLE); //
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/* End opcode list */
 | 
					/* End opcode list */
 | 
				
			||||||
GEN_OPCODE_MARK(end);
 | 
					GEN_OPCODE_MARK(end);
 | 
				
			||||||
 | 
				
			|||||||
@ -3984,7 +3984,7 @@ static void init_proc_G2LE (CPUPPCState *env)
 | 
				
			|||||||
 * all SPE multiply-accumulate instructions
 | 
					 * all SPE multiply-accumulate instructions
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
#define POWERPC_INSNS_e200   (PPC_INSNS_BASE | PPC_ISEL |                     \
 | 
					#define POWERPC_INSNS_e200   (PPC_INSNS_BASE | PPC_ISEL |                     \
 | 
				
			||||||
                              PPC_SPE | PPC_SPEFPU |                          \
 | 
					                              PPC_SPE | PPC_SPE_SINGLE |                      \
 | 
				
			||||||
                              PPC_WRTEE | PPC_RFDI |                          \
 | 
					                              PPC_WRTEE | PPC_RFDI |                          \
 | 
				
			||||||
                              PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |   \
 | 
					                              PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI |   \
 | 
				
			||||||
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
 | 
					                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |               \
 | 
				
			||||||
@ -4149,7 +4149,7 @@ static void init_proc_e300 (CPUPPCState *env)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* e500 core                                                               */
 | 
					/* e500 core                                                               */
 | 
				
			||||||
#define POWERPC_INSNS_e500   (PPC_INSNS_BASE | PPC_ISEL |             \
 | 
					#define POWERPC_INSNS_e500   (PPC_INSNS_BASE | PPC_ISEL |             \
 | 
				
			||||||
                              PPC_SPE | PPC_SPEFPU |                          \
 | 
					                              PPC_SPE | PPC_SPE_SINGLE | PPC_SPE_DOUBLE |   \
 | 
				
			||||||
                              PPC_WRTEE | PPC_RFDI |                  \
 | 
					                              PPC_WRTEE | PPC_RFDI |                  \
 | 
				
			||||||
                              PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | \
 | 
					                              PPC_CACHE | PPC_CACHE_LOCK | PPC_CACHE_ICBI | \
 | 
				
			||||||
                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |       \
 | 
					                              PPC_CACHE_DCBZ | PPC_CACHE_DCBA |       \
 | 
				
			||||||
@ -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,
 | 
					        gdb_register_coprocessor(env, gdb_get_avr_reg, gdb_set_avr_reg,
 | 
				
			||||||
                                 34, "power-altivec.xml", 0);
 | 
					                                 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,
 | 
					        gdb_register_coprocessor(env, gdb_get_spe_reg, gdb_set_spe_reg,
 | 
				
			||||||
                                 34, "power-spe.xml", 0);
 | 
					                                 34, "power-spe.xml", 0);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user