backend\A64\emit_a64_data_processing.cpp: Implement Logical ops

This commit is contained in:
SachinVin 2019-07-16 17:46:14 +05:30 committed by xperia64
parent ea54d71e3b
commit 71bf3432a0
2 changed files with 137 additions and 4 deletions

View File

@ -904,4 +904,137 @@ void EmitA64::EmitMul64(EmitContext& ctx, IR::Inst* inst) {
ctx.reg_alloc.DefineValue(inst, result);
}
void EmitA64::EmitAnd32(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
Arm64Gen::ARM64Reg result = DecodeReg(ctx.reg_alloc.UseScratchGpr(args[0]));
if (args[1].IsImmediate()) {
u32 op_arg = args[1].GetImmediateU32();
code.ANDI2R(result, result, op_arg, code.ABI_SCRATCH1);
} else {
Arm64Gen::ARM64Reg op_arg = DecodeReg(ctx.reg_alloc.UseGpr(args[1]));
code.AND(result, result, op_arg);
}
ctx.reg_alloc.DefineValue(inst, result);
}
//void EmitA64::EmitAnd64(EmitContext& ctx, IR::Inst* inst) {
// auto args = ctx.reg_alloc.GetArgumentInfo(inst);
//
// Xbyak::Reg64 result = ctx.reg_alloc.UseScratchGpr(args[0]);
//
// if (args[1].FitsInImmediateS32()) {
// u32 op_arg = u32(args[1].GetImmediateS32());
//
// code.and_(result, op_arg);
// } else {
// OpArg op_arg = ctx.reg_alloc.UseOpArg(args[1]);
// op_arg.setBit(64);
//
// code.and_(result, *op_arg);
// }
//
// ctx.reg_alloc.DefineValue(inst, result);
//}
void EmitA64::EmitEor32(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
Arm64Gen::ARM64Reg result = DecodeReg(ctx.reg_alloc.UseScratchGpr(args[0]));
if (args[1].IsImmediate()) {
u32 op_arg = args[1].GetImmediateU32();
code.EORI2R(result, result, op_arg, code.ABI_SCRATCH1);
} else {
Arm64Gen::ARM64Reg op_arg = DecodeReg(ctx.reg_alloc.UseGpr(args[1]));
code.EOR(result, result, op_arg);
}
ctx.reg_alloc.DefineValue(inst, result);
}
//void EmitA64::EmitEor64(EmitContext& ctx, IR::Inst* inst) {
// auto args = ctx.reg_alloc.GetArgumentInfo(inst);
//
// Xbyak::Reg64 result = ctx.reg_alloc.UseScratchGpr(args[0]);
//
// if (args[1].FitsInImmediateS32()) {
// u32 op_arg = u32(args[1].GetImmediateS32());
//
// code.xor_(result, op_arg);
// } else {
// OpArg op_arg = ctx.reg_alloc.UseOpArg(args[1]);
// op_arg.setBit(64);
//
// code.xor_(result, *op_arg);
// }
//
// ctx.reg_alloc.DefineValue(inst, result);
//}
void EmitA64::EmitOr32(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
Arm64Gen::ARM64Reg result = DecodeReg(ctx.reg_alloc.UseScratchGpr(args[0]));
if (args[1].IsImmediate()) {
u32 op_arg = args[1].GetImmediateU32();
code.ORRI2R(result, result, op_arg, code.ABI_SCRATCH1);
} else {
Arm64Gen::ARM64Reg op_arg = DecodeReg(ctx.reg_alloc.UseGpr(args[1]));
code.ORR(result, result , op_arg);
}
ctx.reg_alloc.DefineValue(inst, result);
}
//void EmitA64::EmitOr64(EmitContext& ctx, IR::Inst* inst) {
// auto args = ctx.reg_alloc.GetArgumentInfo(inst);
//
// Xbyak::Reg64 result = ctx.reg_alloc.UseScratchGpr(args[0]);
//
// if (args[1].FitsInImmediateS32()) {
// u32 op_arg = u32(args[1].GetImmediateS32());
//
// code.or_(result, op_arg);
// } else {
// OpArg op_arg = ctx.reg_alloc.UseOpArg(args[1]);
// op_arg.setBit(64);
//
// code.or_(result, *op_arg);
// }
//
// ctx.reg_alloc.DefineValue(inst, result);
//}
void EmitA64::EmitNot32(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
Arm64Gen::ARM64Reg result;
if (args[0].IsImmediate()) {
result = DecodeReg(ctx.reg_alloc.ScratchGpr());
code.MOVI2R(result, u32(~args[0].GetImmediateU32()));
} else {
result = DecodeReg(ctx.reg_alloc.UseScratchGpr(args[0]));
code.MVN(result, result);
}
ctx.reg_alloc.DefineValue(inst, result);
}
//void EmitA64::EmitNot64(EmitContext& ctx, IR::Inst* inst) {
// auto args = ctx.reg_alloc.GetArgumentInfo(inst);
//
// Xbyak::Reg64 result;
// if (args[0].IsImmediate()) {
// result = ctx.reg_alloc.ScratchGpr();
// code.mov(result, ~args[0].GetImmediateU64());
// } else {
// result = ctx.reg_alloc.UseScratchGpr(args[0]);
// code.not_(result);
// }
// ctx.reg_alloc.DefineValue(inst, result);
//}
} // namespace Dynarmic::BackendA64

View File

@ -121,13 +121,13 @@ OPCODE(Mul64, U64, U64,
//OPCODE(UnsignedDiv64, U64, U64, U64 )
//OPCODE(SignedDiv32, U32, U32, U32 )
//OPCODE(SignedDiv64, U64, U64, U64 )
//OPCODE(And32, U32, U32, U32 )
OPCODE(And32, U32, U32, U32 )
//OPCODE(And64, U64, U64, U64 )
//OPCODE(Eor32, U32, U32, U32 )
OPCODE(Eor32, U32, U32, U32 )
//OPCODE(Eor64, U64, U64, U64 )
//OPCODE(Or32, U32, U32, U32 )
OPCODE(Or32, U32, U32, U32 )
//OPCODE(Or64, U64, U64, U64 )
//OPCODE(Not32, U32, U32 )
OPCODE(Not32, U32, U32 )
//OPCODE(Not64, U64, U64 )
//OPCODE(SignExtendByteToWord, U32, U8 )
//OPCODE(SignExtendHalfToWord, U32, U16 )