From patchwork Thu Sep 16 11:55:05 2010 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Johan Bengtsson X-Patchwork-Id: 64959 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [199.232.76.165]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 70A6C1007D2 for ; Thu, 16 Sep 2010 21:57:51 +1000 (EST) Received: from localhost ([127.0.0.1]:57603 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OwD63-00064l-2n for incoming@patchwork.ozlabs.org; Thu, 16 Sep 2010 07:57:47 -0400 Received: from [140.186.70.92] (port=33663 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1OwD5A-00061t-SS for qemu-devel@nongnu.org; Thu, 16 Sep 2010 07:56:56 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1OwD59-0002YO-OP for qemu-devel@nongnu.org; Thu, 16 Sep 2010 07:56:52 -0400 Received: from mail-ey0-f173.google.com ([209.85.215.173]:65334) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1OwD59-0002YJ-Jw for qemu-devel@nongnu.org; Thu, 16 Sep 2010 07:56:51 -0400 Received: by eyf18 with SMTP id 18so596216eyf.4 for ; Thu, 16 Sep 2010 04:56:50 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:received:received:from:to:cc:subject:date :message-id:x-mailer; bh=3uZ/suGhcsRYI5GeZo3ZZPHHbsXCBggz66TEmC2cAHs=; b=VlmaDtnnRht1QAgfMLUUsb95knufOahFYzpUMWpWqqmgOcYKSYBUpLalOt2E9quP9Q mm89LGDhc8dewztdOCdiV4w/drLPKrqqaAwnJlyDFePkLYowvZjzi0XUSFqA/FvMGeZL J9urLCtlJtnND8uu/eBhHZDvQxS6PnVD2elQw= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=from:to:cc:subject:date:message-id:x-mailer; b=qS75p4KCs55rruQWtDc60APS/i4d6rJdlRWxb94eMmJSA3eQEW1GPTQs/TtOF3L552 vJYFZ4Rdez+tlsub0Kbmi5N5dllcC/xg8dM1WxGjOJ9DRLEr4mm9O9ctDoMDFShhEBOt xG80AH/t481fwDYBIVA8YQkLP9mgMzATj0JRk= Received: by 10.213.108.194 with SMTP id g2mr5251948ebp.2.1284638210106; Thu, 16 Sep 2010 04:56:50 -0700 (PDT) Received: from localhost.localdomain (store.iar.se [213.136.49.54]) by mx.google.com with ESMTPS id a48sm3792876eei.7.2010.09.16.04.56.48 (version=TLSv1/SSLv3 cipher=RC4-MD5); Thu, 16 Sep 2010 04:56:48 -0700 (PDT) From: Johan Bengtsson To: qemu-devel@nongnu.org Date: Thu, 16 Sep 2010 13:55:05 +0200 Message-Id: <1284638106-6751-1-git-send-email-teofrastius@gmail.com> X-Mailer: git-send-email 1.7.0.4 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.6 (newer, 2) Cc: Johan Bengtsson Subject: [Qemu-devel] [PATCH 1/2] target-arm: Add support for PKHxx in thumb2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org The PKHxx instructions were not recognized by the thumb2 decoder. The solution provided in this changeset is identical to the arm-mode implementation. Signed-off-by: Johan Bengtsson --- target-arm/translate.c | 63 ++++++++++++++++++++++++++++++++++------------- 1 files changed, 45 insertions(+), 18 deletions(-) diff --git a/target-arm/translate.c b/target-arm/translate.c index 6fcdd7e..f39efc5 100644 --- a/target-arm/translate.c +++ b/target-arm/translate.c @@ -7601,27 +7601,54 @@ static int disas_thumb2_insn(CPUState *env, DisasContext *s, uint16_t insn_hw1) } } break; - case 5: /* Data processing register constant shift. */ - if (rn == 15) { - tmp = new_tmp(); - tcg_gen_movi_i32(tmp, 0); - } else { - tmp = load_reg(s, rn); - } - tmp2 = load_reg(s, rm); + case 5: + op = (insn >> 21) & 0xf; - shiftop = (insn >> 4) & 3; - shift = ((insn >> 6) & 3) | ((insn >> 10) & 0x1c); - conds = (insn & (1 << 20)) != 0; - logic_cc = (conds && thumb2_logic_op(op)); - gen_arm_shift_im(tmp2, shiftop, shift, logic_cc); - if (gen_thumb2_data_op(s, op, conds, 0, tmp, tmp2)) - goto illegal_op; - dead_tmp(tmp2); - if (rd != 15) { + if (op == 6) { + /* Halfword pack. */ + tmp = load_reg(s, rn); + tmp2 = load_reg(s, rm); + shift = ((insn >> 10) & 0x1c) | ((insn >> 6) & 0x3); + if (insn & (1 << 5)) { + /* pkhtb */ + if (shift == 0) + shift = 31; + tcg_gen_sari_i32(tmp2, tmp2, shift); + tcg_gen_andi_i32(tmp, tmp, 0xffff0000); + tcg_gen_ext16u_i32(tmp2, tmp2); + } else { + /* pkhbt */ + if (shift) + tcg_gen_shli_i32(tmp2, tmp2, shift); + tcg_gen_ext16u_i32(tmp, tmp); + tcg_gen_andi_i32(tmp2, tmp2, 0xffff0000); + } + tcg_gen_or_i32(tmp, tmp, tmp2); + dead_tmp(tmp2); store_reg(s, rd, tmp); } else { - dead_tmp(tmp); + /* Data processing register constant shift. */ + if (rn == 15) { + tmp = new_tmp(); + tcg_gen_movi_i32(tmp, 0); + } else { + tmp = load_reg(s, rn); + } + tmp2 = load_reg(s, rm); + + shiftop = (insn >> 4) & 3; + shift = ((insn >> 6) & 3) | ((insn >> 10) & 0x1c); + conds = (insn & (1 << 20)) != 0; + logic_cc = (conds && thumb2_logic_op(op)); + gen_arm_shift_im(tmp2, shiftop, shift, logic_cc); + if (gen_thumb2_data_op(s, op, conds, 0, tmp, tmp2)) + goto illegal_op; + dead_tmp(tmp2); + if (rd != 15) { + store_reg(s, rd, tmp); + } else { + dead_tmp(tmp); + } } break; case 13: /* Misc data processing. */