macro_jit_x64: fix miscompilation of bit extraction operations
This commit is contained in:
		@@ -279,28 +279,13 @@ void MacroJITx64Impl::Compile_ExtractInsert(Macro::Opcode opcode) {
 | 
			
		||||
    auto dst = Compile_GetRegister(opcode.src_a, RESULT);
 | 
			
		||||
    auto src = Compile_GetRegister(opcode.src_b, eax);
 | 
			
		||||
 | 
			
		||||
    if (opcode.bf_src_bit != 0 && opcode.bf_src_bit != 31) {
 | 
			
		||||
        shr(src, opcode.bf_src_bit);
 | 
			
		||||
    } else if (opcode.bf_src_bit == 31) {
 | 
			
		||||
        xor_(src, src);
 | 
			
		||||
    }
 | 
			
		||||
    // Don't bother masking the whole register since we're using a 32 bit register
 | 
			
		||||
    if (opcode.bf_size != 31 && opcode.bf_size != 0) {
 | 
			
		||||
        and_(src, opcode.GetBitfieldMask());
 | 
			
		||||
    } else if (opcode.bf_size == 0) {
 | 
			
		||||
        xor_(src, src);
 | 
			
		||||
    }
 | 
			
		||||
    if (opcode.bf_dst_bit != 31 && opcode.bf_dst_bit != 0) {
 | 
			
		||||
        shl(src, opcode.bf_dst_bit);
 | 
			
		||||
    } else if (opcode.bf_dst_bit == 31) {
 | 
			
		||||
        xor_(src, src);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const u32 mask = ~(opcode.GetBitfieldMask() << opcode.bf_dst_bit);
 | 
			
		||||
    if (mask != 0xffffffff) {
 | 
			
		||||
        and_(dst, mask);
 | 
			
		||||
    }
 | 
			
		||||
    and_(dst, mask);
 | 
			
		||||
    shr(src, opcode.bf_src_bit);
 | 
			
		||||
    and_(src, opcode.GetBitfieldMask());
 | 
			
		||||
    shl(src, opcode.bf_dst_bit);
 | 
			
		||||
    or_(dst, src);
 | 
			
		||||
 | 
			
		||||
    Compile_ProcessResult(opcode.result_operation, opcode.dst);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -309,17 +294,9 @@ void MacroJITx64Impl::Compile_ExtractShiftLeftImmediate(Macro::Opcode opcode) {
 | 
			
		||||
    const auto src = Compile_GetRegister(opcode.src_b, RESULT);
 | 
			
		||||
 | 
			
		||||
    shr(src, dst.cvt8());
 | 
			
		||||
    if (opcode.bf_size != 0 && opcode.bf_size != 31) {
 | 
			
		||||
        and_(src, opcode.GetBitfieldMask());
 | 
			
		||||
    } else if (opcode.bf_size == 0) {
 | 
			
		||||
        xor_(src, src);
 | 
			
		||||
    }
 | 
			
		||||
    and_(src, opcode.GetBitfieldMask());
 | 
			
		||||
    shl(src, opcode.bf_dst_bit);
 | 
			
		||||
 | 
			
		||||
    if (opcode.bf_dst_bit != 0 && opcode.bf_dst_bit != 31) {
 | 
			
		||||
        shl(src, opcode.bf_dst_bit);
 | 
			
		||||
    } else if (opcode.bf_dst_bit == 31) {
 | 
			
		||||
        xor_(src, src);
 | 
			
		||||
    }
 | 
			
		||||
    Compile_ProcessResult(opcode.result_operation, opcode.dst);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@@ -327,13 +304,8 @@ void MacroJITx64Impl::Compile_ExtractShiftLeftRegister(Macro::Opcode opcode) {
 | 
			
		||||
    const auto dst = Compile_GetRegister(opcode.src_a, ecx);
 | 
			
		||||
    const auto src = Compile_GetRegister(opcode.src_b, RESULT);
 | 
			
		||||
 | 
			
		||||
    if (opcode.bf_src_bit != 0) {
 | 
			
		||||
        shr(src, opcode.bf_src_bit);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (opcode.bf_size != 31) {
 | 
			
		||||
        and_(src, opcode.GetBitfieldMask());
 | 
			
		||||
    }
 | 
			
		||||
    shr(src, opcode.bf_src_bit);
 | 
			
		||||
    and_(src, opcode.GetBitfieldMask());
 | 
			
		||||
    shl(src, dst.cvt8());
 | 
			
		||||
 | 
			
		||||
    Compile_ProcessResult(opcode.result_operation, opcode.dst);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user