backend\A64\emit_a64_packed.cpp: Implement Packed Saturating instructions
This commit is contained in:
parent
b4fb2569ad
commit
fd01d6fe0a
@ -181,4 +181,84 @@ void EmitA64::EmitPackedSubS16(EmitContext& ctx, IR::Inst* inst) {
|
|||||||
|
|
||||||
ctx.reg_alloc.DefineValue(inst, a);
|
ctx.reg_alloc.DefineValue(inst, a);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void EmitA64::EmitPackedSaturatedAddU8(EmitContext& ctx, IR::Inst* inst) {
|
||||||
|
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||||
|
|
||||||
|
const ARM64Reg a = EncodeRegToDouble(ctx.reg_alloc.UseScratchFpr(args[0]));
|
||||||
|
const ARM64Reg b = EncodeRegToDouble(ctx.reg_alloc.UseFpr(args[1]));
|
||||||
|
|
||||||
|
code.fp_emitter.UQADD(B, a, a, b);
|
||||||
|
ctx.reg_alloc.DefineValue(inst, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmitA64::EmitPackedSaturatedAddS8(EmitContext& ctx, IR::Inst* inst) {
|
||||||
|
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||||
|
|
||||||
|
const ARM64Reg a = EncodeRegToDouble(ctx.reg_alloc.UseScratchFpr(args[0]));
|
||||||
|
const ARM64Reg b = EncodeRegToDouble(ctx.reg_alloc.UseFpr(args[1]));
|
||||||
|
|
||||||
|
code.fp_emitter.SQADD(B, a, a, b);
|
||||||
|
ctx.reg_alloc.DefineValue(inst, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmitA64::EmitPackedSaturatedSubU8(EmitContext& ctx, IR::Inst* inst) {
|
||||||
|
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||||
|
|
||||||
|
const ARM64Reg a = EncodeRegToDouble(ctx.reg_alloc.UseScratchFpr(args[0]));
|
||||||
|
const ARM64Reg b = EncodeRegToDouble(ctx.reg_alloc.UseFpr(args[1]));
|
||||||
|
|
||||||
|
code.fp_emitter.UQSUB(B, a, a, b);
|
||||||
|
ctx.reg_alloc.DefineValue(inst, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmitA64::EmitPackedSaturatedSubS8(EmitContext& ctx, IR::Inst* inst) {
|
||||||
|
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||||
|
|
||||||
|
const ARM64Reg a = EncodeRegToDouble(ctx.reg_alloc.UseScratchFpr(args[0]));
|
||||||
|
const ARM64Reg b = EncodeRegToDouble(ctx.reg_alloc.UseFpr(args[1]));
|
||||||
|
|
||||||
|
code.fp_emitter.SQSUB(B, a, a, b);
|
||||||
|
ctx.reg_alloc.DefineValue(inst, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmitA64::EmitPackedSaturatedAddU16(EmitContext& ctx, IR::Inst* inst) {
|
||||||
|
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||||
|
|
||||||
|
const ARM64Reg a = EncodeRegToDouble(ctx.reg_alloc.UseScratchFpr(args[0]));
|
||||||
|
const ARM64Reg b = EncodeRegToDouble(ctx.reg_alloc.UseFpr(args[1]));
|
||||||
|
|
||||||
|
code.fp_emitter.UQADD(H, a, a, b);
|
||||||
|
ctx.reg_alloc.DefineValue(inst, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmitA64::EmitPackedSaturatedAddS16(EmitContext& ctx, IR::Inst* inst) {
|
||||||
|
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||||
|
|
||||||
|
const ARM64Reg a = EncodeRegToDouble(ctx.reg_alloc.UseScratchFpr(args[0]));
|
||||||
|
const ARM64Reg b = EncodeRegToDouble(ctx.reg_alloc.UseFpr(args[1]));
|
||||||
|
|
||||||
|
code.fp_emitter.SQADD(H, a, a, b);
|
||||||
|
ctx.reg_alloc.DefineValue(inst, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmitA64::EmitPackedSaturatedSubU16(EmitContext& ctx, IR::Inst* inst) {
|
||||||
|
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||||
|
|
||||||
|
const ARM64Reg a = EncodeRegToDouble(ctx.reg_alloc.UseScratchFpr(args[0]));
|
||||||
|
const ARM64Reg b = EncodeRegToDouble(ctx.reg_alloc.UseFpr(args[1]));
|
||||||
|
|
||||||
|
code.fp_emitter.UQSUB(H, a, a, b);
|
||||||
|
ctx.reg_alloc.DefineValue(inst, a);
|
||||||
|
}
|
||||||
|
|
||||||
|
void EmitA64::EmitPackedSaturatedSubS16(EmitContext& ctx, IR::Inst* inst) {
|
||||||
|
auto args = ctx.reg_alloc.GetArgumentInfo(inst);
|
||||||
|
|
||||||
|
const ARM64Reg a = EncodeRegToDouble(ctx.reg_alloc.UseScratchFpr(args[0]));
|
||||||
|
const ARM64Reg b = EncodeRegToDouble(ctx.reg_alloc.UseFpr(args[1]));
|
||||||
|
|
||||||
|
code.fp_emitter.SQSUB(H, a, a, b);
|
||||||
|
ctx.reg_alloc.DefineValue(inst, a);
|
||||||
|
}
|
||||||
} // namespace Dynarmic::BackendA64
|
} // namespace Dynarmic::BackendA64
|
||||||
|
@ -203,15 +203,15 @@ OPCODE(PackedSubU16, U32, U32,
|
|||||||
//OPCODE(PackedHalvingAddSubS16, U32, U32, U32 )
|
//OPCODE(PackedHalvingAddSubS16, U32, U32, U32 )
|
||||||
//OPCODE(PackedHalvingSubAddU16, U32, U32, U32 )
|
//OPCODE(PackedHalvingSubAddU16, U32, U32, U32 )
|
||||||
//OPCODE(PackedHalvingSubAddS16, U32, U32, U32 )
|
//OPCODE(PackedHalvingSubAddS16, U32, U32, U32 )
|
||||||
//OPCODE(PackedSaturatedAddU8, U32, U32, U32 )
|
|
||||||
//OPCODE(PackedSaturatedAddS8, U32, U32, U32 )
|
|
||||||
//OPCODE(PackedSaturatedSubU8, U32, U32, U32 )
|
|
||||||
//OPCODE(PackedSaturatedSubS8, U32, U32, U32 )
|
|
||||||
//OPCODE(PackedSaturatedAddU16, U32, U32, U32 )
|
|
||||||
//OPCODE(PackedSaturatedAddS16, U32, U32, U32 )
|
|
||||||
//OPCODE(PackedSaturatedSubU16, U32, U32, U32 )
|
|
||||||
//OPCODE(PackedSaturatedSubS16, U32, U32, U32 )
|
|
||||||
OPCODE(PackedSubS16, U32, U32, U32 )
|
OPCODE(PackedSubS16, U32, U32, U32 )
|
||||||
|
OPCODE(PackedSaturatedAddU8, U32, U32, U32 )
|
||||||
|
OPCODE(PackedSaturatedAddS8, U32, U32, U32 )
|
||||||
|
OPCODE(PackedSaturatedSubU8, U32, U32, U32 )
|
||||||
|
OPCODE(PackedSaturatedSubS8, U32, U32, U32 )
|
||||||
|
OPCODE(PackedSaturatedAddU16, U32, U32, U32 )
|
||||||
|
OPCODE(PackedSaturatedAddS16, U32, U32, U32 )
|
||||||
|
OPCODE(PackedSaturatedSubU16, U32, U32, U32 )
|
||||||
|
OPCODE(PackedSaturatedSubS16, U32, U32, U32 )
|
||||||
//OPCODE(PackedAbsDiffSumS8, U32, U32, U32 )
|
//OPCODE(PackedAbsDiffSumS8, U32, U32, U32 )
|
||||||
//OPCODE(PackedSelect, U32, U32, U32, U32 )
|
//OPCODE(PackedSelect, U32, U32, U32, U32 )
|
||||||
|
|
||||||
|
@ -258,18 +258,18 @@ INST(arm_USUB8, "USUB8", "cccc01100101nnnndddd11111111mmmm
|
|||||||
INST(arm_USUB16, "USUB16", "cccc01100101nnnndddd11110111mmmm") // v6
|
INST(arm_USUB16, "USUB16", "cccc01100101nnnndddd11110111mmmm") // v6
|
||||||
|
|
||||||
// Parallel Add/Subtract (Saturating) instructions
|
// Parallel Add/Subtract (Saturating) instructions
|
||||||
//INST(arm_QADD8, "QADD8", "cccc01100010nnnndddd11111001mmmm") // v6
|
INST(arm_QADD8, "QADD8", "cccc01100010nnnndddd11111001mmmm") // v6
|
||||||
//INST(arm_QADD16, "QADD16", "cccc01100010nnnndddd11110001mmmm") // v6
|
INST(arm_QADD16, "QADD16", "cccc01100010nnnndddd11110001mmmm") // v6
|
||||||
//INST(arm_QASX, "QASX", "cccc01100010nnnndddd11110011mmmm") // v6
|
//INST(arm_QASX, "QASX", "cccc01100010nnnndddd11110011mmmm") // v6
|
||||||
//INST(arm_QSAX, "QSAX", "cccc01100010nnnndddd11110101mmmm") // v6
|
//INST(arm_QSAX, "QSAX", "cccc01100010nnnndddd11110101mmmm") // v6
|
||||||
//INST(arm_QSUB8, "QSUB8", "cccc01100010nnnndddd11111111mmmm") // v6
|
INST(arm_QSUB8, "QSUB8", "cccc01100010nnnndddd11111111mmmm") // v6
|
||||||
//INST(arm_QSUB16, "QSUB16", "cccc01100010nnnndddd11110111mmmm") // v6
|
INST(arm_QSUB16, "QSUB16", "cccc01100010nnnndddd11110111mmmm") // v6
|
||||||
//INST(arm_UQADD8, "UQADD8", "cccc01100110nnnndddd11111001mmmm") // v6
|
INST(arm_UQADD8, "UQADD8", "cccc01100110nnnndddd11111001mmmm") // v6
|
||||||
//INST(arm_UQADD16, "UQADD16", "cccc01100110nnnndddd11110001mmmm") // v6
|
INST(arm_UQADD16, "UQADD16", "cccc01100110nnnndddd11110001mmmm") // v6
|
||||||
//INST(arm_UQASX, "UQASX", "cccc01100110nnnndddd11110011mmmm") // v6
|
//INST(arm_UQASX, "UQASX", "cccc01100110nnnndddd11110011mmmm") // v6
|
||||||
//INST(arm_UQSAX, "UQSAX", "cccc01100110nnnndddd11110101mmmm") // v6
|
//INST(arm_UQSAX, "UQSAX", "cccc01100110nnnndddd11110101mmmm") // v6
|
||||||
//INST(arm_UQSUB8, "UQSUB8", "cccc01100110nnnndddd11111111mmmm") // v6
|
INST(arm_UQSUB8, "UQSUB8", "cccc01100110nnnndddd11111111mmmm") // v6
|
||||||
//INST(arm_UQSUB16, "UQSUB16", "cccc01100110nnnndddd11110111mmmm") // v6
|
INST(arm_UQSUB16, "UQSUB16", "cccc01100110nnnndddd11110111mmmm") // v6
|
||||||
|
|
||||||
// Parallel Add/Subtract (Halving) instructions
|
// Parallel Add/Subtract (Halving) instructions
|
||||||
//INST(arm_SHADD8, "SHADD8", "cccc01100011nnnndddd11111001mmmm") // v6
|
//INST(arm_SHADD8, "SHADD8", "cccc01100011nnnndddd11111001mmmm") // v6
|
||||||
|
Loading…
x
Reference in New Issue
Block a user