From patchwork Wed Sep 5 10:31:06 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Shiyou Yin X-Patchwork-Id: 10237 Delivered-To: ffmpegpatchwork@gmail.com Received: by 2002:a02:12c4:0:0:0:0:0 with SMTP id 65-v6csp4948427jap; Wed, 5 Sep 2018 03:31:33 -0700 (PDT) X-Google-Smtp-Source: ANB0Vdb4JuIECUVNzSc/d0GYT9iK/0MAvINbx5jUDQ77fXmpWSryADztSzuWj/0JQ3xK6Xu4v09X X-Received: by 2002:adf:ad47:: with SMTP id p65-v6mr26410702wrc.222.1536143493717; Wed, 05 Sep 2018 03:31:33 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1536143493; cv=none; d=google.com; s=arc-20160816; b=s8hlxZLzVsPYK4Hb+KT/Cv/T/n0KJlzNXmZb+JHUtYxV2DLY6xjZUxWELLBT25384/ tRJeNsX/vk9zHG0W7l8uK0snBAsua02xobfMpyOcwMkRkl1+kFANa8h0O7K38LL5Q9dv 5SJyQJzHaQbXoewWSP3wLP9KgZlEmRu4FfSCti9BGaeXtt9H8GEOMCt+Sp44iqTBT29u f7dkGyo7Zs+nhyiYqHaCmq+4+ZvUSwZxQYc4dvR5l0EesnZW51CBaLMcrTelmnrwgQjj tpLEFRqrvlD7Wk9LGiSfJ7wr4qwOf5KhrRkx6fTMcXBQDCGnbU1ezetez3Ib2ZLcb9IL YYWQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:delivered-to; bh=fTRt/QJnlFjOMlB7/PFUOYiIOh0Zpn3ZPb5xSdsAIjc=; b=OgGs88EfAYQkMmvh+pk5wLN3pIYK8hT8t2SopOoNSbvboOZx4dSU5558bVQeAF7JsU tYTAbjqODg8vEmdS6s3KeDCQi6oGVMaWfI6IL/zx+g2P0GbnlYWzpbyRYtgjnZNThJE9 IQXfq6B0V0WhZeelXX4+t9siNFz+inY2YVNmUHuYJVWkM1OK/y6uFzxFDs4czzlBnq7h kaVJxuTkC/kUhj5XdZiwNVBM+B5KkEsg3zfmW+z15FDpz/mFMnzVbnn5s9hV/OpZjV7y hScfV5mSgQxdnQ1h92PYOFVMQa8Wkx2rPdbfQmIjuN3qok+40NBdeEnSpIpZ8yDzbaV2 TT7Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id v14-v6si1414315wrr.116.2018.09.05.03.31.33; Wed, 05 Sep 2018 03:31:33 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id A4F70689FDF; Wed, 5 Sep 2018 13:31:13 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail.loongson.cn (mail.loongson.cn [114.242.206.163]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 13A80689ED0 for ; Wed, 5 Sep 2018 13:31:03 +0300 (EEST) Received: from localhost (unknown [210.45.123.188]) by mail (Coremail) with SMTP id QMiowPCx2eROsI9bfHMOAA--.3126S3; Wed, 05 Sep 2018 18:30:39 +0800 (CST) From: Shiyou Yin To: ffmpeg-devel@ffmpeg.org Date: Wed, 5 Sep 2018 18:31:06 +0800 Message-Id: <1536143466-8610-2-git-send-email-yinshiyou-hf@loongson.cn> X-Mailer: git-send-email 2.1.0 In-Reply-To: <1536143466-8610-1-git-send-email-yinshiyou-hf@loongson.cn> References: <1536143466-8610-1-git-send-email-yinshiyou-hf@loongson.cn> X-CM-TRANSID: QMiowPCx2eROsI9bfHMOAA--.3126S3 X-Coremail-Antispam: 1UD129KBjvAXoW3ZF1ftFW7ZF1UAF17uryxuFg_yoW8Zr1xJo W5Kay0g3ZrJw1xCrW8Aw1UAr4jyFWIqryUZr4fta13Gr90q3W29rWrCr13Grs8Zw4Igry3 Aa4jqFy3ZFyDG3y8n29KB7ZKAUJUUUU8529EdanIXcx71UUUUU7v73VFW2AGmfu7bjvjm3 AaLaJ3UjIYCTnIWjp_UUUYx7AC8VAFwI0_Jr0_Gr1l1xkIjI8I6I8E6xAIw20EY4v20xva j40_Wr0E3s1l1IIY67AEw4v_Jr0_Jr4l8cAvFVAK0II2c7xJM28CjxkF64kEwVA0rcxSw2 x7M28EF7xvwVC0I7IYx2IY67AKxVW8JVW5JwA2z4x0Y4vE2Ix0cI8IcVCY1x0267AKxVW8 JVWxJwA2z4x0Y4vEx4A2jsIE14v26r4UJVWxJr1l84ACjcxK6I8E87Iv6xkF7I0E14v26F 4UJVW0owAS0I0E0xvYzxvE52x082IY62kv0487Mc02F40EFcxC0VAKzVAqx4xG6I80ewAv 7VC0I7IYx2IY67AKxVWUXVWUAwAv7VC2z280aVAFwI0_Gr0_Cr1lOx8S6xCaFVCjc4AY6r 1j6r4UM4x0Y48IcxkI7VAKI48JM4x0Y48IcxkI7VAKI48G6xCjnVAKz4kxM4x0x7Aq67II x4CEVc8vx2IErcIFxwCY02Avz4vE14v_Gw1l42xK82IYc2Ij64vIr41l4I8I3I0E4IkC6x 0Yz7v_Jr0_Gr1lx2IqxVAqx4xG67AKxVWUJVWUGwC20s026x8GjcxK67AKxVWUGVWUWwC2 zVAF1VAY17CE14v26r1Y6r17MIIF0xvE2Ix0cI8IcVAFwI0_Jr0_JF4lIxAIcVC0I7IYx2 IY6xkF7I0E14v26r1j6r4UMIIF0xvE42xK8VAvwI8IcIk0rVWUJVWUCwCI42IY6I8E87Iv 67AKxVWUJVW8JwCI42IY6I8E87Iv6xkF7I0E14v26r1j6r4UYxBIdaVFxhVjvjDU0xZFpf 9x0JUoMKtUUUUU= X-CM-SenderInfo: p1lq2x5l1r3gtki6z05rqj20fqof0/ Subject: [FFmpeg-devel] [PATCH 2/2] avcodec/mips: [loongson] optimize vp8 decoding in vp8dsp. X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: gxw MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: gxw Optimize vp8 loop filter with mmi, four functions optimized: 1. ff_vp8_h_loop_filter8uv_mmi. 2. ff_vp8_v_loop_filter8uv_mmi. 3. ff_vp8_h_loop_filter16_mmi. 4. ff_vp8_v_loop_filter16_mmi. Vp8 decoding speed improved about 50%(from 73fps to 110fps, Tested on loongson 3A3000). Signed-off-by: Shiyou Yin --- libavcodec/mips/vp8dsp_mmi.c | 402 +++++++++++++++++++++++++++++++++++++++---- libavutil/mips/mmiutils.h | 28 +++ 2 files changed, 394 insertions(+), 36 deletions(-) diff --git a/libavcodec/mips/vp8dsp_mmi.c b/libavcodec/mips/vp8dsp_mmi.c index f972628..b24a87a 100644 --- a/libavcodec/mips/vp8dsp_mmi.c +++ b/libavcodec/mips/vp8dsp_mmi.c @@ -25,6 +25,221 @@ #include "constants.h" #include "libavutil/mips/mmiutils.h" +#define DECLARE_DOUBLE_1 double db_1 +#define DECLARE_DOUBLE_2 double db_2 +#define DECLARE_UINT32_T uint32_t it_1 +#define RESTRICT_ASM_DOUBLE_1 [db_1]"=&f"(db_1) +#define RESTRICT_ASM_DOUBLE_2 [db_2]"=&f"(db_2) +#define RESTRICT_ASM_UINT32_T [it_1]"=&r"(it_1) + +#define MMI_PCMPGTUB(dst, src1, src2) \ + "pcmpeqb %[db_1], "#src1", "#src2" \n\t" \ + "pmaxub %[db_2], "#src1", "#src2" \n\t" \ + "pcmpeqb %[db_2], %[db_2], "#src1" \n\t" \ + "xor "#dst", %[db_2], %[db_1] \n\t" + +#define MMI_BTOH(dst_l, dst_r, src) \ + "xor %[db_1], %[db_1], %[db_1] \n\t" \ + "pcmpgtb %[db_2], %[db_1], "#src" \n\t" \ + "punpcklbh "#dst_r", "#src", %[db_2] \n\t" \ + "punpckhbh "#dst_l", "#src", %[db_2] \n\t" + +#define MMI_TRANSPOSE8x8_UB_UB(src_0, src_1, src_2, src_3, \ + src_4, src_5, src_6, src_7, \ + dst_0, dst_1, dst_2, dst_3, \ + dst_4, dst_5, dst_6, dst_7) \ + "li %[it_1], 0xe4 \n\t" \ + "dmtc1 %[it_1], %[db_1] \n\t" \ + "pshufh %[db_2], "#src_0", %[db_1] \n\t" \ + "punpcklbh "#dst_0", "#src_0", "#src_1" \n\t" \ + "punpckhbh "#dst_1", %[db_2], "#src_1" \n\t" \ + "pshufh %[db_2], "#src_2", %[db_1] \n\t" \ + "punpcklbh "#dst_2", "#src_2", "#src_3" \n\t" \ + "punpckhbh "#dst_3", %[db_2], "#src_3" \n\t" \ + "pshufh %[db_2], "#src_4", %[db_1] \n\t" \ + "punpcklbh "#dst_4", "#src_4", "#src_5" \n\t" \ + "punpckhbh "#dst_5", %[db_2], "#src_5" \n\t" \ + "pshufh %[db_2], "#src_6", %[db_1] \n\t" \ + "punpcklbh "#dst_6", "#src_6", "#src_7" \n\t" \ + "punpckhbh "#dst_7", %[db_2], "#src_7" \n\t" \ + \ + "pshufh %[db_2], "#dst_0", %[db_1] \n\t" \ + "punpcklhw "#dst_0", "#dst_0", "#dst_2" \n\t" \ + "punpckhhw "#dst_2", %[db_2], "#dst_2" \n\t" \ + "pshufh %[db_2], "#dst_1", %[db_1] \n\t" \ + "punpcklhw "#dst_1", "#dst_1", "#dst_3" \n\t" \ + "punpckhhw "#dst_3", %[db_2], "#dst_3" \n\t" \ + "pshufh %[db_2], "#dst_4", %[db_1] \n\t" \ + "punpcklhw "#dst_4", "#dst_4", "#dst_6" \n\t" \ + "punpckhhw "#dst_6", %[db_2], "#dst_6" \n\t" \ + "pshufh %[db_2], "#dst_5", %[db_1] \n\t" \ + "punpcklhw "#dst_5", "#dst_5", "#dst_7" \n\t" \ + "punpckhhw "#dst_7", %[db_2], "#dst_7" \n\t" \ + \ + "pshufh %[db_2], "#dst_0", %[db_1] \n\t" \ + "punpcklwd "#dst_0", "#dst_0", "#dst_4" \n\t" \ + "punpckhwd "#dst_4", %[db_2], "#dst_4" \n\t" \ + "pshufh %[db_2], "#dst_1", %[db_1] \n\t" \ + "punpcklwd "#dst_1", "#dst_1", "#dst_5" \n\t" \ + "punpckhwd "#dst_5", %[db_2], "#dst_5" \n\t" \ + "pshufh %[db_2], "#dst_2", %[db_1] \n\t" \ + "punpcklwd "#dst_2", "#dst_2", "#dst_6" \n\t" \ + "punpckhwd "#dst_6", %[db_2], "#dst_6" \n\t" \ + "pshufh %[db_2], "#dst_3", %[db_1] \n\t" \ + "punpcklwd "#dst_3", "#dst_3", "#dst_7" \n\t" \ + "punpckhwd "#dst_7", %[db_2], "#dst_7" \n\t" \ + \ + "pshufh %[db_2], "#dst_1", %[db_1] \n\t" \ + "pshufh "#dst_1", "#dst_4", %[db_1] \n\t" \ + "pshufh "#dst_4", %[db_2], %[db_1] \n\t" \ + "pshufh %[db_2], "#dst_3", %[db_1] \n\t" \ + "pshufh "#dst_3", "#dst_6", %[db_1] \n\t" \ + "pshufh "#dst_6", %[db_2], %[db_1] \n\t" + +#define MMI_VP8_LOOP_FILTER \ + /* Calculation of hev */ \ + "dmtc1 %[thresh], %[ftmp3] \n\t" \ + "punpcklbh %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ + "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ + "punpcklwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ + "pasubub %[ftmp0], %[p1], %[p0] \n\t" \ + "pasubub %[ftmp1], %[q1], %[q0] \n\t" \ + "pmaxub %[ftmp0], %[ftmp0], %[ftmp1] \n\t" \ + MMI_PCMPGTUB(%[hev], %[ftmp0], %[ftmp3]) \ + /* Calculation of mask */ \ + "pasubub %[ftmp1], %[p0], %[q0] \n\t" \ + "paddusb %[ftmp1], %[ftmp1], %[ftmp1] \n\t" \ + "pasubub %[ftmp2], %[p1], %[q1] \n\t" \ + "li %[tmp0], 0x09 \n\t" \ + "dmtc1 %[tmp0], %[ftmp3] \n\t" \ + PSRLB_MMI(%[ftmp2], %[ftmp3], %[ftmp4], %[ftmp5], %[ftmp2]) \ + "paddusb %[ftmp1], %[ftmp1], %[ftmp2] \n\t" \ + "dmtc1 %[e], %[ftmp3] \n\t" \ + "punpcklbh %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ + "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ + "punpcklwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ + MMI_PCMPGTUB(%[mask], %[ftmp1], %[ftmp3]) \ + "pmaxub %[mask], %[mask], %[ftmp0] \n\t" \ + "pasubub %[ftmp1], %[p3], %[p2] \n\t" \ + "pasubub %[ftmp2], %[p2], %[p1] \n\t" \ + "pmaxub %[ftmp1], %[ftmp1], %[ftmp2] \n\t" \ + "pmaxub %[mask], %[mask], %[ftmp1] \n\t" \ + "pasubub %[ftmp1], %[q3], %[q2] \n\t" \ + "pasubub %[ftmp2], %[q2], %[q1] \n\t" \ + "pmaxub %[ftmp1], %[ftmp1], %[ftmp2] \n\t" \ + "pmaxub %[mask], %[mask], %[ftmp1] \n\t" \ + "dmtc1 %[i], %[ftmp3] \n\t" \ + "punpcklbh %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ + "punpcklhw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ + "punpcklwd %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ + MMI_PCMPGTUB(%[mask], %[mask], %[ftmp3]) \ + "pcmpeqw %[ftmp3], %[ftmp3], %[ftmp3] \n\t" \ + "xor %[mask], %[mask], %[ftmp3] \n\t" \ + /* VP8_MBFILTER */ \ + "li %[tmp0], 0x80808080 \n\t" \ + "dmtc1 %[tmp0], %[ftmp7] \n\t" \ + "punpcklwd %[ftmp7], %[ftmp7], %[ftmp7] \n\t" \ + "xor %[p2], %[p2], %[ftmp7] \n\t" \ + "xor %[p1], %[p1], %[ftmp7] \n\t" \ + "xor %[p0], %[p0], %[ftmp7] \n\t" \ + "xor %[q0], %[q0], %[ftmp7] \n\t" \ + "xor %[q1], %[q1], %[ftmp7] \n\t" \ + "xor %[q2], %[q2], %[ftmp7] \n\t" \ + "psubsb %[ftmp4], %[p1], %[q1] \n\t" \ + "psubb %[ftmp5], %[q0], %[p0] \n\t" \ + MMI_BTOH(%[ftmp1], %[ftmp0], %[ftmp5]) \ + MMI_BTOH(%[ftmp3], %[ftmp2], %[ftmp4]) \ + /* Right part */ \ + "paddh %[ftmp5], %[ftmp0], %[ftmp0] \n\t" \ + "paddh %[ftmp0], %[ftmp0], %[ftmp5] \n\t" \ + "paddh %[ftmp0], %[ftmp2], %[ftmp0] \n\t" \ + /* Left part */ \ + "paddh %[ftmp5], %[ftmp1], %[ftmp1] \n\t" \ + "paddh %[ftmp1], %[ftmp1], %[ftmp5] \n\t" \ + "paddh %[ftmp1], %[ftmp3], %[ftmp1] \n\t" \ + /* Combine left and right part */ \ + "packsshb %[ftmp1], %[ftmp0], %[ftmp1] \n\t" \ + "and %[ftmp1], %[ftmp1], %[mask] \n\t" \ + "and %[ftmp2], %[ftmp1], %[hev] \n\t" \ + "li %[tmp0], 0x04040404 \n\t" \ + "dmtc1 %[tmp0], %[ftmp0] \n\t" \ + "punpcklwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \ + "paddsb %[ftmp3], %[ftmp2], %[ftmp0] \n\t" \ + "li %[tmp0], 0x0B \n\t" \ + "dmtc1 %[tmp0], %[ftmp4] \n\t" \ + PSRAB_MMI(%[ftmp3], %[ftmp4], %[ftmp5], %[ftmp6], %[ftmp3]) \ + "li %[tmp0], 0x03030303 \n\t" \ + "dmtc1 %[tmp0], %[ftmp0] \n\t" \ + "punpcklwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \ + "paddsb %[ftmp4], %[ftmp2], %[ftmp0] \n\t" \ + "li %[tmp0], 0x0B \n\t" \ + "dmtc1 %[tmp0], %[ftmp2] \n\t" \ + PSRAB_MMI(%[ftmp4], %[ftmp2], %[ftmp5], %[ftmp6], %[ftmp4]) \ + "psubsb %[q0], %[q0], %[ftmp3] \n\t" \ + "paddsb %[p0], %[p0], %[ftmp4] \n\t" \ + /* filt_val &= ~hev */ \ + "pcmpeqw %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \ + "xor %[hev], %[hev], %[ftmp0] \n\t" \ + "and %[ftmp1], %[ftmp1], %[hev] \n\t" \ + MMI_BTOH(%[ftmp5], %[ftmp6], %[ftmp1]) \ + "li %[tmp0], 0x07 \n\t" \ + "dmtc1 %[tmp0], %[ftmp2] \n\t" \ + "li %[tmp0], 0x001b001b \n\t" \ + "dmtc1 %[tmp0], %[ftmp1] \n\t" \ + "punpcklwd %[ftmp1], %[ftmp1], %[ftmp1] \n\t" \ + "li %[tmp0], 0x003f003f \n\t" \ + "dmtc1 %[tmp0], %[ftmp0] \n\t" \ + "punpcklwd %[ftmp0], %[ftmp0], %[ftmp0] \n\t" \ + /* Right part */ \ + "pmullh %[ftmp3], %[ftmp6], %[ftmp1] \n\t" \ + "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t" \ + "psrah %[ftmp3], %[ftmp3], %[ftmp2] \n\t" \ + /* Left part */ \ + "pmullh %[ftmp4], %[ftmp5], %[ftmp1] \n\t" \ + "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \ + "psrah %[ftmp4], %[ftmp4], %[ftmp2] \n\t" \ + /* Combine left and right part */ \ + "packsshb %[ftmp4], %[ftmp3], %[ftmp4] \n\t" \ + "psubsb %[q0], %[q0], %[ftmp4] \n\t" \ + "xor %[q0], %[q0], %[ftmp7] \n\t" \ + "paddsb %[p0], %[p0], %[ftmp4] \n\t" \ + "xor %[p0], %[p0], %[ftmp7] \n\t" \ + "li %[tmp0], 0x00120012 \n\t" \ + "dmtc1 %[tmp0], %[ftmp1] \n\t" \ + "punpcklwd %[ftmp1], %[ftmp1], %[ftmp1] \n\t" \ + /* Right part */ \ + "pmullh %[ftmp3], %[ftmp6], %[ftmp1] \n\t" \ + "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t" \ + "psrah %[ftmp3], %[ftmp3], %[ftmp2] \n\t" \ + /* Left part */ \ + "pmullh %[ftmp4], %[ftmp5], %[ftmp1] \n\t" \ + "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \ + "psrah %[ftmp4], %[ftmp4], %[ftmp2] \n\t" \ + /* Combine left and right part */ \ + "packsshb %[ftmp4], %[ftmp3], %[ftmp4] \n\t" \ + "psubsb %[q1], %[q1], %[ftmp4] \n\t" \ + "xor %[q1], %[q1], %[ftmp7] \n\t" \ + "paddsb %[p1], %[p1], %[ftmp4] \n\t" \ + "xor %[p1], %[p1], %[ftmp7] \n\t" \ + "li %[tmp0], 0x03 \n\t" \ + "dmtc1 %[tmp0], %[ftmp1] \n\t" \ + /* Right part */ \ + "psllh %[ftmp3], %[ftmp6], %[ftmp1] \n\t" \ + "paddh %[ftmp3], %[ftmp3], %[ftmp6] \n\t" \ + "paddh %[ftmp3], %[ftmp3], %[ftmp0] \n\t" \ + "psrah %[ftmp3], %[ftmp3], %[ftmp2] \n\t" \ + /* Left part */ \ + "psllh %[ftmp4], %[ftmp5], %[ftmp1] \n\t" \ + "paddh %[ftmp4], %[ftmp4], %[ftmp5] \n\t" \ + "paddh %[ftmp4], %[ftmp4], %[ftmp0] \n\t" \ + "psrah %[ftmp4], %[ftmp4], %[ftmp2] \n\t" \ + /* Combine left and right part */ \ + "packsshb %[ftmp4], %[ftmp3], %[ftmp4] \n\t" \ + "psubsb %[q2], %[q2], %[ftmp4] \n\t" \ + "xor %[q2], %[q2], %[ftmp7] \n\t" \ + "paddsb %[p2], %[p2], %[ftmp4] \n\t" \ + "xor %[p2], %[p2], %[ftmp7] \n\t" + #define PUT_VP8_EPEL4_H6_MMI(src, dst) \ MMI_ULWC1(%[ftmp1], src, 0x00) \ "punpcklbh %[ftmp2], %[ftmp1], %[ftmp0] \n\t" \ @@ -621,15 +836,71 @@ static av_always_inline int vp8_normal_limit(uint8_t *p, ptrdiff_t stride, static av_always_inline void vp8_v_loop_filter8_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh) { - int i; - - for (i = 0; i < 8; i++) - if (vp8_normal_limit(dst + i * 1, stride, flim_E, flim_I)) { - if (hev(dst + i * 1, stride, hev_thresh)) - vp8_filter_common_is4tap(dst + i * 1, stride); - else - filter_mbedge(dst + i * 1, stride); - } + double ftmp[18]; + uint32_t tmp[1]; + DECLARE_DOUBLE_1; + DECLARE_DOUBLE_2; + DECLARE_UINT32_T; + __asm__ volatile( + /* Get data from dst */ + "gsldlc1 %[q0], 0x07(%[dst]) \n\t" + "gsldrc1 %[q0], 0x00(%[dst]) \n\t" + PTR_SUBU "%[tmp0], %[dst], %[stride] \n\t" + "gsldlc1 %[p0], 0x07(%[tmp0]) \n\t" + "gsldrc1 %[p0], 0x00(%[tmp0]) \n\t" + PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t" + "gsldlc1 %[p1], 0x07(%[tmp0]) \n\t" + "gsldrc1 %[p1], 0x00(%[tmp0]) \n\t" + PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t" + "gsldlc1 %[p2], 0x07(%[tmp0]) \n\t" + "gsldrc1 %[p2], 0x00(%[tmp0]) \n\t" + PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t" + "gsldlc1 %[p3], 0x07(%[tmp0]) \n\t" + "gsldrc1 %[p3], 0x00(%[tmp0]) \n\t" + PTR_ADDU "%[tmp0], %[dst], %[stride] \n\t" + "gsldlc1 %[q1], 0x07(%[tmp0]) \n\t" + "gsldrc1 %[q1], 0x00(%[tmp0]) \n\t" + PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" + "gsldlc1 %[q2], 0x07(%[tmp0]) \n\t" + "gsldrc1 %[q2], 0x00(%[tmp0]) \n\t" + PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" + "gsldlc1 %[q3], 0x07(%[tmp0]) \n\t" + "gsldrc1 %[q3], 0x00(%[tmp0]) \n\t" + MMI_VP8_LOOP_FILTER + /* Move to dst */ + "gssdlc1 %[q0], 0x07(%[dst]) \n\t" + "gssdrc1 %[q0], 0x00(%[dst]) \n\t" + PTR_SUBU "%[tmp0], %[dst], %[stride] \n\t" + "gssdlc1 %[p0], 0x07(%[tmp0]) \n\t" + "gssdrc1 %[p0], 0x00(%[tmp0]) \n\t" + PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t" + "gssdlc1 %[p1], 0x07(%[tmp0]) \n\t" + "gssdrc1 %[p1], 0x00(%[tmp0]) \n\t" + PTR_SUBU "%[tmp0], %[tmp0], %[stride] \n\t" + "gssdlc1 %[p2], 0x07(%[tmp0]) \n\t" + "gssdrc1 %[p2], 0x00(%[tmp0]) \n\t" + PTR_ADDU "%[tmp0], %[dst], %[stride] \n\t" + "gssdlc1 %[q1], 0x07(%[tmp0]) \n\t" + "gssdrc1 %[q1], 0x00(%[tmp0]) \n\t" + PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" + "gssdlc1 %[q2], 0x07(%[tmp0]) \n\t" + "gssdrc1 %[q2], 0x00(%[tmp0]) \n\t" + : [p3]"=&f"(ftmp[0]), [p2]"=&f"(ftmp[1]), + [p1]"=&f"(ftmp[2]), [p0]"=&f"(ftmp[3]), + [q0]"=&f"(ftmp[4]), [q1]"=&f"(ftmp[5]), + [q2]"=&f"(ftmp[6]), [q3]"=&f"(ftmp[7]), + [ftmp0]"=&f"(ftmp[8]), [ftmp1]"=&f"(ftmp[9]), + [ftmp2]"=&f"(ftmp[10]), [ftmp3]"=&f"(ftmp[11]), + [hev]"=&f"(ftmp[12]), [mask]"=&f"(ftmp[13]), + [ftmp4]"=&f"(ftmp[14]), [ftmp5]"=&f"(ftmp[15]), + [ftmp6]"=&f"(ftmp[16]), [ftmp7]"=&f"(ftmp[17]), + [dst]"+&r"(dst), [tmp0]"=&r"(tmp[0]), + RESTRICT_ASM_DOUBLE_1, RESTRICT_ASM_DOUBLE_2, + RESTRICT_ASM_UINT32_T + : [e]"r"((mips_reg)flim_E), [thresh]"r"((mips_reg)hev_thresh), + [i]"r"((mips_reg)flim_I), [stride]"r"((mips_reg)stride) + : "memory" + ); } static av_always_inline void vp8_v_loop_filter8_inner_mmi(uint8_t *dst, @@ -650,15 +921,87 @@ static av_always_inline void vp8_v_loop_filter8_inner_mmi(uint8_t *dst, static av_always_inline void vp8_h_loop_filter8_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh) { - int i; - - for (i = 0; i < 8; i++) - if (vp8_normal_limit(dst + i * stride, 1, flim_E, flim_I)) { - if (hev(dst + i * stride, 1, hev_thresh)) - vp8_filter_common_is4tap(dst + i * stride, 1); - else - filter_mbedge(dst + i * stride, 1); - } + double ftmp[18]; + uint32_t tmp[1]; + DECLARE_DOUBLE_1; + DECLARE_DOUBLE_2; + DECLARE_UINT32_T; + __asm__ volatile( + /* Get data from dst */ + "gsldlc1 %[p3], 0x03(%[dst]) \n\t" + "gsldrc1 %[p3], -0x04(%[dst]) \n\t" + PTR_ADDU "%[tmp0], %[dst], %[stride] \n\t" + "gsldlc1 %[p2], 0x03(%[tmp0]) \n\t" + "gsldrc1 %[p2], -0x04(%[tmp0]) \n\t" + PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" + "gsldlc1 %[p1], 0x03(%[tmp0]) \n\t" + "gsldrc1 %[p1], -0x04(%[tmp0]) \n\t" + PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" + "gsldlc1 %[p0], 0x03(%[tmp0]) \n\t" + "gsldrc1 %[p0], -0x04(%[tmp0]) \n\t" + PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" + "gsldlc1 %[q0], 0x03(%[tmp0]) \n\t" + "gsldrc1 %[q0], -0x04(%[tmp0]) \n\t" + PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" + "gsldlc1 %[q1], 0x03(%[tmp0]) \n\t" + "gsldrc1 %[q1], -0x04(%[tmp0]) \n\t" + PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" + "gsldlc1 %[q2], 0x03(%[tmp0]) \n\t" + "gsldrc1 %[q2], -0x04(%[tmp0]) \n\t" + PTR_ADDU "%[tmp0], %[tmp0], %[stride] \n\t" + "gsldlc1 %[q3], 0x03(%[tmp0]) \n\t" + "gsldrc1 %[q3], -0x04(%[tmp0]) \n\t" + /* Matrix transpose */ + MMI_TRANSPOSE8x8_UB_UB(%[p3], %[p2], %[p1], %[p0], + %[q0], %[q1], %[q2], %[q3], + %[p3], %[p2], %[p1], %[p0], + %[q0], %[q1], %[q2], %[q3]) + MMI_VP8_LOOP_FILTER + /* Matrix transpose */ + MMI_TRANSPOSE8x8_UB_UB(%[p3], %[p2], %[p1], %[p0], + %[q0], %[q1], %[q2], %[q3], + %[p3], %[p2], %[p1], %[p0], + %[q0], %[q1], %[q2], %[q3]) + /* Move to dst */ + "gssdlc1 %[p3], 0x03(%[dst]) \n\t" + "gssdrc1 %[p3], -0x04(%[dst]) \n\t" + PTR_ADDU "%[dst], %[dst], %[stride] \n\t" + "gssdlc1 %[p2], 0x03(%[dst]) \n\t" + "gssdrc1 %[p2], -0x04(%[dst]) \n\t" + PTR_ADDU "%[dst], %[dst], %[stride] \n\t" + "gssdlc1 %[p1], 0x03(%[dst]) \n\t" + "gssdrc1 %[p1], -0x04(%[dst]) \n\t" + PTR_ADDU "%[dst], %[dst], %[stride] \n\t" + "gssdlc1 %[p0], 0x03(%[dst]) \n\t" + "gssdrc1 %[p0], -0x04(%[dst]) \n\t" + PTR_ADDU "%[dst], %[dst], %[stride] \n\t" + "gssdlc1 %[q0], 0x03(%[dst]) \n\t" + "gssdrc1 %[q0], -0x04(%[dst]) \n\t" + PTR_ADDU "%[dst], %[dst], %[stride] \n\t" + "gssdlc1 %[q1], 0x03(%[dst]) \n\t" + "gssdrc1 %[q1], -0x04(%[dst]) \n\t" + PTR_ADDU "%[dst], %[dst], %[stride] \n\t" + "gssdlc1 %[q2], 0x03(%[dst]) \n\t" + "gssdrc1 %[q2], -0x04(%[dst]) \n\t" + PTR_ADDU "%[dst], %[dst], %[stride] \n\t" + "gssdlc1 %[q3], 0x03(%[dst]) \n\t" + "gssdrc1 %[q3], -0x04(%[dst]) \n\t" + : [p3]"=&f"(ftmp[0]), [p2]"=&f"(ftmp[1]), + [p1]"=&f"(ftmp[2]), [p0]"=&f"(ftmp[3]), + [q0]"=&f"(ftmp[4]), [q1]"=&f"(ftmp[5]), + [q2]"=&f"(ftmp[6]), [q3]"=&f"(ftmp[7]), + [ftmp0]"=&f"(ftmp[8]), [ftmp1]"=&f"(ftmp[9]), + [ftmp2]"=&f"(ftmp[10]), [ftmp3]"=&f"(ftmp[11]), + [hev]"=&f"(ftmp[12]), [mask]"=&f"(ftmp[13]), + [ftmp4]"=&f"(ftmp[14]), [ftmp5]"=&f"(ftmp[15]), + [ftmp6]"=&f"(ftmp[16]), [ftmp7]"=&f"(ftmp[17]), + [dst]"+&r"(dst), [tmp0]"=&r"(tmp[0]), + RESTRICT_ASM_DOUBLE_1, RESTRICT_ASM_DOUBLE_2, + RESTRICT_ASM_UINT32_T + : [e]"r"((mips_reg)flim_E), [thresh]"r"((mips_reg)hev_thresh), + [i]"r"((mips_reg)flim_I), [stride]"r"((mips_reg)stride) + : "memory" + ); } static av_always_inline void vp8_h_loop_filter8_inner_mmi(uint8_t *dst, @@ -1083,29 +1426,16 @@ void ff_vp8_idct_dc_add4uv_mmi(uint8_t *dst, int16_t block[4][16], void ff_vp8_v_loop_filter16_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh) { - int i; - - for (i = 0; i < 16; i++) - if (vp8_normal_limit(dst + i * 1, stride, flim_E, flim_I)) { - if (hev(dst + i * 1, stride, hev_thresh)) - vp8_filter_common_is4tap(dst + i * 1, stride); - else - filter_mbedge(dst + i * 1, stride); - } + vp8_v_loop_filter8_mmi(dst, stride, flim_E, flim_I, hev_thresh); + vp8_v_loop_filter8_mmi(dst + 8, stride, flim_E, flim_I, hev_thresh); } void ff_vp8_h_loop_filter16_mmi(uint8_t *dst, ptrdiff_t stride, int flim_E, int flim_I, int hev_thresh) { - int i; - - for (i = 0; i < 16; i++) - if (vp8_normal_limit(dst + i * stride, 1, flim_E, flim_I)) { - if (hev(dst + i * stride, 1, hev_thresh)) - vp8_filter_common_is4tap(dst + i * stride, 1); - else - filter_mbedge(dst + i * stride, 1); - } + vp8_h_loop_filter8_mmi(dst, stride, flim_E, flim_I, hev_thresh); + vp8_h_loop_filter8_mmi(dst + 8 * stride, stride, flim_E, flim_I, + hev_thresh); } void ff_vp8_v_loop_filter8uv_mmi(uint8_t *dstU, uint8_t *dstV, ptrdiff_t stride, diff --git a/libavutil/mips/mmiutils.h b/libavutil/mips/mmiutils.h index 2b1a521..b16edc4 100644 --- a/libavutil/mips/mmiutils.h +++ b/libavutil/mips/mmiutils.h @@ -275,6 +275,34 @@ "punpcklwd "#m3", "#t2", "#t4" \n\t" \ "punpckhwd "#m4", "#t2", "#t4" \n\t" +/** + * brief: Parallel SRA for 8 byte packaged data. + * fr_i0: src + * fr_i1: SRA number(SRAB number + 8) + * fr_t0, fr_t1: temporary register + * fr_d0: dst + */ +#define PSRAB_MMI(fr_i0, fr_i1, fr_t0, fr_t1, fr_d0) \ + "punpcklbh "#fr_t0", "#fr_t0", "#fr_i0" \n\t" \ + "punpckhbh "#fr_t1", "#fr_t1", "#fr_i0" \n\t" \ + "psrah "#fr_t0", "#fr_t0", "#fr_i1" \n\t" \ + "psrah "#fr_t1", "#fr_t1", "#fr_i1" \n\t" \ + "packsshb "#fr_d0", "#fr_t0", "#fr_t1" \n\t" + +/** + * brief: Parallel SRL for 8 byte packaged data. + * fr_i0: src + * fr_i1: SRL number(SRLB number + 8) + * fr_t0, fr_t1: temporary register + * fr_d0: dst + */ +#define PSRLB_MMI(fr_i0, fr_i1, fr_t0, fr_t1, fr_d0) \ + "punpcklbh "#fr_t0", "#fr_t0", "#fr_i0" \n\t" \ + "punpckhbh "#fr_t1", "#fr_t1", "#fr_i0" \n\t" \ + "psrlh "#fr_t0", "#fr_t0", "#fr_i1" \n\t" \ + "psrlh "#fr_t1", "#fr_t1", "#fr_i1" \n\t" \ + "packsshb "#fr_d0", "#fr_t0", "#fr_t1" \n\t" + #define PSRAH_4_MMI(fp1, fp2, fp3, fp4, shift) \ "psrah "#fp1", "#fp1", "#shift" \n\t" \