backend\A64\emit_a64_data_processing.cpp: Implement 64bit Logical Instructions

This commit is contained in:
SachinVin 2019-07-19 20:02:53 +05:30 committed by xperia64
parent 08ada2919d
commit 0398fc9b41
2 changed files with 66 additions and 71 deletions

View File

@ -921,24 +921,22 @@ void EmitA64::EmitAnd32(EmitContext& ctx, IR::Inst* inst) {
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::EmitAnd64(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
Arm64Gen::ARM64Reg result = 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 = ctx.reg_alloc.UseGpr(args[1]);
code.AND(result, result, op_arg);
}
ctx.reg_alloc.DefineValue(inst, result);
}
void EmitA64::EmitEor32(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
@ -956,24 +954,22 @@ void EmitA64::EmitEor32(EmitContext& ctx, IR::Inst* inst) {
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::EmitEor64(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
Arm64Gen::ARM64Reg result = 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 = ctx.reg_alloc.UseGpr(args[1]);
code.EOR(result, result, op_arg);
}
ctx.reg_alloc.DefineValue(inst, result);
}
void EmitA64::EmitOr32(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
@ -991,24 +987,22 @@ void EmitA64::EmitOr32(EmitContext& ctx, IR::Inst* inst) {
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::EmitOr64(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
Arm64Gen::ARM64Reg result = 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 = ctx.reg_alloc.UseGpr(args[1]);
code.ORR(result, result, op_arg);
}
ctx.reg_alloc.DefineValue(inst, result);
}
void EmitA64::EmitNot32(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
@ -1024,19 +1018,20 @@ void EmitA64::EmitNot32(EmitContext& ctx, IR::Inst* inst) {
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);
//}
void EmitA64::EmitNot64(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::EmitSignExtendByteToWord(EmitContext& ctx, IR::Inst* inst) {
auto args = ctx.reg_alloc.GetArgumentInfo(inst);

View File

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