From patchwork Wed Oct 26 21:15:35 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Henderson X-Patchwork-Id: 122032 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 5EF031007D2 for ; Thu, 27 Oct 2011 09:25:33 +1100 (EST) Received: from localhost ([::1]:41966 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJArR-0007JV-Ta for incoming@patchwork.ozlabs.org; Wed, 26 Oct 2011 17:18:09 -0400 Received: from eggs.gnu.org ([140.186.70.92]:46504) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJAqJ-0005iH-1B for qemu-devel@nongnu.org; Wed, 26 Oct 2011 17:17:01 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1RJAqG-0005FI-Fm for qemu-devel@nongnu.org; Wed, 26 Oct 2011 17:16:58 -0400 Received: from mail-wy0-f173.google.com ([74.125.82.173]:62059) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1RJAqG-000560-9F for qemu-devel@nongnu.org; Wed, 26 Oct 2011 17:16:56 -0400 Received: by mail-wy0-f173.google.com with SMTP id 15so2370708wyh.4 for ; Wed, 26 Oct 2011 14:16:56 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=sender:from:to:cc:subject:date:message-id:x-mailer:in-reply-to :references; bh=yvM+eq+argDs3SSy1dCGM0kglOuiqR8cjAR2Uo+dIbc=; b=DUcMuz/AVIu9dGwJjlTFxh7FEaiSWYm2q/6dBzNKytZ+/hGopCD2vMGJ63k5IHoGZR N33cPNtMzvaeVoXB+ACk0Ns9ePv1X9Pm9kOEe8T3HvQkkIY5RNaKInqqvE+r9KWR9ktv HYpeiKkVZJgwHhLNjzVi/7Qfwj+uUKloGY3CE= Received: by 10.216.170.71 with SMTP id o49mr1377176wel.107.1319663815942; Wed, 26 Oct 2011 14:16:55 -0700 (PDT) Received: from localhost.localdomain (c-98-203-235-125.hsd1.wa.comcast.net. [98.203.235.125]) by mx.google.com with ESMTPS id gd18sm5462382wbb.5.2011.10.26.14.16.53 (version=TLSv1/SSLv3 cipher=OTHER); Wed, 26 Oct 2011 14:16:55 -0700 (PDT) From: Richard Henderson To: qemu-devel@nongnu.org Date: Wed, 26 Oct 2011 14:15:35 -0700 Message-Id: <1319663736-7545-16-git-send-email-rth@twiddle.net> X-Mailer: git-send-email 1.7.6.4 In-Reply-To: <1319663736-7545-1-git-send-email-rth@twiddle.net> References: <1319663736-7545-1-git-send-email-rth@twiddle.net> X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) X-Received-From: 74.125.82.173 Cc: blauwirbel@gmail.com Subject: [Qemu-devel] [PATCH 15/16] target-sparc: Implement BMASK/BSHUFFLE. X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Signed-off-by: Richard Henderson --- target-sparc/helper.h | 1 + target-sparc/translate.c | 14 ++++++++++---- target-sparc/vis_helper.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 40 insertions(+), 4 deletions(-) diff --git a/target-sparc/helper.h b/target-sparc/helper.h index 73fb0ee..3ee12a9 100644 --- a/target-sparc/helper.h +++ b/target-sparc/helper.h @@ -140,6 +140,7 @@ DEF_HELPER_FLAGS_3(pdist, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64, i64) DEF_HELPER_FLAGS_2(fpack16, TCG_CALL_CONST | TCG_CALL_PURE, i32, i64, i64) DEF_HELPER_FLAGS_3(fpack32, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64, i64) DEF_HELPER_FLAGS_2(fpackfix, TCG_CALL_CONST | TCG_CALL_PURE, i32, i64, i64) +DEF_HELPER_FLAGS_3(bshuffle, TCG_CALL_CONST | TCG_CALL_PURE, i64, i64, i64, i64) #define VIS_HELPER(name) \ DEF_HELPER_FLAGS_2(f ## name ## 16, TCG_CALL_CONST | TCG_CALL_PURE, \ i64, i64, i64) \ diff --git a/target-sparc/translate.c b/target-sparc/translate.c index 685a907..50fc587 100644 --- a/target-sparc/translate.c +++ b/target-sparc/translate.c @@ -4192,8 +4192,13 @@ static void disas_sparc_insn(DisasContext * dc) gen_movl_TN_reg(rd, cpu_dst); break; case 0x019: /* VIS II bmask */ - // XXX - goto illegal_insn; + CHECK_FPU_FEATURE(dc, VIS2); + cpu_src1 = get_src1(insn, cpu_src1); + cpu_src2 = get_src1(insn, cpu_src2); + tcg_gen_add_tl(cpu_dst, cpu_src1, cpu_src2); + tcg_gen_deposit_tl(cpu_gsr, cpu_gsr, cpu_dst, 32, 32); + gen_movl_TN_reg(rd, cpu_dst); + break; case 0x020: /* VIS I fcmple16 */ CHECK_FPU_FEATURE(dc, VIS1); cpu_src1_64 = gen_load_fpr_D(dc, rs1); @@ -4314,8 +4319,9 @@ static void disas_sparc_insn(DisasContext * dc) gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fpmerge); break; case 0x04c: /* VIS II bshuffle */ - // XXX - goto illegal_insn; + CHECK_FPU_FEATURE(dc, VIS2); + gen_gsr_fop_DDD(dc, rd, rs1, rs2, gen_helper_bshuffle); + break; case 0x04d: /* VIS I fexpand */ CHECK_FPU_FEATURE(dc, VIS1); gen_ne_fop_DDD(dc, rd, rs1, rs2, gen_helper_fexpand); diff --git a/target-sparc/vis_helper.c b/target-sparc/vis_helper.c index 40adb47..7830120 100644 --- a/target-sparc/vis_helper.c +++ b/target-sparc/vis_helper.c @@ -470,3 +470,32 @@ uint32_t helper_fpackfix(uint64_t gsr, uint64_t rs2) return ret; } + +uint64 helper_bshuffle(uint64_t gsr, uint64_t src1, uint64_t src2) +{ + union { + uint64_t ll[2]; + uint8_t b[16]; + } s; + VIS64 r; + uint32_t i, mask, host; + + /* Set up S such that we can index across all of the bytes. */ +#ifdef HOST_WORDS_BIGENDIAN + s.ll[0] = src1; + s.ll[1] = src2; + host = 0; +#else + s.ll[1] = src1; + s.ll[0] = src2; + host = 15; +#endif + mask = gsr >> 32; + + for (i = 0; i < 8; ++i) { + unsigned e = (mask >> (28 - i*4)) & 0xf; + r.VIS_B64(i) = s.b[e ^ host]; + } + + return r.ll; +}