tcg: fix deposit_i64 op on 32-bit targets
On 32-bit TCG targets, when emulating deposit_i64 with a mov_i32 + deposit_i32, care should be taken to not overwrite the low part of the second argument before the deposit when it is the same the destination. This fixes the shld instruction in qemu-system-x86_64, which in turns fixes booting "system rescue CD version 2.8.0" on this target. Reported-by: Michael S. Tsirkin <mst@redhat.com> Reviewed-by: Richard Henderson <rth@twiddle.net> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
		
							parent
							
								
									909eedb74f
								
							
						
					
					
						commit
						ed605126a8
					
				| 
						 | 
				
			
			@ -2188,9 +2188,9 @@ static inline void tcg_gen_deposit_i64(TCGv_i64 ret, TCGv_i64 arg1,
 | 
			
		|||
 | 
			
		||||
#if TCG_TARGET_REG_BITS == 32
 | 
			
		||||
    if (ofs >= 32) {
 | 
			
		||||
        tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg1));
 | 
			
		||||
        tcg_gen_deposit_i32(TCGV_HIGH(ret), TCGV_HIGH(arg1),
 | 
			
		||||
                            TCGV_LOW(arg2), ofs - 32, len);
 | 
			
		||||
        tcg_gen_mov_i32(TCGV_LOW(ret), TCGV_LOW(arg1));
 | 
			
		||||
        return;
 | 
			
		||||
    }
 | 
			
		||||
    if (ofs + len <= 32) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue