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

View File

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