From daddb73f228bf051f0ba4a1c7a568f7172f59ff7 Mon Sep 17 00:00:00 2001 From: "Unknown W. Brackets" Date: Sat, 27 Jun 2015 23:54:43 -0700 Subject: [PATCH] arm64: Implement nor. --- Core/MIPS/ARM64/Arm64CompALU.cpp | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/Core/MIPS/ARM64/Arm64CompALU.cpp b/Core/MIPS/ARM64/Arm64CompALU.cpp index 6a2cb204e1..45c9dd9e9f 100644 --- a/Core/MIPS/ARM64/Arm64CompALU.cpp +++ b/Core/MIPS/ARM64/Arm64CompALU.cpp @@ -264,7 +264,33 @@ void Arm64Jit::Comp_RType3(MIPSOpcode op) { break; case 39: // R(rd) = ~(R(rs) | R(rt)); break; //nor - DISABLE; + if (gpr.IsImm(rs) && gpr.IsImm(rt)) { + gpr.SetImm(rd, ~(gpr.GetImm(rs) | gpr.GetImm(rt))); + } else if (gpr.IsImm(rs) || gpr.IsImm(rt)) { + MIPSGPReg lhs = gpr.IsImm(rs) ? rt : rs; + MIPSGPReg rhs = gpr.IsImm(rs) ? rs : rt; + u32 rhsImm = gpr.GetImm(rhs); + if (rhsImm == 0) { + gpr.MapDirtyIn(rd, lhs); + MVN(gpr.R(rd), gpr.R(lhs)); + } else { + // Ignored, just for IsImmLogical. + unsigned int n, imm_s, imm_r; + if (IsImmLogical(rhsImm, 32, &n, &imm_s, &imm_r)) { + // Great, we can avoid flushing a reg. + gpr.MapDirtyIn(rd, lhs); + ORRI2R(gpr.R(rd), gpr.R(lhs), rhsImm); + } else { + gpr.MapDirtyInIn(rd, rs, rt); + ORR(gpr.R(rd), gpr.R(rs), gpr.R(rt)); + } + MVN(gpr.R(rd), gpr.R(rd)); + } + } else { + gpr.MapDirtyInIn(rd, rs, rt); + ORR(gpr.R(rd), gpr.R(rs), gpr.R(rt)); + MVN(gpr.R(rd), gpr.R(rd)); + } break; case 42: //R(rd) = (int)R(rs) < (int)R(rt); break; //slt