From 17e64406aa615f27ad226aa067acc3f9bc74edcf Mon Sep 17 00:00:00 2001 From: SachinVin Date: Sat, 27 Jul 2019 17:16:00 +0530 Subject: [PATCH] backend\A64\emit_a64_packed.cpp: Implement Unsigned Sum of Absolute Differences --- src/backend/A64/emit_a64_packed.cpp | 12 ++++++++++++ src/backend/A64/opcodes.inc | 2 +- src/frontend/A32/decoder/arm_a64.inc | 4 ++-- 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/backend/A64/emit_a64_packed.cpp b/src/backend/A64/emit_a64_packed.cpp index 83f77c38..b45db657 100644 --- a/src/backend/A64/emit_a64_packed.cpp +++ b/src/backend/A64/emit_a64_packed.cpp @@ -342,6 +342,18 @@ void EmitA64::EmitPackedSaturatedSubS16(EmitContext& ctx, IR::Inst* inst) { ctx.reg_alloc.DefineValue(inst, a); } +void EmitA64::EmitPackedAbsDiffSumS8(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.UABD(B, a, a, b); + code.fp_emitter.UADDLV(B, a, a); + + ctx.reg_alloc.DefineValue(inst, a); +} + void EmitA64::EmitPackedSelect(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); diff --git a/src/backend/A64/opcodes.inc b/src/backend/A64/opcodes.inc index baac8dd3..04eab7b5 100644 --- a/src/backend/A64/opcodes.inc +++ b/src/backend/A64/opcodes.inc @@ -212,7 +212,7 @@ OPCODE(PackedSaturatedAddU16, 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 ) // CRC instructions diff --git a/src/frontend/A32/decoder/arm_a64.inc b/src/frontend/A32/decoder/arm_a64.inc index 90df5206..0cbc4638 100644 --- a/src/frontend/A32/decoder/arm_a64.inc +++ b/src/frontend/A32/decoder/arm_a64.inc @@ -186,8 +186,8 @@ INST(arm_SEL, "SEL", "cccc01101000nnnndddd11111011mmmm INST(arm_UBFX, "UBFX", "cccc0111111wwwwwddddvvvvv101nnnn") // v6T2 // Unsigned Sum of Absolute Differences instructions -//INST(arm_USAD8, "USAD8", "cccc01111000dddd1111mmmm0001nnnn") // v6 -//INST(arm_USADA8, "USADA8", "cccc01111000ddddaaaammmm0001nnnn") // v6 +INST(arm_USAD8, "USAD8", "cccc01111000dddd1111mmmm0001nnnn") // v6 +INST(arm_USADA8, "USADA8", "cccc01111000ddddaaaammmm0001nnnn") // v6 // Packing instructions //INST(arm_PKHBT, "PKHBT", "cccc01101000nnnnddddvvvvv001mmmm") // v6K