From 1a98691c57d787125600a1a26145c5ce2fbb44ea Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Mon, 11 Nov 2013 19:07:16 -0800 Subject: [PATCH] armjit: Fix ANDI2R() clearing low bits incorrectly. --- Common/ArmEmitter.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Common/ArmEmitter.cpp b/Common/ArmEmitter.cpp index 9ea055887c..c3655e247a 100644 --- a/Common/ArmEmitter.cpp +++ b/Common/ArmEmitter.cpp @@ -189,7 +189,7 @@ void ARMXEmitter::ANDI2R(ARMReg rd, ARMReg rs, u32 val, ARMReg scratch) } else { int ops = 0; for (int i = 0; i < 32; i += 2) { - u8 bits = (val >> i) & 0xFF; + u8 bits = RotR(val, i) & 0xFF; // If either low bit is not set, we need to use a BIC for them. if ((bits & 3) != 3) { ++ops; @@ -201,7 +201,7 @@ void ARMXEmitter::ANDI2R(ARMReg rd, ARMReg rs, u32 val, ARMReg scratch) if (ops <= 3 || !cpu_info.bArmV7) { bool first = true; for (int i = 0; i < 32; i += 2) { - u8 bits = (val >> i) & 0xFF; + u8 bits = RotR(val, i) & 0xFF; if ((bits & 3) != 3) { u8 rotation = i == 0 ? 0 : 16 - i / 2; if (first) { @@ -255,7 +255,7 @@ void ARMXEmitter::ORI2R(ARMReg rd, ARMReg rs, u32 val, ARMReg scratch) } else { int ops = 0; for (int i = 0; i < 32; i += 2) { - u8 bits = (val >> i) & 0xFF; + u8 bits = RotR(val, i) & 0xFF; // If either low bit is set, we need to use a ORR for them. if ((bits & 3) != 0) { ++ops; @@ -271,7 +271,7 @@ void ARMXEmitter::ORI2R(ARMReg rd, ARMReg rs, u32 val, ARMReg scratch) } else if (ops <= 3 || !cpu_info.bArmV7) { bool first = true; for (int i = 0; i < 32; i += 2) { - u8 bits = (val >> i) & 0xFF; + u8 bits = RotR(val, i) & 0xFF; if ((bits & 3) != 0) { u8 rotation = i == 0 ? 0 : 16 - i / 2; if (first) {