target-arm: Fix aarch64 vec_reg_offset
Since CPUARMState.vfp.regs is not 16 byte aligned, the ^ 8 fixup used
for a big-endian host doesn't do what's intended.  Fix this by adding
in the vfp.regs offset after computing the inter-register offset.
Signed-off-by: Richard Henderson <rth@twiddle.net>
Message-id: 1481085020-2614-2-git-send-email-rth@twiddle.net
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
(cherry picked from commit 416d72b97b)
Signed-off-by: Michael Roth <mdroth@linux.vnet.ibm.com>
			
			
This commit is contained in:
		
							parent
							
								
									74b13f92c2
								
							
						
					
					
						commit
						d437262fa8
					
				| 
						 | 
				
			
			@ -527,7 +527,7 @@ static inline void assert_fp_access_checked(DisasContext *s)
 | 
			
		|||
static inline int vec_reg_offset(DisasContext *s, int regno,
 | 
			
		||||
                                 int element, TCGMemOp size)
 | 
			
		||||
{
 | 
			
		||||
    int offs = offsetof(CPUARMState, vfp.regs[regno * 2]);
 | 
			
		||||
    int offs = 0;
 | 
			
		||||
#ifdef HOST_WORDS_BIGENDIAN
 | 
			
		||||
    /* This is complicated slightly because vfp.regs[2n] is
 | 
			
		||||
     * still the low half and  vfp.regs[2n+1] the high half
 | 
			
		||||
| 
						 | 
				
			
			@ -540,6 +540,7 @@ static inline int vec_reg_offset(DisasContext *s, int regno,
 | 
			
		|||
#else
 | 
			
		||||
    offs += element * (1 << size);
 | 
			
		||||
#endif
 | 
			
		||||
    offs += offsetof(CPUARMState, vfp.regs[regno * 2]);
 | 
			
		||||
    assert_fp_access_checked(s);
 | 
			
		||||
    return offs;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue